ios - 在 AppDelegate 中访问 NSProcessInfo.processInfo().environment 仅在 Xcode 外部打开 iOS 应用程序时导致崩溃

标签 ios xcode environment-variables

我有一个使用 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 下,我使用了两个不同的标志,DEBUGRELEASE,如下所示: enter image description here

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

相关文章:

ios - 如何从 tabbarcontroller View 中删除 subview

ios - 使用 prepareForSegue 时键值编码错误

swift - 使用 segue [Swift 3.0 Xcode] 通过多个 View Controller 传递数据

Mac App Store 上的 Xcode 无法安装,显示磁盘空间不足

environment-variables - 如何在Windows的virtualenv中设置环境变量?

ios - 使用 Quickblox 加入群组视频聊天室

iphone - 在 iphone sdk 的应用内购买中在哪里使用生成共享 key ?

iphone - xcode 4.2 ios5 协同设计失败,退出代码 1

java - Windows 环境变量 NUMBER_OF_PROCESSORS 在 JVM 内外显示不同的值

ruby-on-rails - Rails 6 应用程序在测试期间未在 Heroku 上读取 ENV