Как определить во время выполнения, выполняется ли приложение iOS через бета-версию TestFlight
можно ли обнаружить во время выполнения, что приложение было установлено через бета-версию TestFlight (отправлено через iTunes Connect) против App Store? Вы можете отправить один пакет приложений и иметь его доступным через оба. Есть ли API, который может определить, каким образом он был установлен? Или квитанция содержит информацию, которая позволяет это определить?
5 ответов:
для приложения, установленного через использовать TestFlight бета-тестирования файл квитанция по имени
StoreKit\sandboxReceipt
против обычныхStoreKit\receipt
. Используя[NSBundle appStoreReceiptURL]
вы можете искать sandboxReceipt в конце URL-адреса.NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSString *receiptURLString = [receiptURL path]; BOOL isRunningTestFlightBeta = ([receiptURLString rangeOfString:@"sandboxReceipt"].location != NSNotFound);
отметим, что
sandboxReceipt
также имя файла получения при запуске сборки локально и для сборки выполняется в симуляторе.
на основе комбинаторный ответ Я создал следующий быстрый вспомогательный класс. С помощью этого класса вы можете определить, является ли он сборкой debug, testflight или appstore.
enum AppConfiguration { case Debug case TestFlight case AppStore } struct Config { // This is private because the use of 'appConfiguration' is preferred. private static let isTestFlight = NSBundle.mainBundle().appStoreReceiptURL?.lastPathComponent == "sandboxReceipt" // This can be used to add debug statements. static var isDebug: Bool { #if DEBUG return true #else return false #endif } static var appConfiguration: AppConfiguration { if isDebug { return .Debug } else if isTestFlight { return .TestFlight } else { return .AppStore } } }
мы используем эти методы в нашем проекте для того чтобы поставить различное идентификатор отслеживания или строку подключения в среду:
func getURL(path: String) -> String { switch (Config.appConfiguration) { case .Debug: return host + "://" + debugBaseUrl + path default: return host + "://" + baseUrl + path } }
или:
static var trackingKey: String { switch (Config.appConfiguration) { case .Debug: return debugKey case .TestFlight: return testflightKey default: return appstoreKey } }
обновление 05-02-2016: Обязательное условие для использования макроса препроцессора, например #if Отладка заключается в установке некоторых пользовательских флагов компилятора Swift. Более подробная информация в этом ответе:https://stackoverflow.com/a/24112024/639227
современная версия Swift, которая учитывает симуляторы (на основе принятого ответа):
private func isSimulatorOrTestFlight() -> Bool { guard let path = Bundle.main.appStoreReceiptURL?.path else { return false } return path.contains("CoreSimulator") || path.contains("sandboxReceipt") }
Это также работает:
if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil { // TestFlight } else { // App Store (and Apple reviewers too) }
нашли в определите, загружено ли приложение iOS из Testflight от Apple
есть один способ, которым я использую его для своих проектов. Вот эти шаги.
в Xcode перейдите в настройки проекта (project, а не target) и добавьте конфигурацию "beta" в список:
Затем нужно создать новую схему, которая будет запускать проект в" бета " конфигурации. Для создания схемы перейдите сюда:
Назовите эту схему как угодно хотеть. Вы должны изменить настройки для этой схемы. Для этого нажмите здесь:
Выберите вкладку архив, где вы можете выбратьBuild configuration
тогда вам нужно добавить ключ
Config
со значением$(CONFIGURATION)
список свойств информация о проектах выглядит следующим образом:
Тогда его просто дело в том, что вам нужно в коде, чтобы сделать что-то конкретное для бета-сборки:let config = Bundle.main.object(forInfoDictionaryKey: "Config") as! String if config == "Debug" { // app running in debug configuration } else if config == "Release" { // app running in release configuration } else if config == "Beta" { // app running in beta configuration }