web-dev-qa-db-ja.com

実行時にiOSアプリがTestFlight Betaインストールを実行しているかどうかを確認する方法

実行時に、アプリケーションがTestFlightベータ版(iTunes Connect経由で送信)とApp Storeでインストールされたことを検出することはできますか?単一のアプリバンドルを送信して、両方から利用できるようにすることができます。インストールされた方法を検出できるAPIはありますか?または、領収書にはこれを判断できる情報が含まれていますか?

101
combinatorial

TestFlight Betaを介してインストールされたアプリケーションの場合、レシートファイルの名前はStoreKit\sandboxReceiptと通常のStoreKit\receiptです。 [NSBundle appStoreReceiptURL]を使用すると、URLの最後でsandboxReceiptを検索できます。

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

sandboxReceiptは、ビルドをローカルで実行するときおよびビルドをシミュレーターで実行するときのレシートファイルの名前でもあることに注意してください。

104
combinatorial

combinatorial's answer に基づいて、次の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 = 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
    }
  }
}

プロジェクトでこれらのメソッドを使用して、異なるトラッキングIDまたは接続文字列環境ごと:

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

または:

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

UPDATE 05-02-2016:#if DEBUGのようなプリプロセッサマクロを使用するための前提条件は、いくつかのSwiftコンパイラのカスタムフラグ:この回答の詳細: https://stackoverflow.com/a/24112024/639227

54

モダンSwiftバージョン、シミュレーターの説明(受け入れられた回答に基づく):

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

更新

これはもう機能しません。他の方法を使用してください。

元の答え

これも機能します:

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

iOSアプリがAppleのTestflightからダウンロードされたかどうかを検出

5
Marián Černý