[英]cordova getting Location Updates for iOS 7 and 8 when the App is Killed/Terminated/Suspended
[英]Background user location when app is terminated/suspended
我一直试图找出如何在应用程序终止时获取用户的位置,就像应用程序Moves一样。 我知道这样做的唯一方法是使用重要的位置更改。 但是,如果位置发生重大变化,应用程序每隔500米就会被唤醒,并且只有在最后一次更新后大约5分钟才会被唤醒。
根据Apple的说法:
只要设备从之前的通知移动500米或更长时间,应用就会收到通知。 它不应该比每五分钟更频繁地预期通知。 如果设备能够从网络检索数据,则位置管理器更有可能及时发送通知。
在Moves应用程序中,即使应用程序终止,它也能够非常准确地检索用户的位置,而不会有太多的电池排水。 它似乎也没有打开背景位置,因为它在电池使用列表中的原因仅显示“背景活动”。 所以我想知道像Moves这样的应用程序是如何做到这一点的。 任何帮助都会很棒! 谢谢。
您可以注册500米区域内的区域,并在其中注册通知区域通知。 如果它们达到一个,您的应用程序将在后台启动。 然后,重新注册新的位置,将该位置保持在中心位置。
来自Apple的文档 :
支持后台执行的应用程序可以由系统重新启动以处理传入事件。 如果应用程序因用户强制退出而导致其终止,则系统会在发生以下任一事件时启动应用程序:
对于位置应用:
系统会收到符合应用程序配置的交付条件的位置更新。
设备进入或退出注册区域。 (区域可以是地理区域或iBeacon区域。)
如果您经常需要更新位置但仍希望节省电池寿命,请尝试以下操作 -
startUpdatingLocation
启动更新 allowDeferredLocationUpdatesUntilTraveled:timeout:
在后台开始延迟更新allowDeferredLocationUpdatesUntilTraveled:timeout:
在此方法中指定时间和距离过滤器。 唯一的解决方案是使用CoreLocation的后台模式。 如果您的应用需要iOS 8,系统将重新启动您的应用,即使用户强制退出也是如此。 Apple Docs中记录了这一点:
在大多数情况下,系统在用户强行退出后不会重新启动应用程序。 位置应用程序是一个例外,它在iOS 8及更高版本中被用户强行退出后重新启动。 但是,在其他情况下,用户必须明确启动应用程序或重新启动设备,然后系统才能将应用程序自动启动到后台。
在iOS 8中,它们是我们需要注意的新步骤,以便使位置获取工作。 第一步是根据应用程序的主要功能将一个或两个键添加到项目的.plist中。 这两个键是NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription,然后您需要添加一个String,向用户解释为什么应用程序需要访问他的位置,“此应用程序使用位置在后台/前台因为A, B和C“。 这些字符串中的每一个都有一个相应的授权方法,需要调用,即InInUse或Alway(即背景)。
- (void)startStandardUpdates
{
// Create the location manager if this object does not
// already have one.
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
// Set a movement threshold for new events.
locationManager.distanceFilter = 500; // meters
[locationManager startUpdatingLocation];
}
根据我目前的经验,您有3个选项可以完成这项工作。 第一个是发出无声通知,需要后端完成工作。 静音通知是某种推送通知,但它会在没有警报的情况下通知您的应用。 第二种解决方案是后台提取。 后台提取不需要后端解决方案,但遗憾的是,您无法控制实例化它所需的时间间隔。 第三个是没有消息的预定本地通知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.