leyes - Cómo saber en tiempo de ejecución si una aplicación de iOS se está ejecutando a través de una instalación de TestFlight Beta
testflight falta documentación sobre el cumplimiento de las leyes de exportación (5)
Actualizar
Esto ya no funciona. Usa otro método.
Respuesta original
Esto también funciona:
if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
// TestFlight
} else {
// App Store (and Apple reviewers too)
}
Se encuentra en Detectar si la aplicación de iOS se descarga desde Testflight de Apple
¿Es posible detectar en tiempo de ejecución que una aplicación se ha instalado a través de TestFlight Beta (enviado a través de iTunes Connect) vs App Store? Puede enviar un único paquete de aplicaciones y tenerlo disponible a través de ambos. ¿Existe una API que pueda detectar de qué manera se instaló? ¿O el recibo contiene información que permite determinar esto?
Basado en la respuesta combinatoria, creé la siguiente clase de ayuda SWIFT. Con esta clase, puede determinar si se trata de una depuración, prueba de vuelo o compilación de la tienda de aplicaciones.
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
}
}
}
Utilizamos estos métodos en nuestro proyecto para proporcionar diferentes identificadores de seguimiento o cadenas de conexión por entorno:
func getURL(path: String) -> String {
switch (Config.appConfiguration) {
case .Debug:
return host + "://" + debugBaseUrl + path
default:
return host + "://" + baseUrl + path
}
}
O:
static var trackingKey: String {
switch (Config.appConfiguration) {
case .Debug:
return debugKey
case .TestFlight:
return testflightKey
default:
return appstoreKey
}
}
ACTUALIZACIÓN 05-02-2016: Un requisito previo para usar una macro de preprocesador como #if DEBUG es establecer algunos indicadores personalizados del compilador Swift. Más información en esta respuesta: https://.com/a/24112024/639227
Hay una forma en que lo uso para mis proyectos. Aquí están los pasos.
En Xcode, vaya a la configuración del proyecto (proyecto, no objetivo) y agregue la configuración "beta" a la lista:
Luego debe crear un nuevo esquema que ejecute el proyecto en la configuración "beta".
Para crear un esquema, vaya aquí:
Nombra este esquema como quieras.
Debería editar la configuración para este esquema.
Para hacer esto, toque aquí:
Seleccione la pestaña Archivo donde puede seleccionar
Build configuration
Luego debe agregar una
Config
clave con el valor
$(CONFIGURATION)
la lista de propiedades de información del proyecto de esta manera:
Entonces es justo lo que necesita en el código para hacer algo específico para la compilación beta:
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
}
Para una aplicación instalada a través de TestFlight Beta, el archivo de recibo se denomina
StoreKit/sandboxReceipt
frente al
StoreKit/receipt
habitual.
Usando
[NSBundle appStoreReceiptURL]
puede buscar sandboxReceipt al final de la URL.
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSString *receiptURLString = [receiptURL path];
BOOL isRunningTestFlightBeta = ([receiptURLString rangeOfString:@"sandboxReceipt"].location != NSNotFound);
Tenga en cuenta que
sandboxReceipt
también es el nombre del archivo de recibo al ejecutar compilaciones localmente y para compilaciones ejecutadas en el simulador.
Versión moderna de Swift, que representa los simuladores (según la respuesta aceptada):
private func isSimulatorOrTestFlight() -> Bool {
guard let path = Bundle.main.appStoreReceiptURL?.path else {
return false
}
return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}