基于动态位置的本地通知Swift iOS

Cli*_*lip 14 core-location ios uilocalnotification swift

当用户接近停止时,我试图获取总线的到达时间,我已经测试通过发送基本的本地通知来确保区域被正确触发,我还测试了我的Web服务调用以确保它正常工作.

但是我很难获取信息,然后发送通知.

这是我的代码:

    var bgTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier()

    bgTask = UIApplication.shared().beginBackgroundTask {

        self.webService?.getStopEstimates(routeStopIds: stopRouteIdSet, routeNameDict: routeNameDict, completion: { (result) in

            if result == "error" {
                return
            }

            let notification = UILocalNotification()
            notification.fireDate = Date(timeIntervalSinceNow: 1)
            notification.alertTitle = region.identifier + " Stop Details"
            notification.alertBody = result
            notification.soundName = UILocalNotificationDefaultSoundName
            UIApplication.shared().scheduleLocalNotification(notification)
        })

        UIApplication.shared().endBackgroundTask(bgTask)
    }
Run Code Online (Sandbox Code Playgroud)

任何人都明白为什么它可能不会发送?我启用了后台提取和位置服务.这是在里面didEnterRegion

Bla*_*ckM 5

我做了同样的事情(当用户接近有折扣的商店时,他/她会收到通知).

首先,我建议您下载所有数据并将其保存在Core Data或SQLite上,如果这是一个选项.

其次看看显着位置更改这里.如果你正在移动,它将在每500米的背景中更新你的位置,它将节省大量电池,而不是didUpdateLocation.

第三次使用SLC后,在每次通话时,从您的核心数据或SQLite中取出当前位置的20个最近位置并添加它们进行监控(使用Haversine计算距您当前位置的所有点距离,然后得到最近的20).每次调用SCL时都会更新您监控的区域(如果离线保存您的数据不是一个选项,我建议您在此处通过Web服务发送请求.理想情况是您将位置发送到您的Web服务,它将回复返回最近的点.然后添加它们进行监控)

当didEnterRegion调用时,请确保已下载数据,然后创建本地通知.

如果您需要更多详细信息,请告诉我们

PS.请记住,如果消耗大量资源,系统可能会终止您的应用(在后台).在这种情况下,您必须重新初始化拉动和显示数据所需的一切(网络请求,位置管理器等).您可以检测到App由于AppDelegate的didFinisingLaunchingWithOptions中的位置事件而重新启动:

  if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {}
Run Code Online (Sandbox Code Playgroud)


Tec*_*eko 3

在 GitHub 上查看此示例,因为我认为您的问题是如何处理后台任务。如果Web服务调用时间过长,后台任务将会失效。我不知道您对 ObjC 有多了解,但在上面的示例中,您会发现一个 BackgroundTaskManager 类为您处理该问题。

您应该确保的事情是:

  1. 目标设置(后台模式部分)中的后台获取已打开。
  2. 您已请求并获得“始终”授权(在 plist 中)
  3. 目标设置(后台模式部分)中的位置更新已打开。
  4. 在应用程序委托的 appDidFinishLaunching 中注册用户通知。
  5. 如果服务时间过长,则更新过期的后台任务。

如果startUpdatingLocation您的应用程序在后台进行调用,CoreLocation 仍然会通过启动您的应用程序的位置更新来响应,但系统将不再为您保留断言,一旦后台允许的时间,您的应用程序将被暂停被花掉了。这个时间(当前)是 10 秒。但实际上您的应用程序现在已暂停,无法再接收更新。有一种方法可以将此持续时间延长到(目前)最多 3 分钟,请阅读beginBackgroundTaskWithExpirationHandler: Apple 的 CoreLocation 文档中了解更多信息

这个延长的时间是否足够取决于您的应用程序。

对于您的用例,重大位置变更服务非常有效。您可以在应用程序位于前台时启动位置更新,并在应用程序位于后台时推迟位置更新。您还可以阅读 Apple 关于“重大位置更改”的文档