如何在后台捕获由推送通知触发的 iOS 位置?

Posted

技术标签:

【中文标题】如何在后台捕获由推送通知触发的 iOS 位置?【英文标题】:How do I capture iOS location in the background, triggered by a push notification? 【发布时间】:2016-09-23 21:21:49 【问题描述】:

我想在我的应用每次收到推送通知时捕获 ios 用户的位置,即使屏幕关闭或应用在后台运行也是如此。重要的是,该位置必须是高精度的,并且在发送通知时立即捕获。 (然后我想将该位置发布回服务器,而应用程序仍在后台。)

这可能在 iOS 中实现吗?我是该平台的新手,并且看到很多令人困惑的信息表明至少 部分 是可能的,但我不确定整个事情是否如此。我还找到了一些资源(例如这个问题iOS App Background Location (Push Notifications)),但它是四年前的,我知道最近的 iOS 版本发生了很多变化。

【问题讨论】:

一种解决方案可能是在后台继续获取位置数据并使用它通知到达。在后台继续获取位置:***.com/a/24666487/548403 【参考方案1】:

是的,这是可能的:在您的 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

【讨论】:

看起来在 iOS 10 中,可以使用通知服务扩展来在每次通知到达时运行自定义代码。这会比上述方法更受欢迎吗?在设备重启、应用强制退出等情况下,哪种方法更有可能可靠运行? 你说的是UNLocalNotificationTrigger吗?我还没有这方面的经验。

以上是关于如何在后台捕获由推送通知触发的 iOS 位置?的主要内容,如果未能解决你的问题,请参考以下文章

iOS静默推送通知在后台状态下每次都不会触发

应用在前台时如何触发苹果推送通知事件?

有没有办法在 ios 中捕获推送通知?

(iOS) GCM 静默推送通知以在应用程序终止时触发调用另一个 API

在前台单击推送通知横幅后如何触发操作

Windows azure 推送通知并将通知捕获到特定网站页面