iOS 后台运行

 IOS允许长时间在后台运行的情况有7种:

  audio

  VoIP

  GPS

  下载新闻

  和其它附属硬件进行通讯时

  使用蓝牙进行通讯时

  使用蓝牙共享数据时

  除以上情况,程序退出时可能设置短暂运行10分钟

  让程序退出后台时继续运行10分钟

  在XXAppDelegate中增加:UIBackgroundTaskIdentifier bgTask;
 

  1.  - (void)applicationDidEnterBackground:(UIApplication *)application
  2.   {
  3.   bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
  4.   // 10分钟后执行这里,应该进行一些清理工作,如断开和服务器的连接等
  5.   // ...
  6.   // stopped or ending the task outright.
  7.   [application endBackgroundTask:bgTask];
  8.   bgTask = UIBackgroundTaskInvalid;
  9.   }];
  10.   if (bgTask == UIBackgroundTaskInvalid) {
  11.   NSLog(@"failed to start background task!");
  12.   }
  13.   // Start the long-running task and return immediately.
  14.   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  15.   // Do the work associated with the task, preferably in chunks.
  16.   NSTimeInterval timeRemain = 0;
  17.   do{
  18.   [NSThread sleepForTimeInterval:5];
  19.   if (bgTask!= UIBackgroundTaskInvalid) {
  20.   timeRemain = [application backgroundTimeRemaining];
  21.   NSLog(@"Time remaining: %f",timeRemain);
  22.   }
  23.   }while(bgTask!= UIBackgroundTaskInvalid && timeRemain > 0); // 如果改为timeRemain > 5*60,表示后台运行5分钟
  24.   // done!
  25.   // 如果没到10分钟,也可以主动关闭后台任务,但这需要在主线程中执行,否则会出错
  26.   dispatch_async(dispatch_get_main_queue(), ^{
  27.   if (bgTask != UIBackgroundTaskInvalid)
  28.   {
  29.   // 和上面10分钟后执行的代码一样
  30.   // ...
  31.   // if you don't call endBackgroundTask, the OS will exit your app.
  32.   [application endBackgroundTask:bgTask];
  33.   bgTask = UIBackgroundTaskInvalid;
  34.   }
  35.   });
  36.   });
  37.   }
  38.   - (void)applicationWillEnterForeground:(UIApplication *)application
  39.   {
  40.   // 如果没到10分钟又打开了app,结束后台任务
  41.   if (bgTask!=UIBackgroundTaskInvalid) {
  42.   [application endBackgroundTask:bgTask];
  43.   bgTask = UIBackgroundTaskInvalid;
  44.   }
  45.   }
复制代码

  后台时,如果某些代码你不希望执行,可以加以下条件:
 
  1.  UIApplication *application = [UIApplication sharedApplication];
  2.   if( application.applicationState == UIApplicationStateBackground) {
  3.   return;
  4.   }
复制代码

  有的app虽然我们不允许通知,但还是会弹出消息,应该是设置了定时器,到某一时间就让程序后台运行一会,从服务器更新数据,然后显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值