zoukankan      html  css  js  c++  java
  • (原)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。

      



     

  • 相关阅读:
    HDU 5640 King's Cake
    HDU 5615 Jam's math problem
    HDU 5610 Baby Ming and Weight lifting
    WHU1604 Play Apple 简单博弈
    HDU 1551 Cable master 二分
    CodeForces659C Tanya and Toys map
    Codeforces 960E 树dp
    gym 101485E 二分匹配
    Codeforces 961E 树状数组,思维
    Codeforces Round #473 (Div. 2) D 数学,贪心 F 线性基,模板
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/2518178.html
Copyright © 2011-2022 走看看