相关疑难解决方法(0)

如何在iOS应用程序中每n分钟更新一次后台位置?

我正在寻找一种在iOS应用程序中每n分钟更新一次后台位置的方法.我正在使用iOS 4.3,该解决方案适用于非越狱的iPhone.

我尝试/考虑了以下选项:

  • CLLocationManager startUpdatingLocation/startMonitoringSignificantLocationChanges:这根据预期在后台工作,基于配置的属性,但似乎不可能强制它每n分钟更新一次位置
  • NSTimer:当应用程序在前台运行但似乎不是为后台任务设计时,是否有效
  • 本地通知:本地通知可以每n分钟安排一次,但是无法执行某些代码来获取当前位置(用户无需通过通知启动应用程序).这种方法似乎也不是一种干净的方法,因为这不是应该使用的通知.
  • UIApplication:beginBackgroundTaskWithExpirationHandler:据我所知,当应用程序移动到后台而不是实现"长时间运行"的后台进程时,这应该用于在后台完成一些工作(也限制时间).

如何实施这些常规后台位置更新?

objective-c background-process core-location ios

202
推荐指数
9
解决办法
17万
查看次数

定期iOS后台位置更新

我正在编写一个需要高精度和低频率的背景位置更新的应用程序.该解决方案似乎是一个后台NSTimer任务,它启动位置管理器的更新,然后立即关闭.之前已经问过这个问题:

如何在iOS应用程序中每n分钟更新一次后台位置?

应用程序进入后台后每n分钟获取用户位置

iOS不是典型的后台位置跟踪计时器问题

iOS长时间运行的后台计时器,带有"位置"后台模式

基于位置跟踪的iOS全天候后台服务

但我还没有得到最起码的例子.在尝试了上述接受的答案的每一个排列后,我总结了一个起点.输入背景:

- (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,似乎有一些证据表明后台任务的行为有所不同:

从后台任务启动iOS 7中的位置管理器

objective-c core-location ios background-task ios-background-mode

91
推荐指数
4
解决办法
9万
查看次数

用于后台位置更新的iOS最佳做法

概观

我的公司要求我发布一个可以每两个小时检查一次设备位置的应用程序.应用程序会通过TCP/IP套接字将这些位置数据发送到我的服务器,然后根据这些非常数据(直接通过相同的TCP/IP套接字)接收信息.所以我不是试图让我的应用程序在后台模式下连续运行(实际上,这似乎是iOS中的热门话题,而且它也不适合我的项目).

为了可靠,实现这一目标的最佳做法是什么?所以,我想知道:

  • 由于我的应用程序被暂停(=无效),Apple是否允许打开套接字以便在被唤醒时发送位置didUpdateToLocation
  • 我需要多长时间才能通过套接字执行发送/接收任务?
  • 我应该创建一个真正的后台任务beginBackgroundTaskWithExpirationHandler并使用Cocoa允许的10分钟来执行我的发送/接收任务吗?
  • 有可能(并允许Apple)每2小时要求一次10分钟的后台任务,没有人工干预(即用户应该重新打开应用程序等)?

到目前为止我取得的成就/发现

  • 我在我的应用程序处于非活动状态时添加了location密钥Info.plist以便能够运行didUpdateToLocation处理程序.
  • 我可以通过我的应用程序处于前台(=活动)时打开的套接字发送和接收数据.
  • 我试着检查backgroundTimeRemaining什么时候didUpdateToLocation被调用.我得到了一个非常大的结果数,这似乎是正常的,因为在这一点上,applicationState它不在UIApplicationStateBackground但是在UIApplicationStateActive.

这些要点在官方文档中并不十分清楚,我没有找到与我的具体案例相关的主题.

谢谢你的帮助.

sockets cocoa-touch background-process core-location ios

3
推荐指数
1
解决办法
2076
查看次数