iOS Swift && Objective-CiOS程序猿iOS Developer

iOS-app进入后台申请10分钟活跃时间

2016-09-20  本文已影响2042人  卟师

IOS允许长时间在后台运行的情况有7种:

audio

VoIP

GPS

下载新闻

和其它附属硬件进行通讯时

使用蓝牙进行通讯时

使用蓝牙共享数据时

除以上情况,程序退出时可能设置短暂运行10分钟

让程序退出后台时继续运行10分钟

在XXAppDelegate中增加:UIBackgroundTaskIdentifier bgTask;

- (void)applicationDidEnterBackground:(UIApplication *)application{    
            bgTask = [application beginBackgroundTaskWithExpirationHandler:^{      
                          // 10分钟后执行这里,应该进行一些清理工作,如断开和服务器的连接等      
                          // ...      
                          // stopped or ending the task outright.      
                         [application endBackgroundTask:bgTask];      
                         bgTask = UIBackgroundTaskInvalid;  
               }];  
             if (bgTask == UIBackgroundTaskInvalid) {      
                         NSLog(@"failed to start background task!");  
              }  
             // Start the long-running task and return immediately.                          
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
// Do the work associated with the task, preferably in chunks.  
NSTimeInterval timeRemain = 0;  
do{  
[NSThread sleepForTimeInterval:5];  
if (bgTask!= UIBackgroundTaskInvalid) {  
timeRemain = [application backgroundTimeRemaining];  
NSLog(@"Time remaining: %f",timeRemain);  
}  
}while(bgTask!= UIBackgroundTaskInvalid && timeRemain > 0); // 如果改为timeRemain > 5*60,表示后台运行5分钟   
// done!  
// 如果没到10分钟,也可以主动关闭后台任务,但这需要在主线程中执行,否则会出错  
dispatch_async(dispatch_get_main_queue(), ^{  
if (bgTask != UIBackgroundTaskInvalid){   
// 和上面10分钟后执行的代码一样   
// ...  
// if you don't call endBackgroundTask, the OS will exit your app.   
[application endBackgroundTask:bgTask];  
bgTask = UIBackgroundTaskInvalid;  
}  
});  
});
}
- (void)applicationWillEnterForeground:(UIApplication *)application{  
// 如果没到10分钟又打开了app,结束后台任务  
if (bgTask!=UIBackgroundTaskInvalid) {  
[application endBackgroundTask:bgTask];    bgTask = UIBackgroundTaskInvalid;  
}
}

后台时,如果某些代码你不希望执行,可以加以下条件:

UIApplication *application = [UIApplication sharedApplication];
if( application.applicationState == UIApplicationStateBackground) {
        return;
}
​有的app虽然我们不允许通知,但还是会弹出消息,应该是设置了定时器,到某一时间就让程序后台运行一会,从服务器更新数据,然后显示出来。
上一篇下一篇

猜你喜欢

热点阅读