Swift iOS: 当接收到远程通知时,关闭不会在后台运行
Swift iOS: Closure will not run in background when Remote Notification received
我正在编写一个 iOS 应用程序,它需要在收到推送通知时更新设备的 GPS 位置。
我使用一个闭包来获取当前的 GPS 位置。当应用程序在前台时,此代码运行完美("New remote notification" 和 "Got location" 都打印到控制台),但是当应用程序在后台时,只有 "New remote notification"(并且没有位置错误) ) 打印到控制台。因此我此时没有设备的 GPS 位置,这对我的应用程序的功能非常重要。
如有任何帮助,我们将不胜感激。
谢谢。
我的 Info.plist 文件中有 'Required background modes';
App registers for location updates
App downloads content from the network
App downloads content in response to push notifications
我的应用程序还可以随时访问位置,包括后台(已在代码的其他点成功测试):NSLocationAlwaysUsageDescription 在 Info.plist 文件中
在我的 AppDelegate 文件中:
func application(application: UIApplication!, didReceiveRemoteNotification userInfo:NSDictionary!) {
println("New remote notification")
var notification:NSDictionary = userInfo as NSDictionary
var loc: LocationManager?
loc = LocationManager()
loc!.fetchWithCompletion {location, error in
// fetch location or an error
if let myloc = location {
var lat = myloc.coordinate.latitude as Double
var lon = myloc.coordinate.longitude as Double
println("Got location")
} else if let err = error {
println(err.localizedDescription)
}
loc = nil
}
}
如果应用程序不在前台,请确保使用 beginBackgroundTaskWithExpirationHandler
请求一点时间来完成请求,然后在完成后调用 endBackgroundTask
。
有关详细信息,请参阅iOS 的应用程序编程指南Background Execution 章节中的执行有限长度任务。
我正在编写一个 iOS 应用程序,它需要在收到推送通知时更新设备的 GPS 位置。
我使用一个闭包来获取当前的 GPS 位置。当应用程序在前台时,此代码运行完美("New remote notification" 和 "Got location" 都打印到控制台),但是当应用程序在后台时,只有 "New remote notification"(并且没有位置错误) ) 打印到控制台。因此我此时没有设备的 GPS 位置,这对我的应用程序的功能非常重要。
如有任何帮助,我们将不胜感激。 谢谢。
我的 Info.plist 文件中有 'Required background modes';
App registers for location updates
App downloads content from the network
App downloads content in response to push notifications
我的应用程序还可以随时访问位置,包括后台(已在代码的其他点成功测试):NSLocationAlwaysUsageDescription 在 Info.plist 文件中
在我的 AppDelegate 文件中:
func application(application: UIApplication!, didReceiveRemoteNotification userInfo:NSDictionary!) {
println("New remote notification")
var notification:NSDictionary = userInfo as NSDictionary
var loc: LocationManager?
loc = LocationManager()
loc!.fetchWithCompletion {location, error in
// fetch location or an error
if let myloc = location {
var lat = myloc.coordinate.latitude as Double
var lon = myloc.coordinate.longitude as Double
println("Got location")
} else if let err = error {
println(err.localizedDescription)
}
loc = nil
}
}
如果应用程序不在前台,请确保使用 beginBackgroundTaskWithExpirationHandler
请求一点时间来完成请求,然后在完成后调用 endBackgroundTask
。
有关详细信息,请参阅iOS 的应用程序编程指南Background Execution 章节中的执行有限长度任务。