Est-il possible de détecter lors de l'exécution qu'une application a été installée via TestFlight Beta (soumise via iTunes Connect) par rapport à l'App Store? Vous pouvez soumettre un seul ensemble d'applications et le rendre disponible via les deux. Existe-t-il une API qui peut détecter de quelle manière il a été installé? Ou le reçu contient-il des informations permettant de le déterminer?
Pour une application installée via TestFlight Beta, le fichier de réception est nommé StoreKit\sandboxReceipt
vs l'habituel StoreKit\receipt
. En utilisant [NSBundle appStoreReceiptURL]
vous pouvez rechercher sandboxReceipt à la fin de l'URL.
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSString *receiptURLString = [receiptURL path];
BOOL isRunningTestFlightBeta = ([receiptURLString rangeOfString:@"sandboxReceipt"].location != NSNotFound);
Notez que sandboxReceipt
est également le nom du fichier de réception lors de l'exécution de builds localement et pour les builds exécutées dans le simulateur.
Basé sur réponse combinatoire J'ai créé la classe d'assistance Swift. Avec cette classe, vous pouvez déterminer s'il s'agit d'une version de débogage, de testflight ou d'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
}
}
}
Nous utilisons ces méthodes dans notre projet pour fournir différents identifiants de suivi ou chaîne de connexion par environnement:
func getURL(path: String) -> String {
switch (Config.appConfiguration) {
case .Debug:
return Host + "://" + debugBaseUrl + path
default:
return Host + "://" + baseUrl + path
}
}
OU:
static var trackingKey: String {
switch (Config.appConfiguration) {
case .Debug:
return debugKey
case .TestFlight:
return testflightKey
default:
return appstoreKey
}
}
MISE À JOUR 05-02-2016: Une condition préalable pour utiliser une macro de préprocesseur comme #if DEBUG est de définir certains Swift Indicateurs personnalisés du compilateur. Plus d'informations dans cette réponse: https://stackoverflow.com/a/24112024/639227
Modern Swift version, qui tient compte des simulateurs (basé sur la réponse acceptée):
private func isSimulatorOrTestFlight() -> Bool {
guard let path = Bundle.main.appStoreReceiptURL?.path else {
return false
}
return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}
Cela ne fonctionne plus. Utilisez une autre méthode.
Cela fonctionne également:
if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
// TestFlight
} else {
// App Store (and Apple reviewers too)
}
Trouvé dans Détecter si l'application iOS est téléchargée depuis le testflight d'Apple