我正在尝试让 iOS 后台应用程序获取在我的应用程序中工作。在 Xcode 中测试时它可以工作,但在设备上运行时却不行!
- 我的测试设备正在运行 iOS 9.3.5(我的部署目标是 7.1)
- 我在 Xcode 中目标的“功能”下的“后台模式”下启用了“后台获取”
在应用程序中:didFinishLaunchingWithOptions 我尝试了使用 setMinimumBackgroundFetchInterval 的各种间隔,包括 UIApplicationBackgroundFetchIntervalMinimum
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// tell the system we want background fetch
//[application setMinimumBackgroundFetchInterval:3600]; // 60 minutes
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
//[application setMinimumBackgroundFetchInterval:1800]; // 30 minutes
return YES;
}
我已经实现了应用程序:performFetchWithCompletionHandler
void (^fetchCompletionHandler)(UIBackgroundFetchResult);
NSDate *fetchStart;
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
fetchCompletionHandler = completionHandler;
fetchStart = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:fetchStart forKey:kLastCheckedContentDate];
[[NSUserDefaults standardUserDefaults] synchronize];
[FeedParser parseFeedAtUrl:url withDelegate:self];
}
-(void)onParserFinished
{
DDLogVerbose(@"AppDelegate/onParserFinished");
UIBackgroundFetchResult result = UIBackgroundFetchResultNoData;
NSDate *fetchEnd = [NSDate date];
NSTimeInterval timeElapsed = [fetchEnd timeIntervalSinceDate:fetchStart];
DDLogVerbose(@"Background Fetch Duration: %f seconds", timeElapsed);
if ([self.mostRecentContentDate compare:item.date] < 0) {
DDLogVerbose(@"got new content: %@", item.date);
self.mostRecentContentDate = item.date;
[self scheduleNotificationWithItem:item];
result = UIBackgroundFetchResultNewData;
}
else {
DDLogVerbose(@"no new content.");
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
localNotification.alertBody = [NSString stringWithFormat:@"Checked for new posts in %f seconds", timeElapsed];
localNotification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
fetchCompletionHandler(result);
}
我已经(成功!)使用 Xcode 的 Debug/SimulateBackgroundFetch 对模拟器和设备进行了测试
我已经成功测试了另一个 SO 答案( https://stackoverflow.com/a/29923802/519030)中所示的新方案
- 我的测试显示在 performFetch 方法中执行的代码大约需要 0.3 秒(所以不需要很长时间)
- 我已验证设备在设置中启用了后台刷新。
- 当然,我已经查看了其他 SO 问题,希望其他人也经历过同样的事情。:)
在设备上运行且未连接到 Xcode 时,我的代码未执行。我打开了应用程序,关闭了应用程序(没有杀死应用程序!),等待了数小时和数天。我已经尝试登录 fetch 处理程序,并且还编写了代码来发送本地通知。
我曾经在设备上成功地看到了我的本地通知测试,实际上 iOS 似乎触发了 3 次获取,每次大约相隔 15 分钟,但之后再也没有发生过。
我知道用于确定允许后台获取发生的频率的算法是一个谜,但我希望它至少偶尔会在几天内运行。
我不知道还有什么要测试的,或者如何解决为什么它似乎在模拟器中工作而不是在设备上工作。
感谢任何建议!