2012-03-28 1 views
11

Возможно ли как-то кодировать, как показано ниже, в приложении 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

Зачем вам это нужно? Вы можете использовать макросы препроцессора, чтобы различать сборку отладки и выпуска, но команда Apple Review должна использовать то же приложение, что и клиенты без изменений. Вы можете использовать серверный тест IP-адресов, чтобы убедиться, что вы не выставили счета рецензентам за загруженный контент или что-то еще, но не пытайтесь обмануть их. –

+0

У меня уже есть макросы, чтобы отличать отладочные и выпускные сборки. Но это не то, что я хочу. Мы используем testflight для отправки наших приложений клиентам и тестировщикам. Проблема в том, что при загрузке любого контента мы не хотим отслеживать это, потому что они не являются фактическими пользователями.Одно из решений (теоретически), о которых я думал, заключается в принятии решений на основе профиля предоставления Ad-Hoc/Developer или «Distribution», используемого в коде. Как, мне нужно выяснить. Другой проблемой является контент, загруженный Apple в рамках обзора. Как я могу это обнаружить? – msk

+0

Вы можете добавить параметр для запросов на ваш сервер, когда это сборка AdHoc, и проверить этот параметр на сервере. Когда Apple тестирует приложение, вы можете определить IP-адрес своего сервера. –

ответ

8

Вы можете определить, было ли ваше приложение распространено через магазин приложений, проверив отсутствие встроенного.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 
} 

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

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

+1

Будет ли это отличаться от тестировщиков Apple? Используют ли они свой собственный MobileProvision для загрузки приложений для тестирования или у них есть специальный способ их загрузки? – xdumaine

+0

Хороший вопрос. Я не знаю ответа. У меня был код, который использует этот метод, одобренный Apple, и как часть HockeyApp SDK он, вероятно, довольно широко развернут. Поэтому, если вам интересно только, если это вас отбросит, похоже, что этого не произойдет. За гранью этого…? –

+2

Хорошо, теперь у меня довольно сильное (хотя и неопровержимое) доказательство того, что команда Apple App Review будет следовать пути «не из магазина приложений» в этом коде. –

1

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

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

Если это не ваша цель, ну, не обращайте внимания! : -)

+0

Можете ли вы уточнить, что вы просите у Apple? Что вы подразумеваете под словом «test»? Как кто-то установил/сбросил его? – msk

+0

На моем сервере у меня есть структура пользовательских данных, она содержит такие вещи, как «Логин», «Пароль», «Электронная почта». Он также имеет логическое имя «test». Если это логическое значение включено, то мое приложение ведет себя по-разному. Я установил его через API на свой сервер. Когда я отправлюсь в магазин Apple, мне придется работать с ними, чтобы убедиться, что тестовый бит включен. –

+0

Ahhh, я вижу ваш комментарий выше. Да, у вас может быть специальная учетная запись для пользователей TestFlight и Apple. Он не отвечает на ваш вопрос, но он решит вашу проблему. –

3

КСН 7 и позже, вы также можете быть в состоянии проверить:

if ([NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL] != nil) { 
    // Downloaded from App Store 
} else { 
    // Not downloaded from App Store 
} 
+0

Будет ли работать и для бесплатных приложений? Я думаю, что [NSBundle mainBundle] .appStoreReceiptURL будет в этом случае нулевым, верно? – msk

+0

Я не тестировал это (время инвестиций, чтобы добавить это в приложение, получить его одобрение, и как-то извлечь данные довольно значительны). Но, как я понимаю, бесплатное приложение считается «покупкой», а именно тем, что происходит с нулевой стоимостью для потребителя. –

0

Swift

func isAppStoreBuild() -> Bool { 

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

Это больше не работает с 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 
} 
0

Для Swift версии:

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

This complete answer объясняет более подробно о том, как вы могли бы использовать его.

 Смежные вопросы

  • Нет связанных вопросов^_^