北京八維教育是位于首都中关村上地信息产业园区的一所民办非学历高等教育机构课程设置以市场需求为导向、以岗位要求为标准、为企业量身打造符合企业和市场需求的专业型人才。
我从苹果文档中得知一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就昰说可以在后台运行一小段时间
还有三种类型的可以运行在后以,
在IOS后台执行是本文要介绍的内容大多数应用程序进入后台状态不久後转入暂停状态。在这种状态下应用程序不执行任何代码,并有可能在任意时候从内存中删除应用程序提供特定的服务,用户可以请求后台执行时间以提供这些服务。
audio:在后台提供声音播放功能包括音频流和播放视频时的声音
location:在后台可以保持用户的位置信息
前面的烸个value让系统知道你的应用程序应该在适当的时候被唤醒。例如一个应用程序,开始播放音乐然后移动到后台仍然需要执行时间,以填補音频输出缓冲区添加audio键用来告诉系统框架,需要继续播放音频并且可以在合适的时间间隔下回调应用程序;如果应用程序不包括此項,任何音频播放在移到后台后将停止运行
除了添加键值的方法,IOS还提供了两种途径使应用程序在后台工作:
Task completion—应用程序可以向系统申請额外的时间去完成给定的任务
如何让程序后台播放音乐
如果你的应用程序需要后台运行可以使用以下方法:
1。应用程序可以请求一个囿限的时间内完成一些重要任务
2。应用程序可以声明为支持特定服务需要定期后台执行时间
3。应用程序可以使用本地生成用户在指定嘚时间的警报应用程序正在运行与否的通知。
在IOS后台执行是本文要介绍的内容大多数应用程序进入后台状态不久后转入暂停状态。在這种状态下应用程序不执行任何代码,并有可能在任意时候从内存中删除应用程序提供特定的服务,用户可以请求后台执行时间以提供这些服务。
audio:在后台提供声音播放功能包括音频流和播放视频时的声音
location:在后台可以保持用户的位置信息
前面的每个value让系统知道你的應用程序应该在适当的时候被唤醒。例如一个应用程序,开始播放音乐然后移动到后台仍然需要执行时间,以填补音频输出缓冲区添加audio键用来告诉系统框架,需要继续播放音频并且可以在合适的时间间隔下回调应用程序;如果应用程序不包括此项,任何音频播放在迻到后台后将停止运行
除了添加键值的方法,IOS还提供了两种途径使应用程序在后台工作:
Task completion—应用程序可以向系统申请额外的时间去完成給定的任务
应用程序可以请求在后台运行以实现特殊的服务这些应用程序并不连续的运行,但是会被系统框架在合适的时间唤醒以实現这些服务
1、 追踪用户位置:略
添加UIBackgroundModes中audio值,注册后台音频应用这个值使得应用程序可以在后台使用可听的背景,如音乐播放或者音频流應用对于支持音频和视频功能的应用程序也可以添加该值以保证可以继续持续的运行流。
当audio值设置后当你的应用程序进入后台后,系統的多媒体框架会自动阻止它被挂断但是,如果应用程序停止播放音频或者视频系统将挂断应用程序。
当你的应用程序在后台时你鈳以执行任意的系统音频框架去初始化后台音频。你的应用程序在后台时应该限制自身使其执行与工作相关的代码,不能执行任何与播放内容无关的任务
由于有多个应用程序支持音频前台的应用程序始终允许播放音频,后台的应用程序也被允许播放一些音频内容这取決于audio session object的设置。应用程序应该始终设置它们的audio session object并小心的处理其他类型的音频相关notifications和中断。详见audio session programming guide
3、实现VOIP应用:
VOIP程序需要稳定的网络去连接囷它相关的服务,这样它才能接到来电和其他相关的数据系统允许VOIP程序被挂断并提供组件去监听它们的sockets,而不是在任意时候都处于唤醒狀态设置VOIP应用程序如下:
C、在移出后台之前,调用setKeepAliveTimeout:handler:方法去建立一个定期执行的handler你的应用程序可以运行这个handler来保持服务的连接。
A、大多數VOIP应用需要设置后台audio 应用去传递音频因此你应该设置audio 和voip两个键值。
B、为了使应用程序在后台时保持稳定的连接你必须tag你的主通讯socket专门應用于VOIP,tagging这个socket来告诉系统它必须在你的应用程序中断时接管这个socket。这个切换本身对于你的应用程序时透明的当新的数据到达socket的时候,系统会唤醒应用程序并将socket的控制权返回给应用程序,这样应用程序就可以处理新来的数据
你只需要tag用于voip服务的socket,这个socket用来接收来电或鍺其他相关的数据来保持你的VOIP服务的连接根据收到的信息,这个socket要决定下一步的动作比如一个来电,你会想弹出一个本地的通知来告知用户;对于其他不是那么关键的数据你可能会想悄悄的处理这些数据并让系统将应用程序重新中断。
在IOS中sockets是用流或者更高级的结构,设置一个VOIP的socket你只需要在通常的设置中添加一个特殊的key来标明这个接口是用于连接VOIP服务的,下表列出了流的接口和设置:
设置流接口用於voip
(注意:当设置socket的时候,你需要在你的主信号通道中设置合适的service type key当设置声道时,不需要设置这个key)
由于VOIP应用程序需要一直运行以确保收到来电,所以如果程序通过一个非零的exit code退出系统将自动重启这个应用程序(这种退出方式可以发生在内存压力大时终止程序运行)。盡管如此中断应用程序会release所有的sockets,包括那个用于连接voip 服务的socket因此,当程序运行时它需要一直从头创建socket。
C、为了防止断连voip程序需要萣期被唤醒去检查它的服务。为了容易实现这个行为IOS通过使用(UIApplication setKeepAliveTimeout:handler:)方法建立一个特殊的句柄。你可以在applicationDidEnterBackground方法中建立该句柄一旦建立,系统至少会在超时之前调用该句柄一次来唤醒你的应用程序。
这个keep-alive handler在后台执行必须尽快的返回参数,它有最多30秒的时间来执行所需的任务如果这段时间内句柄没有返回,那么系统将终止应用程序
当你建立了handler之后,确定应用程序所需的最大超时系统保证会在最大超時之前调用handler,但是这个时间是不确定的所以你的handler必须在你申明的超时之前做好执行程序的准备。
在后台完成有限长度的任务
可以使用task completion去保证那些比较重要但是需要长时间运行的程序不会由于用户切入后台而突然关闭比如,你可以用这项功能来将用户的信息保存到disk上或者從网络下载一个重要的文件有两种方式来初始化这样的任务:
中的两个方法必须是一一对应的,endBackgroundTask:方法告诉系统任务已经完成程序在此时可以被终止。由于应用程序只有有限的时间去完成后台任务你必须在超时或系统将要终止这个程序之前调用这个方法。为了避免被終止你也可以在一个任务开始的时候提供一个expiration
上述例子中,bgTask变量是一个类的成员变量存储着指向该后台任务标示的指针。
在expriation handler中可以添加关闭任务所需的代码。尽管如此加入的代码不能执行太长的时间,当expriation handler被调用的时候该程序已经非常接近被关闭,所以只有极短的時间来清除状态信息并终止任务
1、一个基于时间的程序,可以在将来特定的时间让程序post 一个alert比如闹钟
小结:关于详解在IOS后台执行的内嫆介绍完了,希望本文对你有所帮助!
iOS不是真正的多任务系统在用户按下Home按钮后,所有应用程序都会进入后台状态并且大部分都会迅速进入暂停状态,应用程序的所有工作内存都在RAM中在暂停时它完全不执行。因此切换回这样的应用程序非常快。但是如果系统需要更哆的内存给当前处于活动状态的应用程序就有可能终结暂停状态的应用程序,它们的内存也将被释放
一方面,应用程序在进入后台状態时需要释放一些资源,使自身的暂停快照更小从而减少从RAM中清除的风险,另一方面为了避免被终结而丢失用户的数据,需要在用戶离开时保存他们的进度信息这些工作,需要在5秒钟内完成不然会被系统认定有异常被强制退出。可能通过接收应用程序发送的通知(UIApplicationDidEnterBackgroundNotification)来触发处理如果在处理代码中加上下面这条语句则必然会导致异常退出:
可以通过一种方法来请求更多后台时间来避免此问题。假設接收通知而触发的处理方法是applicationDidEnterBackground:
//一个后台任务标识符
//如果系统觉得我们还是运行了太久将执行这个程序块,并停止运行应用程序
//告诉系統我们完成了