概述

iOS平台提供给应用特殊的后台服务,应用在后台时仍被允许能执行一会。

后台模式

UIBackgroundModes Xcode Modes 
1. audio -> Audio.Airplay and Picture in Picture: 应用在后台时可以播放声音信息 应用场景:需要在后台播放音频 
2. location -> Location updates: 应用提供位置信息 应用场景:在后台时需要不断通知用户位置更新信息 
3. voip -> Voice over IP: 提供Voice-over-IP服务。 如skype网络电话 
4. fetch -> Background fetch: 应用场景:需不断地频繁的基于一定规律从网络上获取新的数据 supported in iOS 7.0 
5. remote-notification 应用场景:通过远程推送作为一个信号表明有新的数据需要下载,以尽可能减少用户直接点开通知后查看内容的等待时间 supported in iOS7.0 
6. newsstand-content 在后台时使用Newsstand框架(杂志)进行数据的下载更新 supported in iOS5.0 and later 
7. external-accessory 有规律的从固件获取信息,可以在后台不断的与外设进行沟通 supported in iOS 5.0 and later 
一些外设控制App,比如一些控制第三方MFi配件的应用,开启后可让应用不断的与外设进行沟通 
8. bluetooth-central -> Uses Bluetooth LE accessories 需要在后台不断更新蓝牙状态 CoreBluetooth supported in iOS 5.0 and later 
9. bluetooth-peripheral -> Acts as a Bluetooth LE accessory 需要在后台不断访问其他蓝牙设备获取数据 supported in iOS 6.0 and later 

后台执行场景

官方为我们界定了 3 类后台执行任务的场景:

  • Background Tasks:APP 在前台时启动某项任务,然后在未结束之前突然 切换到了后台,那么 APP 可以在切换回调里使用某些 API 来继续向系统请求一些时间来继续完成这个任务;完成之后通知系统,之后系统会将 APP 挂起;
  • Downloading:在后台启动从网络下载文件的任务 – 对于文件下载,iOS 有专门的机制;
  • Specific Backgournd Tasks:应用需要在后台一直执行代码;

Background Tasks

使用 API beginBackgroundTaskWithExpirationHandler来指定.执行过程中 APP 被切换到后台时,任务还没有完成,这个时间又会自动调整为一个时间片段(具体多少我没找到文档说明,都是说可以通过backgroundTimeRemaining 属性得到)。对于一个固定 task ,每次调用beginBackgroundTaskWithExpirationHandler,都会产生一个 token 值(UIBackgroundTaskIdentifier 实际是个整型),必须在任务执行结束时,调用 endBackgroundTask 并传递这个 token,来结束后台任务。另外,作为最佳实践,都应该传递一个 超时 handler,以防申请到的时间片段内,还是没能完成任务的话,做最后的清理和标注工作!如果不传的话,那么结果就是 iOS 直接 kill 掉你的APP 
doc and code from : iOS 后台任务设计指导

// 在某处定义一个 token 变量
UIBackgroundTaskIdentifier _bgTaskToken; // 进入后台 委派方法回调
- (void)applicationDidEnterBackground:(UIApplication *)application
{
_bgTaskToken = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
// 时间到了,任务还没完成,只能清理
...
// 取消后台任务
[application endBackgroundTask:_bgTaskToken];
_bgTaskToken = UIBackgroundTaskInvalid;
}]; // 异步启动任务,这样不会阻塞 本委派方法回调
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 巴拉巴拉,做自己的任务
... // 任务在时间限制内结束啦,取消后台任务
[application endBackgroundTask:_bgTaskToken];
_bgTaskToken = UIBackgroundTaskInvalid;
});
}

Apple Doc

Tracking the User’s Location

有三种方式来实现 位置的访问:

  • The significant-change location service(这也是官方推荐的方式)
  • Foreground-only location services
  • Background location services

The significant-change location service ,字面理解,就是只有位置有变化时才会发出通知,有人说这个时机是依据基站,切换了基站时,就会发出一次通知,所以频率会受基站的密度影响,所以市区更新频率会比郊区高。但好处 是这个服务不管你的 APP 是在前台还是后台,不管是否已经被挂起,或已经死掉了,他都会唤醒你的进程进行相应处理,所以应该是最省电的

Communicating with an External Accessory

外设设备有很多,比如一些心率监控器,会在必要的时候向手机推送数据。系统替 APP 监视这个连接,但有数据过来时,会唤醒 APP 进行处理,每次唤醒 APP 只有 10 S进行数据处理,如果10S不够,需要使用 beginBackgroundTaskWithExpirationHandler: 方法再申请一段时间进行处理;

【Note】:Apple 要求此类应用 需要提供一个 开启 和 关闭 连接的界面供用户使用;

Using Push Notifications to Initiate a Download

服务端推送的通知内容里加入 键值对 content-available = 1 ,那么 手机收到这个通知后,会自动启动 APP 到后台,或 唤醒(依旧保持后台执行),并回调 委托方法application:didReceiveRemoteNotification:fetchCompletionHandler:

Reference

App Programming Guide for iOS - Background Execution 
iOS 后台任务设计指导

iOS后台模式BackgroundMode的更多相关文章

  1. 对iOS后台模式最多10分钟运行时间的进一步理解

    在app进入后台时,系统初始默认是只有10s的处理时间,但如果10s不够,我们可以主动申请,网上流传最多的一个说法是10分钟. 但这种说法有个前提: 那就是iOS7之前,是这样 但从iOS7开始,我们 ...

  2. ios 后台模式

    1.在后台可以继续播放音频 To play sound in the background, make sure to add the following to the Info.plist file ...

  3. 关于iOS后台模式

    https://onevcat.com/2013/08/ios7-background-multitask/ http://zhidao.baidu.com/link?url=NUOMrLGB6Odr ...

  4. ios xmpp开发应用后台模式接收聊天信息处理方案

    ios xmpp开发应用后台模式接收聊天信息 最近在使用xmppframwork来实现一个聊天应用,碰到了一个问题,应用进入后台以后,就接收不到消息了: 怎么样才能使应用被切到后台时,应用中的网络连接 ...

  5. iOS之本地推送(前台模式与后台模式)

    #import "AppDelegate.h" #import "GlobalDefine.h" @interface AppDelegate () @end ...

  6. 关于iOS后台问题( 一 )(ios后台刷新,后台定位,后台下载,真后台)

    关于iOS的后台,以下引用一些文段进行一下脑补,请同学们大致看一下,有个基础,原文出处 -------------------------------------------------------- ...

  7. iOS后台定位,实时向服务器发送最新位置

    第一步,开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: Past ...

  8. iOS后台定位实现

    iOS后台定位实现 (2013-01-24 16:43:12)     工作中碰到一个定位的应用场景:app需要在后台运行,实时上传用户地理位置.   苹果对iOS的规范性在提升了app的品质的同时也 ...

  9. ios 后台下载,断点续传总结

    2018年12月05日 16:09:00 weixin_34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/875 ...

随机推荐

  1. linux shell操作

    ---------------------------------------------------- 原文:http://unix.stackexchange.com/questions/2863 ...

  2. 谜题 之 C语言

    本篇文章展示了14个C语言的迷题以及答案.代码应该是足够清楚的,并且我也相信有相当的一些样例可能是我们日常工作可能会见得到的.通过这些迷题,希望你能更了解C语言.假设你不看答案.不知道是否有把握回答各 ...

  3. 一根数据线玩转树莓派Zero

    0. 前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnb ...

  4. SQL ORDER BY 关键字

    SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集进行排序. SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序. ORDER BY ...

  5. electron 开发拆坑总结

    electron 总结 前言 有一个web项目需要用客户端来包装一下 项目的主要业务都在服务器上 所以项目的大多数功能都用url 地址来访问: 客户端登陆界面在本地 打包客户端的本地登陆界面 做为登陆 ...

  6. binary-tree-preorder-traversal——前序遍历

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  7. insertion-sort-list——链表、插入排序、链表插入

    Sort a linked list using insertion sort. PS:需要考虑left为head且只有一个数时,此时left->==NULL,若right<left则应更 ...

  8. Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

    三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...

  9. c++面试题总结(4)

    一.找错题 试题1: void test1() { ]; "; strcpy( string, str1 ); } 试题2: void test2() { ],str1[]; int i; ...

  10. The most widely used name server software: BIND

    https://www.isc.org/downloads/bind/ The most widely used name server software: BIND BIND is open sou ...