(原)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。

  



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM