我有一个应用程序,当我发送推送通知时,它会向我发送设备的位置。但是,当应用程序在前台运行时,应用程序在收到推送通知时崩溃。

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler:(UIBackgroundFetchResult) -> Void )
{
    NSLog("\(userInfo)")
    if (managedConfig["locationTrackingDisabled"] ?? false) as! Bool == false {
    locationManager.startUpdatingLocation()
    }
    let seconds = 4.0
    let delay = seconds * Double(NSEC_PER_SEC)  // nanoseconds per seconds
    let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

    dispatch_after(dispatchTime, dispatch_get_main_queue(), {
        completionHandler(UIBackgroundFetchResult.NewData)
    })
}

最佳答案

这里没有足够的信息来找出哪里出了问题,但是如果我戴上心理调试帽,这里的if语句很容易由于强制转换为aBoolif而崩溃:
managedConfig是一个NSDictionary
它有一个locationTrackingDisabled键,它存储的不是Bool(可能是NSString
更好的检查方法是使用if let语句来安全地确定字典中的值是否具有预期的类型。

if let trackLocation = managedConfig["locationTrackingDisabled"] as? Bool, trackLocation {
    locationmanager.startUpdatingLocation()
}

请注意,您可以通过Xcode在设备上运行应用程序,但仍会收到推送通知。另外,如果你打算通过商店发布一个应用程序,强烈建议你有一些跟踪崩溃的方法,例如通过HockeyApp、Crashlytics、critercism等。有很多选择。

10-07 19:56
查看更多