webentwicklung-frage-antwort-db.com.de

Feststellen, ob eine iOS-App während einer TestFlight-Beta-Installation ausgeführt wird

Kann zur Laufzeit festgestellt werden, dass eine Anwendung über TestFlight Beta (gesendet über iTunes Connect) im Vergleich zum App Store installiert wurde? Sie können ein einzelnes App-Bundle einreichen und über beide zur Verfügung stellen. Gibt es eine API, die erkennen kann, auf welche Weise sie installiert wurde? Oder enthält die Quittung Informationen, mit denen dies festgestellt werden kann?

101
combinatorial

Bei einer Anwendung, die über TestFlight Beta installiert wurde, heißt die Quittungsdatei StoreKit\sandboxReceipt gegen das übliche StoreKit\receipt. Mit [NSBundle appStoreReceiptURL] Sie können am Ende der URL nach sandboxReceipt suchen.

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSString *receiptURLString = [receiptURL path];
BOOL isRunningTestFlightBeta =  ([receiptURLString rangeOfString:@"sandboxReceipt"].location != NSNotFound);

Beachten Sie, dass sandboxReceipt auch der Name der Belegdatei ist, wenn Builds lokal ausgeführt werden und Builds im Simulator ausgeführt werden.

104
combinatorial

Basierend auf Antwort von combinatorial habe ich die folgende Swift Helferklasse erstellt. Mit dieser Klasse können Sie feststellen, ob es sich um einen Debug-, Testflug- oder Appstore-Build handelt.

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
    }
  }
}

Wir verwenden diese Methoden in unserem Projekt, um verschiedene Tracking-IDs oder Verbindungszeichenfolgen pro Umgebung:

  func getURL(path: String) -> String {    
    switch (Config.appConfiguration) {
    case .Debug:
      return Host + "://" + debugBaseUrl + path
    default:
      return Host + "://" + baseUrl + path
    }
  }

ODER:

  static var trackingKey: String {
    switch (Config.appConfiguration) {
    case .Debug:
      return debugKey
    case .TestFlight:
      return testflightKey
    default:
      return appstoreKey
    }
  }

UPDATE 05-02-2016: Voraussetzung für die Verwendung eines Präprozessor-Makros wie #if DEBUG ist das Setzen von Swift Compiler Custom Flags. Weitere Informationen in dieser Antwort: https://stackoverflow.com/a/24112024/639227

54

Moderne Swift Version, die Simulatoren berücksichtigt (basierend auf der akzeptierten Antwort):

private func isSimulatorOrTestFlight() -> Bool {
    guard let path = Bundle.main.appStoreReceiptURL?.path else {
        return false
    }
    return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}
25

Aktualisieren

Das geht nicht mehr. Verwenden Sie eine andere Methode.

Ursprüngliche Antwort

Das funktioniert auch:

if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
    // TestFlight
} else {
    // App Store (and Apple reviewers too)
}

Gefunden in Ermitteln, ob iOS-App von Apples Testflight heruntergeladen wurde

5
Marián Černý