Как определить во время выполнения, выполняется ли приложение iOS через бета-версию TestFlight


можно ли обнаружить во время выполнения, что приложение было установлено через бета-версию TestFlight (отправлено через iTunes Connect) против App Store? Вы можете отправить один пакет приложений и иметь его доступным через оба. Есть ли API, который может определить, каким образом он был установлен? Или квитанция содержит информацию, которая позволяет это определить?

5 78

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" в список:

enter image description here



Затем нужно создать новую схему, которая будет запускать проект в" бета " конфигурации. Для создания схемы перейдите сюда:

enter image description here



Назовите эту схему как угодно хотеть. Вы должны изменить настройки для этой схемы. Для этого нажмите здесь:

enter image description here



Выберите вкладку архив, где вы можете выбрать Build configuration

enter image description here



тогда вам нужно добавить ключ Config со значением $(CONFIGURATION) список свойств информация о проектах выглядит следующим образом:

enter image description here



Тогда его просто дело в том, что вам нужно в коде, чтобы сделать что-то конкретное для бета-сборки:

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
}