【发布时间】: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