步骤:
1.在info.plist里加入UIBackgroundModes键,其值为数组,数组之一为voip字符串:
<key>UIBackgroundModes</key><array><string>voip</string></array>
2.在程序启动的时候调用- (void)setupBackgroundHandler函数,函数体如下:
#pragma mark - VoIP - ( void )setupBackgroundHandler
{ if ( UIUDeviceIsBackgroundSupported() )
if (
[[UIApplication sharedApplication] setKeepAliveTimeout:600 handler: ^
{
[ self requestServerHowManyUnreadMessages];
}
]
)
{
UDLog(@ "Set Background handler successed!" );
}
else
{ //failed
UDLog(@ "Set Background handler failed!" );
}
}
else
{
UDLog(@ "This Deviece is not Background supported." );
}
} - ( void )requestServerHowManyUnreadMessages
{ UIApplication* app = [UIApplication sharedApplication];
if ([app applicationState] == UIApplicationStateBackground)
{
NSArray * oldNotifications = [app scheduledLocalNotifications];
if ([oldNotifications count] > 0)
[app cancelAllLocalNotifications];
UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease];
if (alarm)
{
alarm.fireDate = [ NSDate dateWithTimeIntervalSinceNow:15];
alarm.timeZone = [ NSTimeZone defaultTimeZone];
alarm.repeatInterval = 0;
alarm.soundName = UILocalNotificationDefaultSoundName;
alarm.alertBody = @ "Time to request MOA2 Server!" ;
[app scheduleLocalNotification:alarm];
}
}
else if ([app applicationState] == UIApplicationStateActive)
{
UIAlertView *alertView = [[[UIAlertView alloc] init] autorelease];
[alertView setTitle:@ "alert" ];
[alertView setMessage:@ "Time to request MOA2 Server!" ];
[alertView addButtonWithTitle: NSLocalizedString (@ "cancel" , nil )];
[alertView setDelegate: nil ];
[alertView show];
}
} |
解说:
- (BOOL)setKeepAliveTimeout:(NSTimeInterval)timeout handler:(void (^)(void))keepAliveHandler
函数功能:app每隔timeout唤醒一次。
0.要成功调用该函数,就必须在Info.plist里设UIBackgroundModes键的array值之一voip字符串.
1.timeout必须>=600
2.唤醒app的时间间隔是不精准的。
3.唤醒后只有10秒执行时间。即handler里的代码要在10秒类执行完。10秒后app再次被阻塞。
(可以用-backgroundTimeRemaining属性来返回剩余时间)
4.该函数成功调用后,在程序生命周期内有效。
该函数的效果在回到前台的状况下,依然有效。(因此可以把它当timer使.)
5.clearKeepAliveTimeout函数用来清除handler。