我后来是这么解决不知道行不行,能够长期的在后台执行
首先我在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
|
}
|