iOS后台网络任务


在iOS系统,App的前台运行和后台运行,行为是不同的,iOS操作系统对后台运行做了诸多限制,为了能够让系统运行更流程和更省电。

App的状态如下图:



对于后台运行,首先需要确定设备是否支持多任务,在iOS4.0 之前是否没办法做到多任务的,不过现在iOS4.0的设备已经很少了。

  1. UIDevice* device = [UIDevice currentDevice];  
  2. BOOL backgroundSupported = NO;  
  3. if ([device respondsToSelector:@selector(isMultitaskingSupported)])  
  4.     backgroundSupported = device.multitaskingSupported;  

有三种方式可以在App切后台后,获得后台执行,第一种是执行有限时间的后台任务,第二种通过本地通知执行定时任务,第三种执行长运行后台任务(系统开发的音乐播放等)

第一种,使用 beginBackgroundTaskWithExpirationHandler:在 applicationDidEnterBackground里调用

  1. - (void)applicationDidEnterBackground:(UIApplication *)application  
  2. {  
  3.     // 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.   
  4.     // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.  
  5.      bgTask = [application beginBackgroundTaskWithExpirationHandler:^{  
  6.         // Clean up any unfinished task business by marking where you  
  7.         // stopped or ending the task outright.  
  8.         [application endBackgroundTask:bgTask];  
  9.         bgTask = UIBackgroundTaskInvalid;  
  10.     }];  
  11.       
  12.     // Start the long-running task and return immediately.  
  13.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  14.           
  15.         // Do the work associated with the task, preferably in chunks.  
  16.         // your code  
  17.         NSLog(@" %f",application.backgroundTimeRemaining);  
  18.         [application endBackgroundTask:bgTask];  
  19.         bgTask = UIBackgroundTaskInvalid;  
  20.     });  
  21.   
  22. }  
第二种,使用本地系统通知

  1. - (void)scheduleAlarmForDate:(NSDate*)theDate  
  2.     {  
  3.         UIApplication* app = [UIApplication sharedApplication];  
  4.         NSArray*    oldNotifications = [app scheduledLocalNotifications];  
  5.         // Clear out the old notification before scheduling a new one.  
  6.         if ([oldNotifications count] > 0)  
  7.             [app cancelAllLocalNotifications];  
  8.         // Create a new notification.  
  9.         UILocalNotification* alarm = [[UILocalNotification alloc] init];  
  10.         if (alarm)  
  11.         {  
  12.             alarm.fireDate = theDate;  
  13.             alarm.timeZone = [NSTimeZone defaultTimeZone];  
  14.             alarm.repeatInterval = 0;  
  15.             alarm.soundName = @"alarmsound.caf";  
  16.             alarm.alertBody = @"Time to wake up!";  
  17.               
  18.             [app scheduleLocalNotification:alarm];  
  19.         }  
  20.     }  

第三种调用系统指定的后台运行任务,有一下这些,例如GPS 音乐等

      Apps that play audible content to the user while in the background, such as a music player app

      Apps that record audio content while in the background.

      Apps that keep users informed of their location at all times, such as a navigation app

      Apps that support Voice over Internet Protocol (VoIP)

      Apps that need to download and process new content regularly

      Apps that receive regular updates from external accessories


在项目中,我用的是第一种,大致就是每次在app在切后台,发送一些网络请求去server,遇到个问题,就是如果采用异步方式发送请求时,未等App收到回复,程序已切到后台,所以把其改成同步请求,如:

  1. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];  
  2. NSError *error;  
  3. NSURLResponse *response;  
  4. NSData *data= [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];  
可正常收到response,暂时解决了个问题。但对于有数个请求,执行效率是一个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值