我有一个使用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标志下,我使用了两个不同的标志,DEBUGRELEASE,如下所示:
ios - 仅在Xcode外部打开iOS应用时,在AppDelegate中访问NSProcessInfo.processInfo()。environment会导致崩溃-LMLPHP

然后在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/

10-11 17:19
查看更多