背景模式在iOS 8中不起作用

时间:2014-10-07 08:25:40

标签: ios background xcode6

在我的应用程序中,我每分钟都会从服务器获取更新。对于后台我正在使用代码

 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...");

}

任何帮助将不胜感激:)

1 个答案:

答案 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...");
}