我有一个使用 Swift 2.2 构建的 iOS 应用程序,最近开始出现问题。它在通过 Xcode 构建和运行时工作正常,但在从 Xcode 停止应用程序然后尝试直接从手机(真实设备和模拟器)再次打开它后,它在加载初始 View Controller 之前崩溃。
我能够符号化崩溃日志,Thread 0 Crashed
中的第一行包含:
0x001aa754 specialized AppDelegate.application(UIApplication, didFinishLaunchingWithOptions : [NSObject : AnyObject]?) -> Bool (AppDelegate.swift:417)
在 AppDelegate 内部的线上,我有:
let buildFor = NSProcessInfo.processInfo().environment["BUILD_FOR"]! as String
我确认这是崩溃的原因,因为在注释掉该行并将其替换为 let buildFor = "DEV"
之后,我能够毫无问题地从主屏幕打开应用程序在 Xcode 中关闭它。
我有两种方案,一种是 BUILD_FOR
环境变量是 DEV
,另一种是 PROD
。是什么导致在通过 Xcode 而不是从设备/模拟器运行时出现该值,我该如何更改它?该环境变量在多个地方(主要在 AppDelegate 中)用于确定要使用哪些 URL,用于生产或开发服务器,以及为第三方服务使用适当的 API key 。我想将它设置为 DEV
用于 TestFlight 构建和 PROD
当它在 App Store 中时。
最佳答案
我最终采用了另一种方法,而不是使用 NSProcessInfo.processInfo()
。在 Targets -> Build Settings -> Other Swift Flags 下,我使用了两个不同的标志,DEBUG
和 RELEASE
,如下所示:
然后在 AppDelegate.swift 中,我使用 Swift 预处理器宏 #if/#else/#end 来定义我原来的 buildFor
bool 变量:
#if DEBUG
let buildFor = "DEV"
print("it is DEV")
#else
let buildFor = "PROD"
print("it is PROD")
#endif
// setting appropriate API keys, server URLs, etc
let apiKey = buildFor == "DEV" ? "testing api key" : "production one"
这样做不需要多个 Xcode 方案。
关于ios - 在 AppDelegate 中访问 NSProcessInfo.processInfo().environment 仅在 Xcode 外部打开 iOS 应用程序时导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41123755/