根據(jù)蘋果文檔中關(guān)于后臺執(zhí)行的描述,任何app都有10分鐘左右的后臺任務(wù)執(zhí)行時間磷脯。 10分鐘后蛾找,app會被iOS強行掛起。
但是赵誓,有5類app允許有“無限的”后臺運行時間:
1.? Audio打毛。
2.? Location/GPS柿赊。
3.? VoIP。
4.? Newsstand幻枉。
5.? Exernal Accessory 碰声。
你可以將任何app聲明為上述5種類型以獲得無限的后臺運行時間,但當(dāng)你提交app到App Store時熬甫,蘋果會審查你的app胰挑,一旦發(fā)現(xiàn)你“濫用”了后臺API,你的app將被拒絕椿肩。
當(dāng)然洽腺,對于企業(yè)開發(fā)而言,不存在“濫用”的問題——企業(yè)app可以通過OTA部署覆旱,不經(jīng)過蘋果商店審查蘸朋。
在企業(yè)部署中,你可以將一個app聲明為VoIP扣唱,但這個程序根本和VoIP無關(guān)藕坯,我們的目的只是為了讓iOS給我們無限后臺執(zhí)行的權(quán)限。聲明過程是在app的Info.plist文件中加入以下key:
首先在plist文件中的Required background modes這一項中新增以下兩項:App play audio or streams audio/video using AirPlay和App provides Voice over IP services 噪沙。
UIBackgroundModes
voip
我測試了以下代碼:
- (void)backgroundHandler {
NSLog(@"### -->backgroundinghandler");
UIApplication*app = [UIApplicationsharedApplication];
bgTask= [appbeginBackgroundTaskWithExpirationHandler:^{
[appendBackgroundTask: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
{
BOOLbackgroundAccepted = [[UIApplicationsharedApplication]setKeepAliveTimeout:600handler:^{ [selfbackgroundHandler]; }];
if(backgroundAccepted)
{
NSLog(@"backgrounding accepted");
}
[selfbackgroundHandler];
}
通過測試炼彪,我獲得了“無限的”后臺執(zhí)行時間。我不知道你認為“無限”到底是多長時間正歼,但在這個例子中辐马,后臺任務(wù)至少運行了55個小時以上,一直到我失去耐心停止測試局义。