概述

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. python 工具ScreenShoot

    环境:windows python3 # -*- coding: UTF-8 -*- import time import os, win32gui, win32ui, win32con, win32 ...

  2. iOS常用网络库收集

    一 ASIHttpRequest二 AFNetworking 三 AFDownloadRequestOperationA progressive download operation for AFNe ...

  3. MCE----Machine-check exception

    http://en.wikipedia.org/wiki/Machine_Check_Exception Machine-check exception From Wikipedia, the fre ...

  4. Material-Animations

    https://github.com/eltld/Material-Animations

  5. [Elasticsearch] 部分匹配 (四) - 索引期间优化ngrams及索引期间的即时搜索

    本章翻译自Elasticsearch官方指南的Partial Matching一章. 索引期间的优化(Index-time Optimizations) 眼下我们讨论的全部方案都是在查询期间的.它们不 ...

  6. 浅谈JavaScript的函数表达式(闭包)

    前文已经简单的介绍了函数的闭包.函数的闭包就是有权访问另一个函数作用域的函数,也就是函数内部又定义了一个函数. var Super=function(num){ var count=num; retu ...

  7. js之substr和substring的差别

    今天有人在群里问这两个的差别,借这个机会在这罗列下 substring(from,to) 開始和结束的位置,从零開始的索引 參数     描写叙述 from     必需. 一个非负的整数,规定要提取 ...

  8. Finally语句块的运行

    一.finally语句块是否一定运行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是.当然他们的回答是正确的,经过试验. ...

  9. POJ 1182 食物链(并查集)

    题目链接 经过宝哥的讲解,终于对这种问题有了进一步的理解.根据flag[x]和flag[y]求flag[tx]是最关键的了. 0吃1,1吃2,2吃0. 假设flag[tx] = X; 那么X + fl ...

  10. iOS优秀博文合集

    一.优化篇 Xcode7中你一定要知道的炸裂调试神技 iOS使用Instrument-Time Profiler工具分析和优化性能问题 dSYM 文件分析工具 二.功能篇 3分钟实现iOS语言本地化/ ...