我有一个使用Swift 2.2构建的iOS应用,最近开始出现问题。通过Xcode进行构建和运行时,它工作正常,但是从Xcode停止应用程序,然后尝试直接从手机(真实设备和模拟器)再次打开应用程序后,它在加载初始视图控制器之前崩溃了。
我能够象征崩溃日志,并且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密钥用于第三方服务。我想将其设置为TestFlight构建的DEV
和设置为App Store的PROD
。 最佳答案
我最终采用了另一种方法,而不是使用NSProcessInfo.processInfo()
。在目标->构建设置->其他Swift标志下,我使用了两个不同的标志,DEBUG
和RELEASE
,如下所示:
然后在AppDelegate.swift中,我使用Swift预处理程序宏#if /#else /#end定义我的原始buildFor
布尔变量:
#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 - 仅在Xcode外部打开iOS应用时,在AppDelegate中访问NSProcessInfo.processInfo()。environment会导致崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41123755/