Можно ли во время выполнения обнаружить, что приложение было установлено через бета-версию TestFlight (отправлено через iTunes Connect) и в App Store? Вы можете отправить один комплект приложений и получить его через оба. Есть ли API, который может определить, каким образом он был установлен? Или в квитанции содержится информация, которая позволяет это определить?
Как сказать во время выполнения, работает ли приложение iOS с помощью тестовой установки TestFlight
Ответ 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")
}
Ответ 4
Это также работает:
if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
// TestFlight
} else {
// App Store (and Apple reviewers too)
}
Найден в Обнаруживает, загружается ли приложение iOS из Testflight от Apple
Ответ 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
}