iOS定期后台位置更新,不仅取决于重要的位置变化

Ale*_*akh 8 iphone locationmanager ios

我有一个应用程序必须报告用户位置,即使它背景甚至被杀死(终止).问题是应用程序应报告不少于1小时间隔的位置.

我正在使用重要的位置更改(SLC)来跟踪用户在旅途中的所有移动,但是一旦用户停止,则不会引发进一步的更新,并且应用程序没有机会提交新的位置(同时用户保持不变区域,但没有SLC).

为了涵盖这种情况,我开始使用Background fetches定期在后台发送更新位置,即使没有SLC).这里的问题是背景提取常常工作(自从我在另一个iOS 7.x应用程序中使用以来每20-30分钟)但现在使用iOS8/iOS9我每天只能获得一次,这是不可接受的在我的情况下.我已经执行了大量测试,开发了简单的后台获取应用程序,它在获取时添加本地通知.没有运气迫使它更频繁地工作.

这是我的AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
    return YES;
}

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{    
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    NSDate *now = [NSDate date];
    localNotification.fireDate = now;
    localNotification.alertBody = [NSString stringWithFormat:@"Background fetch!"];
    localNotification.soundName = UILocalNotificationDefaultSoundName;
    NSInteger number = [UIApplication sharedApplication].applicationIconBadgeNumber;
    number++;
    localNotification.applicationIconBadgeNumber = number;
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

    completionHandler(UIBackgroundFetchResultNewData);
}
Run Code Online (Sandbox Code Playgroud)

这里所做的就是在每次后台提取时添加本地通知.我总是用UIBackgroundFetchResultNewData完成后台执行.

您对如何强制后台提取更频繁地工作(或证明链接不再可能)有任何建议吗?我们也欢迎任何符合我要求的替代解决方案!

Ale*_*akh 4

事实证明,iOS 中的后台获取很大程度上取决于您在处理程序中所做的事情,尤其是网络活动。以下是您应该考虑尝试了解 iOS 是否执行提取以及执行提取的频率的依赖项列表:

  • 你花在处理程序上的时间
  • 结果(无数据、新数据)
  • 错误处理(如果您的代码崩溃,您将不太可能启动
  • 超时(您的代码执行可能会被 iOS 中断)
  • 电量使用情况
  • 与结果相关的网络活动(当你说你有 NewData 时,你必须执行一个网络请求,否则你的获取可能会在一天左右的下次执行。

快速下载少量内容并准确反映何时有内容可供下载的应用程序,比需要较长时间下载其内容或声称内容可用但随后又执行的应用程序更有可能在未来获得执行时间不下载任何东西。

最后一项对我来说至关重要,因为出于测试目的,我声明了提取并且从未尝试下载任何内容。一旦我开始在处理程序中使用网络,后台提取将继续按预期每 15-30 分钟进行一次。

苹果文档: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html