为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

iOS
潇潇雨雨 2019-06-16 15:48:56
如何在iOS应用程序中每n分钟更新一次背景位置?我正在寻找一种方法,以获得一个背景位置更新每n分钟在我的iOS应用程序。我使用的是iOS 4.3,这个解决方案应该适用于非越狱iPhone。我尝试/考虑了以下选择:CLLocationManager startUpdatingLocation/startMonitoringSignificantLocationChanges:根据配置的属性在后台按预期工作,但似乎不可能强迫它每n分钟更新一次位置。NSTimer:应用程序在前台运行时是否工作,但似乎不是为后台任务设计的本地通知:本地通知可以每n分钟调度一次,但是不可能执行一些代码来获得当前位置(用户不必通过通知启动应用程序)。这种方法似乎也不是一种干净的方法,因为这不是应该使用的通知。UIApplication:beginBackgroundTaskWithExpirationHandler据我所知,当一个应用程序被移到后台而不是实现“长期运行”后台进程时,应该使用它来完成背景中的一些工作(也是有限的时间)。如何实现这些定期的背景位置更新?
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

在Apple Developer论坛的帮助下,我找到了一个实现这个问题的解决方案:

  • 指定

    location background mode

  • 创建一个

    NSTimer

    在背景中

    UIApplication:beginBackgroundTaskWithExpirationHandler:

  • 什么时候

    n

    较小

    UIApplication:backgroundTimeRemaining

    一切都会好起来的。什么时候

    n

    更大

    location manager

    在没有时间避免后台任务被杀死之前,应该再次启用(并禁用)。

这是因为位置是允许的三种背景执行类型之一。.

注意:我浪费了一些时间在模拟器中测试它不起作用。然而,它在我的手机上工作得很好。


查看完整回答
反对 回复 2019-06-16
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

在……上面iOS 8/9/10要使背景位置每5分钟更新一次,请执行以下操作:

  1. 转到Project->Capability->后台模式->选择位置更新

  2. 转到Project->Info->添加一个键NSLocationAlwaysUsageDescription和空值(或者任意文本)

  3. 要使位置在后台工作,并将坐标发送到Web服务或每5分钟对它们执行任何操作,请按照下面的代码执行。

我不使用任何背景任务或计时器。我已经用iOS 8.1在我的设备上测试了这段代码,它在我的桌子上躺了几个小时,我的应用程序在后台运行。设备被锁定,代码一直在正常运行。

@interface LocationManager () <CLLocationManagerDelegate>@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) NSDate *lastTimestamp;@end@implementation LocationManager+ (instancetype)sharedInstance{
    static id sharedInstance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
        LocationManager *instance = sharedInstance;
        instance.locationManager = [CLLocationManager new];
        instance.locationManager.delegate = instance;
        instance.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
        // you can use kCLLocationAccuracyHundredMeters to get better battery life
        instance.locationManager.pausesLocationUpdatesAutomatically = NO; // this is important
    });

    return sharedInstance;}- (void)startUpdatingLocation{
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

    if (status == kCLAuthorizationStatusDenied)
    {
        NSLog(@"Location services are disabled in settings.");
    }
    else
    {
        // for iOS 8
        if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
        {
            [self.locationManager requestAlwaysAuthorization];
        }
        // for iOS 9
        if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)])
        {
            [self.locationManager setAllowsBackgroundLocationUpdates:YES];
        }

        [self.locationManager startUpdatingLocation];
    }}- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    CLLocation *mostRecentLocation = locations.lastObject;
    NSLog(@"Current location: %@ %@", @(mostRecentLocation.coordinate.latitude), @(mostRecentLocation.coordinate.longitude));

    NSDate *now = [NSDate date];
    NSTimeInterval interval = self.lastTimestamp ? [now timeIntervalSinceDate:self.lastTimestamp] : 0;

    if (!self.lastTimestamp || interval >= 5 * 60)
    {
        self.lastTimestamp = now;
        NSLog(@"Sending current location to web service.");
    }}@end



查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 578 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信