在 iOS 中安排一个 ersatz 后台获取
Scheduling an ersatz background fetch in iOS
我正在尝试让我的应用程序在特定的预定时间执行后台提取。我有让 iOS 自己解决这个问题的想法,所以(在 AppDelegate 中):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeSound categories:nil]];
}
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
return YES;
}
然后(也在 AppDelegate 中)
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSDate *now = [NSDate date];
if ((([now timeIntervalSinceDate:lastCheckTime]/60) > 60)||(!lastCheckTime)) { //don't update more than once every hour
lastCheckTime = now;
[notificationUpdate getStatusUpdateWithCompletionHandler:completionHandler];
} else {
completionHandler(UIBackgroundFetchResultNewData);
}
}
如果我在 Xcode 中手动启动背景检查,则效果很好。可悲的是,如果我只是把它留给自己的设备,它就不能完美地工作。
我如何安排我的 getStatusUpdate 函数的执行时间或导致后台提取在特定时间发生(现实生活中的用例是应用程序将在用户定义的时间左右检查,就像一个闹钟 - 这不会 运行 一直都在消耗电池)
我在互联网上发现了很多关于安排警报的内容(包括这里 - 我在这里找到了一个示例,建议使用 CoreLocation 来触发后台提取 - 我不知道这是否可行,但是,对于节电的原因,我不喜欢这个主意。) - 但这只会导致屏幕上显示警报,我不想显示警报 - 至少在我检查状态之前不会更新。
一如既往,我们将非常感谢您的帮助(但我担心答案是我做不到我想做的事!)。
你不能为所欲为。唯一的解决方法是实施推送通知并让 API 在指定时间发送推送。
我正在尝试让我的应用程序在特定的预定时间执行后台提取。我有让 iOS 自己解决这个问题的想法,所以(在 AppDelegate 中):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeSound categories:nil]];
}
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
return YES;
}
然后(也在 AppDelegate 中)
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSDate *now = [NSDate date];
if ((([now timeIntervalSinceDate:lastCheckTime]/60) > 60)||(!lastCheckTime)) { //don't update more than once every hour
lastCheckTime = now;
[notificationUpdate getStatusUpdateWithCompletionHandler:completionHandler];
} else {
completionHandler(UIBackgroundFetchResultNewData);
}
}
如果我在 Xcode 中手动启动背景检查,则效果很好。可悲的是,如果我只是把它留给自己的设备,它就不能完美地工作。
我如何安排我的 getStatusUpdate 函数的执行时间或导致后台提取在特定时间发生(现实生活中的用例是应用程序将在用户定义的时间左右检查,就像一个闹钟 - 这不会 运行 一直都在消耗电池)
我在互联网上发现了很多关于安排警报的内容(包括这里 - 我在这里找到了一个示例,建议使用 CoreLocation 来触发后台提取 - 我不知道这是否可行,但是,对于节电的原因,我不喜欢这个主意。) - 但这只会导致屏幕上显示警报,我不想显示警报 - 至少在我检查状态之前不会更新。
一如既往,我们将非常感谢您的帮助(但我担心答案是我做不到我想做的事!)。
你不能为所欲为。唯一的解决方法是实施推送通知并让 API 在指定时间发送推送。