実行時に、アプリケーションがTestFlightベータ版(iTunes Connect経由で送信)とApp Storeでインストールされたことを検出することはできますか?単一のアプリバンドルを送信して、両方から利用できるようにすることができます。インストールされた方法を検出できるAPIはありますか?または、領収書にはこれを判断できる情報が含まれていますか?
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
は、ビルドをローカルで実行するときおよびビルドをシミュレーターで実行するときのレシートファイルの名前でもあることに注意してください。
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
モダンSwiftバージョン、シミュレーターの説明(受け入れられた回答に基づく):
private func isSimulatorOrTestFlight() -> Bool {
guard let path = Bundle.main.appStoreReceiptURL?.path else {
return false
}
return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}
これはもう機能しません。他の方法を使用してください。
これも機能します:
if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
// TestFlight
} else {
// App Store (and Apple reviewers too)
}