我试图在用户接近停车时为公交车提供一些到达时间,我已经通过发送基本的本地通知进行测试,以确保正确地触发了这些地区,并且我也测试过我的网络服务电话,以确保它正常工作.
这是我的代码:
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) }
任何人看到为什么它可能不发送?我启用了后台抓取和定位服务.这是在doEnterRegion里面
我做了同样的事情(当用户接近一个有折扣的商店,他/她将被通知).
首先,我建议您下载所有数据并将其保存在Core Data或sqlite中,如果是可选项.
第二个看看重要位置更改here.如果你正在移动,它将在每个500米的背景中更新你的位置,它将节省大量的电池而不是didUpdateLocation.
第三次使用SLC后,在每次调用时,从您的Core Data或sqlite中获取当前位置的20个最近的位置,并将其添加到监控中(使用Haversine计算与当前位置的所有点距离,然后获取最近的20点).每次SCL调用更新您监视的区域(如果保存数据离线不是一个选项,我建议您在这里的webservice发送请求.理想的情况是,您将发送您的位置到您的Web服务,它会回复返回最近的点,然后添加它们进行监控)
当didEnterRegion调用时,请确保您的数据已下载,然后创建本地通知.
如果您需要更多细节,请告诉我们
PS.请记住,如果使用大量资源,系统可能会终止您的应用程序(在后台).在这种情况下,您必须重新初始化拉取和显示数据所需的所有内容(网络请求,位置管理器等)您可以检测到AppDelegate的didFinisingLaunchingWithOptions中的位置事件重新启动了该应用程序:
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {}