iOS开发:后台运行以及保持程序在后台长时间运行

Chase620 等级 425 0 0

第一部分

1.先说说iOS 应用程序5个状态:

停止运行-应用程序已经终止,或者还未启动。

不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。

活动-app处于“使用中”的状态。

后台-app不再屏幕上显示,但它仍然执行代码。

挂起-app仍然驻留内存但不再执行代码。

按下Home键时,app从活动状态转入后台,绝大部分app通常在几秒内就从后台变成了挂起。

在内存吃紧的时候,iphone会首先关闭那些挂起的app。

从 iOS 4 开始,应用就可以在退到后台后,继续运行一小段时间(10 分钟);

2.还可以把自己声明为需要在后台运行,就能不限时地运行了。

不过限制为播放音乐、使用 GPS 、voip、。 值得一提的是,有的应用为了达到后台不限时运行的目的,在后台播放无声的音乐(审核不一定会被发现)。

iOS 5 开始又多了一种类型:下载报刊杂志。

然后 iOS 7 则可以下载各种玩意和定时抓取。

iOS 7 需要注意的区别:iOS 7 以前,应用进入后台继续运行时,如果用户锁屏了,那么 iOS 会等待应用运行完,才进入睡眠状态。而在 iOS 7 上,系统会很快进入睡眠状态,那些后台应用也就暂停了。如果收到事件被唤醒(例如定时事件、推送、位置更新等),后台应用才能继续运行一会。因为处理过程变成了断断续续的,因此下载时也要使用 NSURLSession 来处理(即下文中的 Background Transfer Service)。

3. 在我看来,苹果限制 app在后台运行,是为了更有效的利用硬件使用当前的app,不然,过多的app驻留后台,对手机资源占用是一大问题。

二. ios7以后提供的后台接口模式

1、Background Audio,这是后台的音频,这个很早之前便有,也是iOS设备中用得最多的后台应用,调用这个接口可以实现后台的音乐播放。

2、Location Services,这是后台的定位,系统会拥有统一页面进行管理。

3、VoIP,后台语音服务,类似Skype通话应用需要调用,可进行后台的语音通话。

4、Newsstand,报刊杂志后台自动下载更新,其能够自动实时更新。

5、Background Task Completion,这个接口早在iOS 4时候便拥有,其可以供任意类型的APP使用,不过在旧系统中,这个接口的后台限制运行时间仅为10分钟,意味着当应用退至后台,其后台运行仅能持续10分钟便会转至休眠状态。iOS 7中对这个接口作出了改变,原来的为连续10分钟,即不论你这10分钟内用户是否关闭屏幕进入休眠状态,应用仍然会在后台等待10分钟完结后推出,而新的改进为假如遇到关闭屏幕休眠的情况,这后台运行的10分钟便会跟随一同休眠,剩余的后台时间将会留待用户再一次唤醒设备才计算。这样后台运行的时间仍然为10分钟,但并不连续,这样做的优点为省电。

如现在有一些词典应用带有后台复制选词功能,实际上其是利用了这个接口,如果用户开启词典后并推出,即使屏幕关闭,但词典仍然在后台运行,电量消耗还是比较大的,在iOS 7上,这个问题可以得到解决。

6、 Remote Notification,这是本次较大的一个改进接口,以往聊天类应用接受推送后点进去需要再收一次信息,这情况在QQ、微信等应用上最为明显。不过拥有了这个接口后,这情况将不复存在,以后推送将能够直接启动后台任务。值得注意的是remote notification支持silent notification(静默推送),这样dropbox这类同步应用可以在后台以最节能的模式实时静默同步了,类似布卡漫画这种也可以推送正在追的漫画的新章节并在后台静默下载,待到下载好再给用户发送一个本地推送,用户点开即看无需再联网。

7、Background Transfer Service,后台上传下载。iOS最接近传统多任务的后台接口,可供任意类型的app调用,无时间限制。应用场景包括后台上传和下载数据,这使得游戏后台更新数据包,后台上传视频等等都成为可能,但是正如其名字,它只能用于处理上传下载这种传输类的任务,类似后台剪切板监控这种它就无能为力了。

iOS 7新增的background fetch,这个后台接口在苹果WWDC 2013上有提及,其会根据用户行为自动调整达到效率最优的后台模式,能够处理不是很有时效性的信息获取。例如一些社交、新闻类的应用的后台信息更新,iOS系统便会根据应用启动频率、时间和当前网络和电量的状况来智能分配每个应用的后台获取频率和启动时长。

三 . 当前社交项目,如何使用ios后台

1.当前项目特点:

a. 在保存长连接的情况下,用户一直在线,才能即时接收到消息;

b. 在初始化连接的时候,需要做很多处理,如果经常连接,必然很耗电, 所以尽力在后台的时候,不是时常断开后又连接;

2. 通过以上分析,改选用何种方式来保存app后台运行

voip不行;

静音播放,不清除这种方式,是否可以通过审核;

vpns推送,可取的方式,(具体方法: 用户在登录后,发送一个设备的tokenid; 在发送消息时,平台根据对方是离线还是在线,来判断要不要发推送消息)

3.background fetch在该项目中的应用

由于该app在初始化时,需要耗点时间,最好的方式就是通过 后台获取 来处理该工作,这样能保证用户的流畅体验。

第二部分:保持程序在后台长时间运行

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

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

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

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

当然iOS为了特殊应用也保留了一些可以实现“真后台”的方法,摘取比较常用的:

1.VOIP

2.定位服务

3.后台下载

4.在后台一直播放无声音乐(容易受到电话或者其他程序影响,所以暂未考虑)

5….更多

其中VOIP需要绑定一个Socket链接并申明给系统,系统将会在后台接管这个连接,一旦远端数据过来,你的App将会被唤醒10s(或者更少)的时间来处理数据,超过时间或者处理完毕,程序继续休眠。

后台现在是iOS7引入的新API,网上实现的代码比较少,博主也没有细心去找。

由于博主要做的App需要在后台一直运行,每隔一段时间给服务器主动发送消息来保持帐号登陆状态,因而必须确保App不被系统墓碑限制。

博主最先尝试了很多方法,包括朋友发来的一个Demo,每180s后台时间过期就销毁自己然后再创建一个后台任务,但是实际测试只有10分钟时间。最后因为考虑到VOIP对服务端改动太大,时间又太紧,所以选择了定位服务的方法来保持后台。

要启动定位服务:

1.需要引入头文件:#import

2.在AppDelegate.m中定义CLLocationManager * locationManager;作为全局变量方便控制

3.在程序启动初期对定位服务进行初始化:

1

2locationManager = [[CLLocationManager alloc] init];

locationManager.delegate =self;//or whatever class you have for managing location

4.在程序转入后台的时候,启动定位服务

[locationManager startUpdatingLocation];(第一次运行这个方法的时候,如果之前用户没有使用过App,则会弹出是否允许位置服务,关于用户是否允许,后面代码中有判断)

这样在定位服务可用的时候,程序会不断刷新后台时间,实际测试,发现后台180s时间不断被刷新,达到长久后台的目的。

但是这样使用也有一些问题,在部分机器上面,定位服务即使打开也可能不能刷新后台时间,需要完全结束程序再运行。稳定性不知道是因为代码原因还是系统某些机制原因。

文/Levan_li(简书作者)

原文链接:http://www.jianshu.com/p/174fd2673897

本文转自 https://www.jianshu.com/p/75e68f12de7a,如有侵权,请联系删除。

收藏
评论区

相关推荐

Swift开发-OC与Swift混编以及纯Swift编码所遇到的问题(一)
前言: 最近一段时间比较忙,公司项目比较多,直到现在年后过来以 后总结一下之前项目中遇到的问题,以及自己使用Swift开发所遇到的坑。现在大家都知道Swift已经渐渐趋于完善,以后很有可能会替代ObjectC成为主流的iOS开发语言,所以各位以后还想从事iOS开发的程序猿(媛)们,早作准备吧! 今天我们主要说一下ObjectiveC和Swift混编
Swift开发-OC与Swift混编以及纯Swift编码所遇到的问题(一)
前言: 最近一段时间比较忙,公司项目比较多,直到现在年后过来以 后总结一下之前项目中遇到的问题,以及自己使用Swift开发所遇到的坑。现在大家都知道Swift已经渐渐趋于完善,以后很有可能会替代ObjectC成为主流的iOS开发语言,所以各位以后还想从事iOS开发的程序猿(媛)们,早作准备吧! 今天我们主要说一下ObjectiveC和Swift混编
iOS 11更新后以及iPhone X推出后工程中遇到的问题及适配
1.UITableView滑动时右侧的滑动条忽长忽短的乱跳以及MJRefresh上拉刷新死循环 这是因为tableView在iOS11默认使用SelfSizing,tableView的estimatedRowHeight、estimatedSectionHeaderHeight、estimatedSectionFooterHeight三个高度估算属性由默
iOS 图片和文字一起上传
最近在忙着开发公司的一个项目,中间遇到很多坑,对于图片的上传在这里我也不做太多的介绍,网上各种大神的资料都有的,今天我主要说一下我再上传图片和文字的时候遇到的一些坑(图文上传我们很多时候都会遇到,遇到多了网上找的各种博客,解决了图文一起上传的问题)废话不多说,直接上代码: / 上传图文 / (void)upLoadImageViewToS
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
ipa文件上架苹果应用市场/IOS发布问题
之前上传ipa文件到苹果商店时候遇到了好多问题,做个总结 准备工作 ios开发者账号 硬件要求 苹果电脑 第一步 申请证书(这一步一般申请一次就行) iOS证书申请参考网站 https://ask.dcloud.net.cn/article/152 第二步 提交到苹果后台(机器审核) 参考步骤如下,我之前是用的Transporter 需要下
本博客精品资源汇总:(持续更新)
@toc 引言 欢迎大家来到公众号:iOS逆向的《精品资源汇总》目录 本文列出最受欢迎的资源,以便供大家快速查找自己所需的资料 文中的蓝字都是超级链接,点击进入即可 I、iOS自定义视图相关热门资源 iOS 自定义视图:《用户协议及隐私政策》弹框(包含超链接属性)【demo源码支持中英文切换】(https://downloa
iOS 微信支付开发(最新版)
1. 介绍 本文为以前做的项目总结,由于相关支付 SDK 迭代,原文已经不满足需求,故作如下更新,供大家参考,另外增加常见问题总结。 项目中要用到支付功能,需要支付宝支付、微信支付、银联支付、Apple_pay,所以打算总结一下,方便以后的查阅,也方便大家, 用到的地方避免再次被坑。 今天我们就主要介绍一下微信支付,其他支付介绍后面会尽快更新出来。
iOS/Android SQLite全文检索——FTS (full text search)
前言 我们的APP部分功能为了满足用户离线使用搜索的场景,使用了内置SQLite数据库的方式,随着内容的日益丰富,数据库记录快速增多,导致搜索速度明显变慢,为了提升搜索速度,给我们的数据做了全文检索的支持,在3W的数据下,搜索速度由原来的数秒提升至几十到几百毫秒(设备不同,搜索效率存在差别)。 一、基本概念 1. 概述
iOS 支付宝支付开发(最新版)
1. 介绍 本文为以前做的项目总结,由于相关支付 SDK 迭代,原文已经不满足需求,故作如下更新,供大家参考,另外增加常见问题总结。 今天我们就主要介绍一下支付宝支付,其他支付介绍后面会尽快更新出来。 在做支付之前,在网上也查寻了资料,大多都说,支付接入坑太多,微信坑最多,银联文档太复杂。 其实如果接入的多的话,那些套路都可以绕着走。 网上的经验什么的
【Flutter 实战】安装Flutter
1.3 搭建Flutter开发环境工欲善其事必先利其器,本节首先会分别介绍一下在Windows和macOS下Flutter SDK的安装,然后再介绍一下配IDE和模拟器的使用。 1.3.1 安装Flutter由于Flutter会同时构建Android和IOS两个平台的发布包,所以Flutter同时依赖Android SDK和iOS SDK,在安装Fl
由Vant Field组件得到解决IOS输入框 键盘上推问题
前言 前几天公司让写一个客户数据入录页面(就是个带了logo的表单页面),就直接选择用原生的直接上,原以为也就个把小时的事情(确实个把小时就写完了),但是测试发现ios(没有测试多个,至少qq浏览器会)会输入的时候导致页面上推严重影响用户体验。 可直接转第三部分 由开源库找到方案 Vant Field组件通过看源码发现Field在bl
iOS开发:后台运行以及保持程序在后台长时间运行
第一部分 1.先说说iOS 应用程序5个状态:停止运行应用程序已经终止,或者还未启动。不活动应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。活动app处于“使用中”的状态。后台app不再屏幕上显示,但它仍然执行代码。挂起app仍然驻留内存但不再执行代码。按下Home键时,app从活动状态转入后台,绝大部分app通
IOS Theos Tweak 之 HelloWorld
一、目标Theos是什么?是一套跨平台的开发工具套件,不仅可以开发Ios,Mac、Windows和Linux也可以的哦,开源免费。Tweak是什么?可以理解成动态链接库,有搞过Windows下dll注入的同学应该可以秒懂了。Android的同学可以把它理解成IOS下的Xposed。HelloWorld是什么?是萌新程序员的信仰,在一个平台写下HelloWor
IOS 联真机签名解决方案
一、目标我们之前介绍过 和 。 那么他们搭配起来能解决什么问题呢?在Android联真机签名方案中,我们提到过Frida rpc方案的缺点: frida不是很稳定,偶尔会崩溃出退 frida启动需要连PC (不过这个缺点已经被 给解决了)那么在Ios下有没有类似Xposed的东东?是的,就是 Tweak。 二、步骤 GCDWebServerGCDWebS