IOS在后台每隔一段时间执行一下

时间:2021-12-26 06:30:49

IOS在后台每隔一段时间执行一下

步骤:

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。