在我的应用程序中,我每分钟都会从服务器获取更新。对于后台我正在使用代码
UIApplication* app = [UIApplication sharedApplication];
bti = [app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Debug - Ending background task %d",bti);
[app endBackgroundTask:bti];
NSLog(@"Debug - Background task %d ended",bti);
bti = UIBackgroundTaskInvalid;
}];
NSLog(@"Debug - Starting background task %d",bti);
[NSTimer scheduledTimerWithTimeInterval:60.0 target: self
selector: @selector(anyTask) userInfo:nil repeats: YES];
但是应用程序在一段时间后终止并获得日志
{(
<BKProcessAssertion: 0x15ddbf50> identifier: Background Content Fetching (79) process: DemoApp[628] permittedBackgroundDuration: 30.000000 reason: backgroundContentFetching owner pid:33 preventSuspend preventThrottleDownUI preventIdleSleep preventSuspendOnSleep
)}
我也使用了这样的背景提取:
-(void)application:(UIApplication *)application
performFetchWithCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"Background fetch started...");
[self repeatTask];
// //---do background fetch here---
NSLog(@"Background fetch completed...");
}
任何帮助将不胜感激:)
答案 0 :(得分:3)
您无法使用此技术无限期地在后台运行。您可以使用后台获取模式来允许您的应用轮询您的服务器(但频率将是几分钟或几小时),或者您可以让服务器使用推送通知来提醒您的应用有新内容。您当前的方法不是非常适合电池使用
如果您要使用后台获取模式,则需要使用相应的结果调用提供的completionHandler
-
completionHandler(UIBackgroundFetchResultNewData);
或
completionHandler(UIBackgroundFetchResultNoData);
或
completionHandler(UIBackgroundFetchResultFailed);
在performFetchWithCompletionHandler:
例如
-(void)application:(UIApplication *)application
performFetchWithCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"Background fetch started...");
if ([self repeatTask]) { // //---do background fetch here--- returns YES if new data
completionHandler(UIBackgroundFetchResultNewData);
}
else {
completionHandler(UIBackgroundFetchResultNoData);
}
NSLog(@"Background fetch completed...");
}