Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Для приложения, установленного через бета-версию 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 также является именем файла квитанции при запуске сборки локально и для сборки выполняется в симуляторе.

Ответ 2

На основе комбинаторного ответа я создал следующий вспомогательный класс SWIFT. С помощью этого класса вы можете определить, есть ли отладка, 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
    }
  }
}

Мы используем эти методы в нашем проекте для предоставления различных строк отслеживания id или для каждой среды:

  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 DEBUG, является установка некоторых пользовательских флагов Swift Compiler. Дополнительная информация в этом ответе: fooobar.com/questions/14636/...

Ответ 3

Современная версия Swift, учитывающая симуляторы (на основе принятого ответа):

private func isSimulatorOrTestFlight() -> Bool {
    guard let path = Bundle.main.appStoreReceiptURL?.path else {
        return false
    }
    return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}

Ответ 5

Есть один способ использовать его для моих проектов. Вот шаги.

В Xcode перейдите к настройкам проекта (проект, а не цели) и добавьте в список конфигурацию "бета":

введите описание изображения здесь



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

введите описание изображения здесь



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

введите описание изображения здесь



Выберите вкладку "Архив", в которой вы можете выбрать 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
}