iOS 项目一直在后台执行
我后来是这么解决不知道行不行,能够长期的在后台执行
首先我在xx-info.plist 里的 "Required background modes" 里增加"App provides Voice over IP services"
首先我在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 |
} |