我後來是這麼解決不知道行不行,可以長期的在後台運行
首先我在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 }