根據蘋果文檔中關於後台執行的描述,任何app都有10分鐘左右的後台任務執行時間。 10分鐘後,app會被iOS強行掛起。
但是,有5類app允許有“無限的”後台運行時間:
1. Audio。
2. Location/GPS。
3. VoIP。
4. Newsstand。
5. Exernal Accessory 。
你可以將任何app聲明為上述5種類型以獲得無限的後台運行時間,但當你提交app到App Store時,蘋果會審查你的app,一旦發現你“濫用”了後台API,你的app將被拒絕。
當然,對於企業開發而言,不存在“濫用”的問題——企業app可以通過OTA部署,不經過蘋果商店審查。
在企業部署中,你可以將一個app聲明為VoIP,但這個程序根本和VoIP無關,我們的目的只是為了讓iOS給我們無限後台執行的權限。聲明過程是在app的Info.plist文件中加入以下key:
我測試了以下代碼:
定義一個:
@implementation AppDelegate
{
UIBackgroundTaskIdentifier bgTask;
NSUInteger counter;
}
- (void)backgroundHandler {
NSLog(@"### -->backgroundinghandler");
UIApplication* app = [UIApplicationsharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (1) {
NSLog(@"counter:%ld", counter++);
sleep(1);
}
});
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
BOOL backgroundAccepted = [[UIApplicationsharedApplication] setKeepAliveTimeout:600 handler:^{ [selfbackgroundHandler]; }];
if (backgroundAccepted)
{
NSLog(@"backgrounding accepted");
}
[selfbackgroundHandler];
}
此方法經測試不是很穩定,而且頻繁進入退出會加快後台方法執行的次數,希望大神有更好方法