Проверьте, работает ли приложение 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"

Этот полный ответ более подробно описывает, как вы могли его использовать.