Проверьте, работает ли приложение iOS в магазине приложений.
Возможно ли как-то кодировать, как показано ниже, в приложении iOS?
if(app is live in app store)
{
//Do something
}
else
{
//Do other thing
}
Я хотел избегать случаев, когда наша команда QE/Dev использует приложение для тестирования. Есть ли способ определить, как подписан код приложения (Developer/Adhoc/Distribution) для проверки? Даже если это возможно, это не устранит случаи, когда Apple использует наше приложение для тестирования в рамках обзора. Мы записали много загрузок нашего контента Apple до того, как наше приложение заработало в магазине App Store.
Ответы
Ответ 1
Вы можете определить, было ли ваше приложение распространено через магазин приложений, проверяя отсутствие встроенного .mobileprovision. Этот файл включен только в сборки adhoc.
Вот так:
if ([[NSBundle mainBundle] pathForResource:@"embedded"
ofType:@"mobileprovision"]) {
// not from app store (Apple reviewers seem to hit this path)
} else {
// from app store
}
Этот метод из HockeyApp SDK. У меня лично есть приложения в магазине, которые используют эту технику, и, конечно, есть много распространенных приложений, включая HockeyApp SDK.
Основываясь на немедленном сбое, я случайно выпущен в определенной сборке моего приложения в пути "из магазина приложений", команда Apple будет следовать по пути "не из магазина приложений". Пусть моя потеря будет вашей выгодой для этого.:)
Ответ 2
На iOS 7 и более поздних версиях вы также можете проверить:
if ([NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL] != nil) {
// Downloaded from App Store
} else {
// Not downloaded from App Store
}
Ответ 3
Это больше не работает с XCode 7,
Я бы предложил использовать новый обходной механизм HockeyApp https://github.com/bitstadium/HockeySDK-iOS/blob/6b727733a5a93847b4a7ff8a734692dbe4e3a979/Classes/BITHockeyHelper.m
Вот упрощенная версия:
+ (BOOL)isAppStoreBuild
{
#ifdef DEBUG
return NO;
#else
return ([UIApplication isTestFlightBuild] == NO);
#endif
}
+ (BOOL)isTestFlightBuild
{
#ifdef DEBUG
return NO;
#else
NSURL *appStoreReceiptURL = NSBundle.mainBundle.appStoreReceiptURL;
NSString *appStoreReceiptLastComponent = appStoreReceiptURL.lastPathComponent;
BOOL isSandboxReceipt = [appStoreReceiptLastComponent isEqualToString:@"sandboxReceipt"];
return isSandboxReceipt;
#endif
}
Ответ 4
Я столкнулся с аналогичной ситуацией в своем приложении. По крайней мере, я думаю, что сделал, я не уверен, что полностью понимаю ваш вопрос.
В моем приложении у меня есть пользователи со счетами, создающими контент. Я не хочу, чтобы контент разработчика (или контент сотрудников Apple) не загрязнял публичный контент. У меня есть "тестовый" бит в структуре пользовательских данных, которая включена, и тестовое содержимое не отображается публике. Я еще не отправился в App Store, но мне нужно будет работать с Apple, чтобы убедиться, что их учетные записи включили этот тестовый бит.
Если это не твоя цель, ну, тогда неважно!: -)
Ответ 5
Свифта
func isAppStoreBuild() -> Bool {
if NSBundle.mainBundle().appStoreReceiptURL != nil {
if let _ = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
return true
}
}
return false
}
Ответ 6
Для версии Swift:
private static let isTestFlight = NSBundle.mainBundle().appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"
Этот полный ответ более подробно описывает, как вы могли его использовать.