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函数,函数体如下:
解说:
- (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。
当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。
相关文章推荐
- 在iPhone上执行后台任务
- 在iPhone上执行后台任务
- 在iPhone上执行后台任务
- windows计划任务后台定时执行java的jar文件
- 在ASP.NET应用中执行后台任务
- android: 后台执行的定时任务
- 后台执行命令:&和nohup command & 以及关闭、查看后台任务
- iphone OS 4.0操作系统中多任务~禁止后台执行的方法
- ios iphone 详解在IOS后台执行
- .net后台自动执行任务
- Android后台执行定时任务
- 背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知)
- 关于iOS 后台执行任务
- android: 后台执行的定时任务
- php运用curl触发后台脚本不超时执行某项任务
- 使用Swing Worker线程 --执行后台任务的新方法
- 玩玩Linux云主机-linux后台运行和关闭、查看后台任务,关闭终端后继续执行
- MVP 2015社区大讲堂之:在ASP.NET应用中执行后台任务
- 使用Screen后台执行任务,防止SSH中断
- 批处理在任务计划中重复执行, 并且后台运行的实现