TestFlight Beta (iTunes Connect를 통해 제출)와 App Store를 통해 애플리케이션이 설치되었는지 런타임에 감지 할 수 있습니까? 단일 App Bundle을 제출하고 두 가지 모두를 통해 사용할 수 있습니다. 어떤 방식으로 설치되었는지 감지 할 수있는 API가 있습니까? 아니면 영수증에이를 확인할 수있는 정보가 포함되어 있습니까?
TestFlight Beta (iTunes Connect를 통해 제출)와 App Store를 통해 애플리케이션이 설치되었는지 런타임에 감지 할 수 있습니까? 단일 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 분산 바이너리를 실행하는 경우 참)
StoreKit/sandboxReceipt
는 장치 또는 시뮬레이터에서 Xcode를 통해 디버그 빌드로 설치 될 때 발생합니다. 따라서 이것은 testflight 빌드를 다른 모든 빌드 와 정확하게 구별하지 못할 수 있습니다 .
combinatorial의 답변을 기반으로 다음 SWIFT 도우미 클래스를 만들었습니다. 이 클래스를 사용하면 디버그, testflight 또는 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 = 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
}
}
업데이트 05-02-2016 : #if DEBUG와 같은 전 처리기 매크로를 사용하기위한 전제 조건은 일부 Swift 컴파일러 사용자 정의 플래그를 설정하는 것입니다. 이 답변에 대한 추가 정보 : https://stackoverflow.com/a/24112024/639227
#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
}
프로젝트에 사용하는 한 가지 방법이 있습니다. 단계는 다음과 같습니다.
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
}