https://www.jianshu.com/p/d466f2da0d33

在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就是切换一下系统界面都会觉得卡;苹果手机不论开多少app在后台都感觉很流畅.

这是因为安卓默认处理app为真后台,可以一直在后台处理操作;

而iOS为了让设备尽量省电,减少不必要的开销,保持系统流畅,因而对后台机制采用墓碑式的“假后台”。除了系统官方极少数程序可以真后台,一般开发者开发出来的应用程序后台受到以下限制:

1.用户按Home之后,App转入后台进行运行,此时拥有180s后台时间(iOS7)或者600s(iOS6)运行时间可以处理后台操作

2.当180S或者600S时间过去之后,可以告知系统未完成任务,需要申请继续完成,系统批准申请之后,可以继续运行,但总时间不会超过10分钟

3.当10分钟时间到之后,无论怎么向系统申请继续后台,系统会强制挂起App,挂起所有后台操作、线程,直到用户再次点击App之后才会继续运行

iOS系统app如何实现在后台长时间运行

比较常用的可以实现“真后台”的方法:

1.VOIP 2.定位服务 3.后台下载 4.在后台循环播放无声音乐

目前我接手的项目是视频点播类项目,需要在app进入后台也可以保持电视播放剧集,并在回到前台后更新进度条进度,并且每60s对后台发送心跳包,保持长连接,所以需要实现真后台.

使用了第4种方式,静音播放,上架之前多次被拒但最终通过了审核.

如何通过了审核

上架的时候,标注是视频点播类app,此app类似于电视遥控器,

起初一进入后台就循环播放无声音乐,所以苹果方一直以播放视频和音频没有声音拒绝.

但是为了保持真后台,必须是类似音乐播放器一类的可以后台播放声音的app.

所以第一次上架时,点击播放后退到后台会在后台循环播放一个有声音的MP3,

在通过了审核后,立刻更新一个版本,把有声音的MP3文件换成一个无声音的MP3

此时苹果测试人员审核不会像第一次审核那么严格,通过了.

具体实现:首先我们看看app进入后台进入前台的几个常用方法

#pragma mark - 程序将要进入后台(墓碑状态)

- (void)applicationWillResignActive:(UIApplication *)application {

}

#pragma mark - 程序进入后台

- (void)applicationDidEnterBackground:(UIApplication *)application {

}

#pragma mark - 程序将要进入前台

- (void)applicationWillEnterForeground:(UIApplication *)application {

}

#pragma mark - 程序进入前台

- (void)applicationDidBecomeActive:(UIApplication *)application {

}

配置plist文件背景播放的支持:

在AppDelegate中实现大概:

//进入后台

- (void)applicationDidEnterBackground:(UIApplication *)application

{

NSLog(@"%s",__FUNCTION__);

//设置永久后台运行

UIApplication *app = [UIApplication sharedApplication];

__block   UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

//不管有没有完成,结束bgTask任务

[application endBackgroundTask:bgTask];

dispatch_async(dispatch_get_main_queue(), ^{

if (bgTask != UIBackgroundTaskInvalid)

{

bgTask = UIBackgroundTaskInvalid;

}

});

}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

dispatch_async(dispatch_get_main_queue(), ^{

if (bgTask != UIBackgroundTaskInvalid)

{

bgTask = UIBackgroundTaskInvalid;

}

});

});

//当只有点播了时才会退到后台,如果不点播则后台不开启,以省电

if ([CJGloblePlayer defaultGloblePlayer].runningPlayer.isPlaying)

{

//开启后台任务

[self applyBackgrounTaskTime];

//UI停止更新

[[CJTopPlayView sharePlayView].rotaionView stopRotation];

}

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSLog(@"Starting background task with %0.1f seconds remaining", application.backgroundTimeRemaining);

[NSThread sleepForTimeInterval:600];

NSLog(@"Finishing background task with %0.1f seconds remaining",application.backgroundTimeRemaining);

//告诉系统我们完成了 也就是要告诉应用程序:“好借好还”嘛。

//将任务标记为完成

[application endBackgroundTask:bgTask];

// 销毁后台任务标识符

bgTask = UIBackgroundTaskInvalid;

});

}

//开启后台任务

- (void)applyBackgrounTaskTime

{

//__block UIBackgroundTaskIdentifier background_task;

UIApplication *application = [UIApplication sharedApplication];

//注册一个后台任务,告诉系统我们需要向系统借一些事件

background_task = [application beginBackgroundTaskWithExpirationHandler:^ {

//不管有没有完成,结束background_task任务

[application endBackgroundTask: background_task];

background_task = UIBackgroundTaskInvalid;

}];

//异步

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//### background task starts

NSLog(@"Running in the background\n");

//循环播放无声的MP3

[[CJBackGroundAudioVC shareInstance] backGroundStart];

[NSThread sleepForTimeInterval:2];

//结束background_task任务

[application endBackgroundTask: background_task];

background_task = UIBackgroundTaskInvalid;

});

}

//播放MP3

- (void)backGroundStart

{

[self playAudio:[[NSBundle mainBundle] pathForResource:@"silence" ofType:@"mp3"]];

}

//程序进入前台

- (void)applicationDidBecomeActive:(UIApplication *)application

{

//后台保持app一直运作的播放器停止工作

[[CJBackGroundAudioVC shareInstance] backGroundStop];

//全局播放器开始播放,更新UI

if ([CJGloblePlayer defaultGloblePlayer].runningPlayer.playstate == psPlaying)

{

[[CJTopPlayView sharePlayView].rotaionView startRotation];

}

}

若有不妥之处,恭请评论多多指教.

参考相关链接:

http://www.jianshu.com/p/174fd2673897

http://blog.csdn.net/weiwangchao_/article/details/8316641

http://blog.sina.com.cn/s/blog_7b9d64af0101cjci.html

作者:oldSix_Zhu

链接:https://www.jianshu.com/p/d466f2da0d33

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/sundaysgarden/p/10485745.html

iOS保持App真后台运行相关推荐

  1. IOS实现Voip应用后台运行需要的几个配置项

    转自出处:http://blog.csdn.net/wzzvictory/article/details/8815590 IOS实现Voip应用后台运行需要的几个配置项 作者:wangzz 原文地址: ...

  2. 怎样防止App在后台运行,点击应用桌面图标重新启动

    在项目中,遇到一个问题百思不得其解,那就是:我在app使用过程中,点击了home键,然后去看看微信之类的其他应用,这个时候再点击app桌面的图标,这个时候app是重新启动的,而不是从上次停止的界面开始 ...

  3. 解决:Android App 在运行时候按下 home 键,让App 在后台运行,点击图标再次进入时防止应用重新启动

    一些体验上的优化 一:app 退出时,让 app 在后台运行,类似于 home 键的功能,最小化 二:Android 点击 Home 键后再点击 APP 图标,APP 显示退出之前的界面 一:app ...

  4. ionic+vue+capacitor系列笔记--02项目中集成Capacitor,添加android,ios平台,真机运行项目

    Capacitor是什么? Capacitor是由ionic团队开发的一款跨平台移动应用构建工具,可轻让我们轻松的构建Android.iOS.Electron和Web应用程序. Capacitor是A ...

  5. android app锁定后台运行的方法

    想直接看图操作,可以android 下一个 小米穿戴 然后 我->开启后台运行权限 ->点击当前手机后面的 里面有 小米MIUI,华为EMUI,OPPO ColorOS ,Vivo Fun ...

  6. iOS 检测app进入后台或前台

    ##1.检测app进入后台 // 在AppDelete实现该方法 - (void)applicationDidEnterBackground:(UIApplication *)application ...

  7. App在后台运行时如何保存数据到sqlite数据库

    iOS程序进入后台后,是不允许读写任何文件和数据库(sqlite),但是允许读写NSUserDefault中得数据.因此在后台时如果想存储数据,则可使用NSUserDefault(偏好设置)临时保存数 ...

  8. iOS 解决app退出后台应用重新启动的问题

  9. 后台推送消息给app_小米加入统一推送联盟!避免多种APP后台运行,国产手机春天来了...

    近日,统一推送联盟称,小米手机(含Redmi品牌在内)的系统推送服务已符合统一推送的各项技术要求.截至目前,在中国市场上具有一定知名度.号召力的安卓手机品牌几乎都已经加入统一推送联盟,除了有华为.vi ...

最新文章

  1. java 热替换_class卸载、热替换和Tomcat的热部署的分析
  2. Filter和Listener-学习笔记02【Filter细节】
  3. android sharedpreferences 工具类,android sharedpreferences工具类
  4. java 数据包含_如何高效判断java数组是否包含某个值
  5. 根据录入的计算公式计算_污水处理工程设计入门(10)—堰口计算
  6. 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
  7. Redmi 9或搭载联发科Helio G80:内置5000mAh电池 支持NFC
  8. [USACO17FEB] Why Did the Cow Cross the Road I P (树状数组求逆序对 易错题)
  9. 项目经理的商务指南系列之二:认识责任(敏捷开发,专家与杂家)
  10. 【DATAGUARD】物理dg在主库丢失归档文件的情况下的恢复(七)
  11. html表单电子邮件验证验证,详解JavaScript表单验证(E-mail 验证)
  12. tesseract-ocr安装简体中文语言包
  13. 十六进制转换成二进制matlab,在matlab中十六进制到二进制和十进制
  14. 微信小程序前端微信支付功能 支付流程
  15. 7-3 人民币与美元汇率兑换程序 (10分)
  16. 投影幕尺寸参数对照表
  17. 十大热门行业公布 成都仍是跳槽首选
  18. php依赖注入框架pimple中文文档
  19. mysql 创建用户、授权、修改密码
  20. Linux 命令详解

热门文章

  1. Wordpress转移数据表后出现You do not have sufficient permissions to access this page的解决方法...
  2. 除了茶颜悦色、文和友?长沙打造旅游城市缺什么?
  3. linux驱动框架和驱动代码
  4. 欺骗的艺术——第二部分(1)
  5. 信必优荣获BOSS直聘“王者之舟·最爱人才雇主奖”
  6. 1.2 引入不定度量空间的动机——有限时域H2/H∞滤波
  7. JAVA-SUST实验二 JavaBean组件程序设计
  8. KONG管理界面KONGA安装使用
  9. 网易七鱼客服对接记录以及Vue项目里使用
  10. 从汉字到区位码的转换