每当我的应用收到推送通知时,即使屏幕关闭或应用在后台运行,我也想捕获iOS用户的位置。重要的是,该位置必须具有高精度,并在发送通知时立即捕获。 (然后我想将该位置发回服务器,应用程序仍然在后台。)
这可以在iOS中实现吗?我是该平台的新手,并且看到了很多令人困惑的信息,表明至少部分是可能的,但我不确定是否整个事情都是。我也找到了一些资源(例如这个问题iOS App Background Location (Push Notifications)),但它来自四年前,我知道最近的iOS版本发生了很多变化。
答案 0 :(得分:0)
是的,这是可能的:在你的AppDelegate didFinishLaunchingWithOptions中, 检查是否从通知启动(在后台接收到APN),然后启动位置服务。什么时候 您收到一个位置,将其发送到后端,然后关闭位置服务。请记住 一般来说,在系统返回一个位置之前会有一些延迟,但这应该是可行的 应用程序再次休眠之前的时间量。有一些方法可以获得额外的背景知识 处理时间,如果需要。
// untested code, ignores all of the boilerplate Location Services Authorization code and request user permission to Location services
var locationManager: CLLocationManager?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Check if launched from notification (received APN while in background)
if let notification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject] {
let aps = notification["aps"] as! [String: AnyObject]
print("received background apn, aps: \(aps)")
locationManager = CLLocationManager()
locationManager!.delegate = self
locationManager!.startUpdatingLocation() // this is what starts the location services query
}
...
return true
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations[0]
// here is where you would send location to your backend
// shut down location services:
locationManager?.stopUpdatingLocation()
locationManager?.delegate = nil
locationManager = nil
}