App StoreとTestFlight Beta(iTunes Connect経由で送信)でアプリケーションがインストールされたことを実行時に検出できますか?単一のApp Bundleを送信して、両方から利用できるようにすることができます。インストールされた方法を検出できるAPIはありますか?または、レシートにこれを判断できる情報が含まれていますか?
App StoreとTestFlight Beta(iTunes Connect経由で送信)でアプリケーションがインストールされたことを実行時に検出できますか?単一のApp Bundleを送信して、両方から利用できるようにすることができます。インストールされた方法を検出できる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
ビルドをローカルで実行するとき、およびビルドをシミュレーターで実行するときのレシートファイルの名前にも注意してください。
[[[[NSBundle mainBundle] appStoreReceiptURL] lastPathComponent] isEqualToString:@"sandboxReceipt"]
(TestFlight分散バイナリを実行している場合は真)Supertop / Haddad
StoreKit/sandboxReceipt
、デバイスまたはシミュレーターのXcodeを介してデバッグビルドとしてインストールすると、したがって、これはtestflightビルドを他のすべてのビルドと正確に区別しない場合があります。
Combinatorial の回答に基づいて、次の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 = Bundle.main.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
-D DEBUG
フラグを設定していることを確認してください。詳細については、こちらをご覧ください。
#if targetEnvironment(simulator)
すると、シミュレータで実行しているかどうかがわかります。だから私はオプションSimulator / TestFlight / AppStoreを持っています(私の場合はそれよりも優先されますDebug
):-)
シミュレータを説明する最新のSwiftバージョン(承認された回答に基づく):
private func isSimulatorOrTestFlight() -> Bool {
guard let path = Bundle.main.appStoreReceiptURL?.path else {
return false
}
return path.contains("CoreSimulator") || path.contains("sandboxReceipt")
}
isTestFlight()
これはもう機能しません。他の方法を使用してください。
これも機能します:
if NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision") != nil {
// TestFlight
} else {
// App Store (and Apple reviewers too)
}
私はBundle+isProduction
Swift 5.2で拡張機能を使用しています:
import Foundation
extension Bundle {
var isProduction: Bool {
#if DEBUG
return false
#else
guard let path = self.appStoreReceiptURL?.path else {
return true
}
return !path.contains("sandboxReceipt")
#endif
}
}
次に:
if Bundle.main.isProduction {
// do something
}
私のプロジェクトで使用する方法が1つあります。手順は次のとおりです。
Xcodeで、プロジェクト設定(プロジェクトではなくプロジェクト)に移動し、リストに「ベータ」構成を追加します。
次に、「ベータ」構成でプロジェクトを実行する新しいスキームを作成する必要があります。スキームを作成するにはここに行きます:
このスキームに任意の名前を付けます。このスキームの設定を編集する必要があります。これを行うには、ここをタップします:
選択できる[アーカイブ]タブを選択します Build configuration
次に、次のようにプロジェクト情報プロパティリストのConfig
値を含むキーを追加する必要があります$(CONFIGURATION)
。
次に、ベータビルドに固有の何かを行うためにコードで何が必要かということです。
let config = Bundle.main.object(forInfoDictionaryKey: "Config") as! String
if config == "Debug" {
// app running in debug configuration
}
else if config == "Release" {
// app running in release configuration
}
else if config == "Beta" {
// app running in beta configuration
}