Проверьте, работает ли приложение iOS в магазине приложений. - PullRequest
15 голосов
/ 28 марта 2012

Можно ли как-то кодировать, как показано ниже, в приложении для iOS?

if(app is live in app store)
{
   //Do something
}
else
{
  //Do other thing
}

Я хотел избежать случаев, когда наша команда QE / Dev использует приложение для тестирования.Есть ли способ определить, как подписывается код приложения (Developer / Adhoc / Distribution), чтобы проверить?Даже если это возможно, это не устранит случаи, когда Apple использует наше приложение для тестирования в рамках проверки.Мы записали множество загрузок нашего контента Apple, прежде чем наше приложение появилось в App Store.

Ответы [ 6 ]

9 голосов
/ 18 декабря 2012

Вы можете определить, распространялось ли ваше приложение через магазин приложений, проверив отсутствие встроенного.mobileprovision. Этот файл включен только в сборки adhoc.

Как это:

if ([[NSBundle mainBundle] pathForResource:@"embedded"
                                    ofType:@"mobileprovision"]) {
  // not from app store (Apple's reviewers seem to hit this path)
} else {
  // from app store
}

Этот метод относится к HockeyApp SDK . У меня лично в магазине есть приложения, использующие эту технику, и, конечно, есть много распространенных приложений, в том числе HockeyApp SDK.

На основании немедленного сбоя, который я случайно выпустил в конкретной сборке моего приложения по пути «из магазина приложений», команда Apple будет следовать пути «не из магазина приложений». Пусть моя потеря будет вашей прибылью на этом. :)

4 голосов
/ 27 августа 2015

В iOS 7 и более поздних версиях вы также можете проверить:

if ([NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL] != nil) {
    // Downloaded from App Store
} else {
    // Not downloaded from App Store
}
3 голосов
/ 12 октября 2015

Это больше не работает с 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
}
1 голос
/ 28 марта 2012

Я столкнулся с похожей ситуацией в моем приложении.По крайней мере, я так думаю, я не уверен, что полностью понимаю ваш вопрос.

В моем приложении есть пользователи с аккаунтами, которые создают контент.Я не хочу, чтобы контент для разработчиков (или контент для сотрудников Apple) загрязнял общедоступный контент.У меня есть бит "test" в структуре пользовательских данных, который включается, и тестовый контент не виден широкой публике.Я еще не зарегистрировался в App Store, но мне нужно поработать с Apple, чтобы убедиться, что в их учетных записях включен этот тестовый бит.затем!: -)

0 голосов
/ 21 ноября 2015

Для версии Swift:

private static let isTestFlight = NSBundle.mainBundle().appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"

В этом полном ответе более подробно объясняется, как вы можете его использовать.

0 голосов
/ 28 сентября 2015

Свифт

func isAppStoreBuild() -> Bool {

    if NSBundle.mainBundle().appStoreReceiptURL != nil {
        if let _ = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
            return true
        }
    }
    return false
}
...