根據蘋果文檔中關於後臺執行的描述,任何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:
UIBackgroundModes
voip
我測試瞭以下代碼:
定義一個:
@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];
}
此方法經測試不是很穩定,而且頻繁進入退出會加快後臺方法執行的次數,希望大神有更好方法