Можно ли во время выполнения обнаружить, что приложение было установлено через TestFlight Beta (отправленное через iTunes Connect), а не через App Store? Вы можете отправить один комплект приложений и сделать его доступным через оба. Есть ли API, который может определить, каким образом он был установлен? Или квитанция содержит информацию, позволяющую это определить?
Как узнать во время выполнения, работает ли приложение iOS через установку TestFlight Beta
Ответы (6)
Для приложения, установленного с помощью TestFlight Beta, файл квитанции называется 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
также является именем файла квитанции при выполнении сборок локально и для сборок, запускаемых в симуляторе.
[[[[NSBundle mainBundle] appStoreReceiptURL] lastPathComponent] isEqualToString:@"sandboxReceipt"]
(Верно, если запущен распределенный двоичный файл TestFlight) через Supertop / Haddad
- person Nick; 02.02.2015
StoreKit/sandboxReceipt
при установке в качестве отладочной сборки через Xcode на устройстве или симуляторе. Таким образом, это может неточно отличать сборки testflight от всех других сборок.
- person pkamb; 27.08.2015
На основе комбинаторного ответа я создал следующий вспомогательный класс SWIFT. С помощью этого класса вы можете определить, является ли это отладкой, тестовой сборкой или сборкой магазина приложений.
enum AppConfiguration {
case Debug
case TestFlight
case AppStore
}
struct Config {
// This is private because the use of 'appConfiguration' is preferred.
private static let isTestFlight = Bundle.main.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
}
}
OR:
static var trackingKey: String {
switch (Config.appConfiguration) {
case .Debug:
return debugKey
case .TestFlight:
return testflightKey
default:
return appstoreKey
}
}
ОБНОВЛЕНИЕ 05-02-2016. Предварительным условием для использования макроса препроцессора, такого как #if DEBUG, является установка некоторых настраиваемых флагов компилятора Swift. Дополнительная информация в этом ответе: https://stackoverflow.com/a/24112024/639227
-D DEBUG
. Дополнительную информацию можно найти здесь.
- person Caleb; 03.02.2016
#if targetEnvironment(simulator)
вы определяете, работаете ли вы в симуляторе. Итак, у меня есть варианты Simulator / TestFlight / AppStore (которые в моем случае предпочтительнее Debug
) :-)
- person Jeroen; 03.12.2019
Современная версия Swift, которая учитывает симуляторы (на основе принятого ответа):
private func isSimulatorOrTestFlight() -> Bool {
guard let path = Bundle.main.appStoreReceiptURL?.path else {
return false
}
return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}
isTestFlight()
- person dbn; 05.10.2019
Я использую расширение Bundle+isProduction
в Swift 5.2:
import Foundation
extension Bundle {
var isProduction: Bool {
#if DEBUG
return false
#else
guard let path = self.appStoreReceiptURL?.path else {
return true
}
return !path.contains("sandboxReceipt")
#endif
}
}
Потом:
if Bundle.main.isProduction {
// do something
}
Обновлять
Это больше не работает. Воспользуйтесь другим методом.
Оригинальный ответ
Это тоже работает:
if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
// TestFlight
} else {
// App Store (and Apple reviewers too)
}
Найдено в Определить, загружено ли приложение iOS из Apple Testflight
Есть один способ, которым я использую его в своих проектах. Вот шаги.
В 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
}