您的位置:首页 > 其它

iPhone的后台执行任务

2014-09-22 10:04 375 查看
iPhone的后台执行任务

当App进入到后台时,可以有一段时间做处理工作。

或者,对于某些服务,可以长时间运行,比如播放音乐。

对于长时间运行的任务,需要在Info.plist添加一行,键为UIBackgroundModes,值为一个数组,可以包含如下几个字符串:

audio
location
voip
newsstand-content
external-accessory
bluetooth-central



然后,在后台就可以做一些事情了:

[cpp] view
plaincopy

- (void)applicationDidEnterBackground:(UIApplication *)application

{

// Use this method to release shared resources,save user data,invalidate timers,and store enough application state information to restore your application to its current state in case it is terminated later.

// If your application supports background execution,this method is called instead of applicationWillTerminate: when the user quits.

UIDevice *device = [UIDevicecurrentDevice];

BOOL backgroundSupported = NO;

if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {

backgroundSupported = YES;

}

__blockUIBackgroundTaskIdentifier bgTaskId = [application beginBackgroundTaskWithExpirationHandler:^{

[application endBackgroundTask:bgTaskId];

bgTaskId = UIBackgroundTaskInvalid;

}];

if (backgroundSupported) {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

//

});

}

}

步骤:

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: