IOS在后台每隔一段时间执行一下
步骤:
1.在info.plist里加入UIBackgroundModes键,其值为数组,数组之一为voip字符串:
<key>UIBackgroundModes</key><array><string>voip</string></array>
2.在程序启动的时候调用- (void)setupBackgroundHandler函数,函数体如下:
#pragma - 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。