gpt4 book ai didi

ios - 应用程序崩溃,因为启动时 launchOptions 为 nil

转载 作者:搜寻专家 更新时间:2023-11-01 06:06:21 24 4
gpt4 key购买 nike

这是我在 swift 2.2 中的代码,我已经写好了

didfinishLaunchingWithOptions

作为

if let locationValue : AnyObject? = launchOptions![UIApplicationLaunchOptionsLocationKey] as? [NSObject : AnyObject] {
if (locationValue != nil) {
let app : UIApplication = UIApplication.sharedApplication()
var bgTask : UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
bgTask = app.beginBackgroundTaskWithExpirationHandler({ () -> Void in
app.endBackgroundTask(bgTask)
})
self.startLocationUpdates()
}}

此行发生错误(EXC_BAD_INSTRUCTION)

 if let locationValue : AnyObject? = launchOptions![UIApplicationLaunchOptionsLocationKey] as? [NSObject : AnyObject] {

谁能帮我解决这里的 nil 情况?我也试过 if ..let 语句 .. 提前谢谢你。

最佳答案

任何你对可选项使用感叹号的地方都是你的应用程序可能崩溃的地方。在大多数情况下,您通常可以通过将感叹号替换为问号来修复它。

didFinishLaunchingWithOptions 的签名是这样的:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool

这里相关的参数是launchOptions,其类型是[NSObject: AnyObject]?,一个可选的字典。在我们调用它的方法之前(包括尝试通过下标运算符访问元素)我们必须打开它。

对于您的情况,最简单的解决方案是:

if let locationValue = launchOptions?[UIApplicationLaunchOptionsLocationKey] {
// use the location value
}

根据 the official Apple documentation :

  • UIApplicationLaunchOptionsLocationKey

The presence of this key indicates that the app was launched in response to an incoming location event. The value of this key is an NSNumber object containing a Boolean value. You should use the presence of this key as a signal to create a CLLocationManager object and start location services again. Location data is delivered only to the location manager delegate and not using this key.

在上面的代码片段中,由于字典的类型,locationValue 将是 AnyObject 类型(非可选)。但是根据文档,我们知道它将是一个 NSNumber 代表一个 Bool (在 Swift 中可以自由桥接到有用的类型)。

我们可能只关心值为真时的情况,对吗?

因此,我们可以将代码片段重写为以下内容:

if let locationValue = launchOptions?[UIApplicationLaunchOptionsLocationKey] as? Bool where locationValue {
// the app was launched in response to a location event
// do your location stuff
}

尽管严格来说,根据文档:

The presence of this key indicates that the app was launched in response to an incoming location event.

在这个措辞和实际值只是一个 true/false 值的事实之间,我几乎敢打赌,key 单独存在这一事实足以假设该值为 true .如果应用程序未针对位置事件启动,则 key 可能根本不存在。如果是,则该值可能始终为 true

如果你想打赌这个假设,你可以简单地使用 _ 作为变量名,因为我们不会使用它:

if let _ = launchOptions?[UIApplicationLaunchOptionsLocationKey] {
// etc...
}

关于ios - 应用程序崩溃,因为启动时 launchOptions 为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com