我後來是這麼解決不知道行不行,可以長期的在後台運行
首先我在xx-info.plist 裡的 "Required background modes" 裡加入"App provides Voice over IP services"
然後在delegate裡加入以下代碼,原理是進入後台時程序會在600秒那樣結束任務,我做的就是在結束任務前新開一個任務,再結束舊任務,這樣就一直的在後台運行,希望可能幫助到更多的人,我也查了很久才找到這個方法的。
UIBackgroundTaskIdentifier backgroundTaskIdentifier; 02 UIBackgroundTaskIdentifier oldBackgroundTaskIdentifier; 03 04 - (BOOL) isMultitaskingSupported{ 05 06 BOOL result = NO; 07 08 if ([[UIDevice currentDevice] 09 10 respondsToSelector:@selector(isMultitaskingSupported)]){ result = [[UIDevice currentDevice] isMultitaskingSupported]; 11 12 } 13 14 return result; 15 16 } 17 18 - (void) timerMethod:(NSTimer *)paramSender{ 19 count++; 20 if (count % 500 == 0) { 21 UIApplication *application = [UIApplication sharedApplication]; 22 23 //開啟一個新的後台 24 25 backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ 26 27 }]; 28 //結束舊的後台任務 29 [application endBackgroundTask:backgroundTaskIdentifier]; 30 oldBackgroundTaskIdentifier = backgroundTaskIdentifier; 31 } 32 NSLog(@"%ld",count); 33 } 34 - (void)applicationDidEnterBackground:(UIApplication *)application 35 { 36 if ([self isMultitaskingSupported] == NO){ 37 38 return; } 39 //開啟一個後台任務 40 41 backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ 42 }]; 43 oldBackgroundTaskIdentifier = backgroundTaskIdentifier; 44 if ([self.myTimer isValid]) { 45 [self.myTimer invalidate]; 46 } 47 self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES]; 48 } 49 50 - (void)applicationWillEnterForeground:(UIApplication *)application 51 { 52 if (backgroundTaskIdentifier != UIBackgroundTaskInvalid){ 53 [application endBackgroundTask:backgroundTaskIdentifier]; 54 if ([self.myTimer isValid]) { 55 [self.myTimer invalidate]; 56 } 57 } 58 } 59 60 - (void)applicationWillEnterForeground:(UIApplication *)application 61 { 62 if (backgroundTaskIdentifier != UIBackgroundTaskInvalid){ 63 [application endBackgroundTask:backgroundTaskIdentifier]; 64 if ([self.myTimer isValid]) { 65 [self.myTimer invalidate]; 66 } 67 } 68 }