web-dev-qa-db-fra.com

Comment savoir à l'exécution si une application iOS s'exécute via une installation TestFlight Beta

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?

101
combinatorial

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.

104
combinatorial

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

54
LorenzoValentijn

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")
}
25
Serhii Yakovenko

Mise à jour

Cela ne fonctionne plus. Utilisez une autre méthode.

Réponse originale

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

5
Marián Černý