我正在编写一个需要高精度和低频率的背景位置更新的应用程序.该解决方案似乎是一个后台NSTimer任务,它启动位置管理器的更新,然后立即关闭.之前已经问过这个问题:
但我还没有得到最起码的例子.在尝试了上述接受的答案的每一个排列后,我总结了一个起点.输入背景:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"ending background task");
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
self.timer = [NSTimer scheduledTimerWithTimeInterval:60
target:self.locationManager
selector:@selector(startUpdatingLocation)
userInfo:nil
repeats:YES];
}
Run Code Online (Sandbox Code Playgroud)
和委托方法:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", newLocation);
NSLog(@"background time: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
[self.locationManager stopUpdatingLocation];
}
Run Code Online (Sandbox Code Playgroud)
当前行为是backgroundTimeRemaining从180秒减少到零(记录位置时),然后执行到期处理程序,不再生成进一步的位置更新.如何修改上述代码以便在后台无限期地接收定期位置更新?
更新:我的目标是iOS 7,似乎有一些证据表明后台任务的行为有所不同:
objective-c core-location ios background-task ios-background-mode
很长一段时间以来,我一直在寻找一种方法,在我的iPhone应用程序中每隔X分钟轮询一次以检查数据计数器.在阅读了背景执行文档和一些试用版应用之后,我不认为这是不可能的,而不会滥用后台API.
上周我发现这个应用程序正是如此.http://itunes.apple.com/us/app/dataman-real-time-data-usage/id393282873?mt=8
它在后台运行并跟踪您使用的蜂窝/ WiFi数据的数量.我怀疑开发人员正在注册他的应用程序作为跟踪位置更改但在应用程序运行时看不到位置服务图标,我认为这是一项要求.
有没有人知道如何实现这一目标?
我最近升级了我的iOS设备以使用iOS 7.我们正在开发的其中一个应用程序使用后台位置服务来跟踪设备位置,我们所有的测试人员都报告该应用程序不再出现在iOS下的后台跟踪7.
我们已经确认在设备上的设置中启用了应用程序的后台处理,并且之前的版本在iOS 6下运行良好.即使设备已循环,应用程序也会在位置更新后重新启动.
还有什么需要做才能在iOS 7下完成这项工作吗?
我的应用程序需要在后台跟踪用户位置更改,并且只要用户移动就可以正常工作.当用户CLLocationManager在10-20分钟左右停止并暂停时.此通知表明:
-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{}
Run Code Online (Sandbox Code Playgroud)
这对我也没关系.太棒了,我节省了一些电池等
问题是CLLocationManager当用户再次开始移动时永远不会醒来,并且在我将应用程序放到前台之前永远不会触发委托方法(获取活动):
//Never called back after CLLocationManager pauses:
-(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{}
Run Code Online (Sandbox Code Playgroud)
为什么locationManagerDidResumeLocationUpdates在设备重新开始移动后从未调用过?GPS也不应自动恢复(因为自动暂停)?
有没有办法在没有用户互动的情况下恢复GPS?
应用程序在Info.plist文件中声明如下:

我的CLLocationManager设置是:
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager setActivityType:CLActivityTypeFitness];
//I WANT pauses to save some battery, etc... That is why following line is commented out (default)
//[locationManager setPausesLocationUpdatesAutomatically:NO];
locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters;
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
[locationManager startUpdatingLocation];
Run Code Online (Sandbox Code Playgroud) objective-c core-location uiapplicationdelegate cllocationmanager ios
我正在尝试实施这篇文章中给出的建议.
不幸的是,我不清楚这些步骤.我尝试实现这些建议,但是即使在我启动和停止locationServices之后,backgroundTimeRemaining仍然继续减少.这就是我开发它的方式:
- (void)applicationDidEnterBackground:(UIApplication *)application {
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task.
self.timer = nil;
[self initTimer];
});
}
Run Code Online (Sandbox Code Playgroud)
initTimer:
- (void)initTimer {
// Create the location manager if this object does not
// already have one.
if (nil == self.locationManager)
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
[self.locationManager …Run Code Online (Sandbox Code Playgroud) 似乎在iOS 7中,应用程序无法再从后台任务启动位置管理器(通过调用startUpdatingLocation).
在iOS 6中,我使用了这里描述的方法:https://stackoverflow.com/a/6465280每n分钟运行一次后台位置更新.我们的想法是使用计时器运行后台任务,并在计时器触发时启动位置管理器.之后关闭位置管理器并启动另一个后台任务.
更新到iOS 7后,此方法不再起作用.启动位置管理器后,应用程序不会收到任何locationManager:didUpdateLocations.有任何想法吗?
我正在尝试设置一个应用程序,该应用程序可以在后台检查人员的位置,查看他们是否位于给定位置,如果是,则将ping发送到服务器.我们不想耗尽用户的精力,因此我们试图找出最佳解决方案.
我已经做了大量阅读,但我没有找到关于这些方法的大量信息.我会理解他们现在理解的优点和缺点
startMonitoringForSignificantChanges
描述:基于Wi-Fi和蜂窝塔的变化,系统唤醒了应用程序.
文件:
只要设备从之前的通知移动500米或更长时间,应用就会收到通知.它不应该比每五分钟更频繁地预期通知.如果设备能够从网络检索数据,则位置管理器更有可能及时发送通知.
优点:
缺点:
10分钟的开始更新或"n分钟更新":
描述:这基本上要求应用程序有更多时间,当额外时间即将到期时,它调用[self.locationManager startUpdating],抓取位置并将后台线程扩展10分钟.
优点:
缺点:
问题:这对电池有什么影响?唤醒GPS并将其关闭会对电池造成更大伤害吗?我无法想象在后台运行一个简短的位置检查会耗尽电池那么多......但话又说回来,我不知道是什么导致GPS启动并获得可用的信号.
startMonitoringForRegion(geo-fencing):
简而言之,当您进入预定义区域时,您的应用会被唤醒.这是他们的古怪,它是最新的,并且有较少的文档.我无法找到关于"系统如何监控"过境点的良好描述.据我所知,这是一些非常聪明的算法,或者他们不断地对GPS进行ping操作,这会使其效率低于其他方法.
优点:
缺点:
我想我的问题归结为startMonitoringForRegion:与电池寿命,一致性和精确度相比,在后台测试用户位置的其他方法.有没有人彻底测试过这个?或者在他们的应用程序中使用它并获得至少一些反馈?可能,就我的目的而言,权衡是在地理围栏和10分钟更新方法之间.(同样考虑到Apple公开谈论的iOS7会有一些后台任务......这会改变这两种方法之间权衡的微积分吗?)有没有人知道这两者的比较方式?
非常感谢!期待看到我们是否可以深入了解如何比较这些方法.
我创建了一个简单的应用程序,它可以跟踪用户位置,并在每次更新位置时创建本地通知.
我启用了下面的背景模式,
let locationManager = CLLocationManager()
open override func viewDidLoad() {
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = 10
locationManager.allowsBackgroundLocationUpdates = true
locationManager.startUpdatingLocation()
}
open func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let notification = UILocalNotification()
notification.alertBody = "location updated"
notification.fireDate = Date()
UIApplication.shared.scheduleLocalNotification(notification)
}
Run Code Online (Sandbox Code Playgroud)
我设置字符串NSLocationAlwaysUsageDescription并请求许可.用户授予第一次加载应用时始终使用的权限.
当应用程序处于前台时它运行良好,当背景仍然工作至少在5-40分钟的时间范围内,可以通过电池或其他打开的应用程序进行更改.
问题是为什么它停止工作,它不会继续工作?
我从未在Apple文档中看到时间限制.
我正在寻找一个城市的旅游应用程序,当用户靠近"感兴趣的地方"时,他可以在他的设备上获得推送(本地).
例如,我会在我的应用程序上添加100个POI,并为每个POI显示100条消息,以便在用户处于范围内时显示,例如"您靠近大教堂......"
这种情况可能吗?是否有可能检查用户位置,例如每10分钟即使应用程序被杀死,也可以在范围内进行本地推送?它会消耗多少电池?如果用户关闭GPS,它会尝试使用3G/wifi信号来获取位置吗?
如果是,你可以指导我正确的方式,我应该阅读的主题可能是一些教程和文章?
要求 -我正在构建一个超本地应用程序,它将根据用户的位置为用户提供服务.在应用程序中我可以获得他当前的位置并相应地显示优惠,但我现在需要的是根据他的位置向用户发送推送通知.所以我想找出用户的位置并根据他的位置发送优惠.
我已经阅读了有关重大变更位置服务的 Apple文档,但后来这个答案说,一旦应用程序被杀,它将无法运行.
我还阅读了有关跟踪用户位置的信息,但这对我来说无效.我在后台没有获得超过5个更新.
我目前的代码viewDidLoad-
if (self.locationManager == nil)
{
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
self.locationManager.allowsBackgroundLocationUpdates = true;
self.locationManager.pausesLocationUpdatesAutomatically = false;
if ([CLLocationManager authorizationStatus] != AVAuthorizationStatusAuthorized) {
[self.locationManager requestAlwaysAuthorization];
}
}
[self.locationManager startUpdatingLocation];
Run Code Online (Sandbox Code Playgroud)
我的委托方法看起来像这样 -
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
if (UIApplication.sharedApplication.applicationState == UIApplicationStateActive) {
// Get updated data according to location
} else {
// Send location to server
}
}
Run Code Online (Sandbox Code Playgroud)
请建议一些适当的方式,我可以生活在1公里左右的精度. …