【问题标题】:iOS periodic background location updates which depends not only on significant location changeiOS 定期后台位置更新,不仅取决于重大的位置变化
【发布时间】:2015-09-20 21:40:00
【问题描述】:

我有一个应用程序,即使它在后台运行甚至被终止(终止),它也必须报告用户位置。问题是应用程序应该每隔 1 小时报告一次位置。

我正在使用显着位置更改 (SLC) 来跟踪所有移动,当用户在旅途中时这已经足够了,但是一旦用户停止,就不会引发进一步的更新,并且应用程序没有机会提交新的位置(当用户停留时)在同一区域但没有 SLC)。

为了解决这种情况,我开始使用后台获取来定期在后台发送更新位置,即使没有 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);
}

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

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

【问题讨论】:

  • 后台提取从未有保证的执行期。我建议你向你的设备发送静默推送,让它有机会报告位置,但如果应用程序被终止,这将不起作用
  • 它从未得到保证,但至少它曾经更频繁地工作。自 iOS 7 以来,是否有一些与后台提取相关的重大变化?
  • 返回给完成处理程序的价值是什么?新数据还是没有新数据?根据我的经验,即使在 iOS8 上,它也不是每 20-30 分钟调用一次。
  • 如果您只需要 SLC 并且手机在最后一个小时内没有明显移动,您就不能假设它根本没有移动吗?虽然不一定是这种情况,但只要它发生显着变化,您就会再次收到通知。
  • 当后端确定用户在错误的位置时,手机可能会死机和移动而不是充电

标签: ios iphone locationmanager


【解决方案1】:

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

  • 您在处理程序中花费的时间
  • 结果(NoData、NewData)
  • 错误处理(如果代码崩溃,您将不太可能启动
  • 超时(您的代码执行可能会被 iOS 中断)
  • 用电量
  • 与结果相关的网络活动(当你说你有 NewData 时,你必须做一个网络请求,否则你的 fetch 可能会在一天内的下一次执行,或者永远不会执行。

快速、准确地下载少量内容的应用 反映他们何时有内容可供下载,更有可能 比需要很长时间的应用程序在未来获得执行时间 是时候下载他们的内容或声称内容可用 但不要下载任何东西。

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

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

【讨论】:

    【解决方案2】:

    我从事过一个类似的项目。在尝试了各种解决方案之后,我发现的唯一方法是这里提出的解决方案: https://github.com/voyage11/Location

    这里是git对应的教程: http://mobileoop.com/getting-location-updates-for-ios-7-and-8-when-the-app-is-killedterminatedsuspended

    所有学分https://stackoverflow.com/users/1995940/ricky

    它为我节省了很多时间!

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      相关资源
      最近更新 更多