如何判断iOS应用是从TestFlight还是App Store启动?
区分TestFlight与App Store启动的方法
嘿,刚好踩过这个坑!其实从App Store直接启动应用时,launchOptions里的sourceApplication字段是不存在的(返回nil)——只有从其他应用跳转过来时,这个值才会被填充,比如TestFlight、Safari或者其他第三方App。
所以你可以这样完善判断逻辑:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 检测是否从TestFlight启动 if let sourceApp = launchOptions?[UIApplication.LaunchOptionsKey.sourceApplication] as? String, sourceApp == "com.apple.TestFlight" { // 这里写TestFlight专属逻辑 print("App从TestFlight启动") } else { // 这里默认处理App Store启动的情况(包括用户直接点击图标启动) print("App从App Store启动或直接打开") } return true }
另外,如果你需要更精准地区分App Store版本和TestFlight版本(比如用户把TestFlight的App直接放到桌面启动,这时sourceApplication也会是nil),可以结合应用收据来判断:
func isTestFlightBuild() -> Bool { guard let receiptURL = Bundle.main.appStoreReceiptURL else { // 没有收据,大概率是调试包或企业包 return false } // TestFlight的收据路径包含"sandboxReceipt" return receiptURL.lastPathComponent == "sandboxReceipt" }
这个方法更可靠,因为不管是从TestFlight跳转启动还是直接启动,只要是TestFlight分发的包,收据都会带有sandbox标识。
内容的提问来源于stack exchange,提问作者Rob




