惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
V
V2EX
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Announcements
Recent Announcements
博客园 - 司徒正美
Microsoft Security Blog
Microsoft Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Latest news
Latest news
Vercel News
Vercel News
The Register - Security
The Register - Security
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
N
Netflix TechBlog - Medium
WordPress大学
WordPress大学
小众软件
小众软件
L
Lohrmann on Cybersecurity
GbyAI
GbyAI
P
Privacy & Cybersecurity Law Blog
T
Tor Project blog
AWS News Blog
AWS News Blog
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
K
Kaspersky official blog
B
Blog RSS Feed
G
Google Developers Blog
量子位
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
Intezer
雷峰网
雷峰网
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
F
Full Disclosure
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 【当耐特】
The Hacker News
The Hacker News
U
Unit 42
S
SegmentFault 最新的问题
I
InfoQ
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
罗磊的独立博客
Spread Privacy
Spread Privacy
C
CERT Recently Published Vulnerability Notes

木土金王可

复盘 2024,年度好物分享 落地 第二十台相机:宝丽来(Polaroid)Impulse AF 第十九台相机:哈苏(Hasselblad)X1D II 第十八台相机:宝丽来(Polaroid)Macro 5 SLR 第十七台相机:康泰时(Contax)S2 稻荷山 Dave Chappelle: The Closer 语言是思想的边界 对街头卖惨表演的看法 《民主森林》 电梯英雄 2023,年度好物分享 《大画幅 4x5》复活 新加坡华侨银行(OCBC)开户指南 第十六台相机:宾得(Pentax)PC35AF-M SEDATE 第十五台相机:沙慕尼(Chamonix)4x5 F2 Xbox 连接 Studio Display Twitter、Apple、Meta 和 Reddit 广告平台使用体验 第十四台相机:康泰时(Contax)S2 你到底什么时候买相机 拍摄胶片的理由 HomePod 不能作为 Mac 音响 男性生来就是残缺的女性 第十三台相机:柯尼卡(Konica)Big Mini 301 三年,十二台相机 恐怖片很好看啊 比残忍更残忍 用 SwiftUI 重构「行动日」 推荐《女生呵护指南》 你是左派还是右派? 驯服内心的猛犸象:为什么你应该停止关心别人对你的想法 想写点什么,但又不知道该写什么 摄影构图 精致的结婚照 中文没死,是有的人死了 上海爆发 COVID-19 疫情以来我收藏的文章(持续更新) 自我审查 25 美元,成为美国计算机学会(ACM)会员 将同事送我的仙人掌转换成 3D 模型 当我们谈论离屏渲染时,我们在谈论什么 二零一九年夏秋之交工作生活的异动 一声一世 iOS 限制输入字数与特殊字符的巧妙方法 对于番茄学习法的误解 Swift 中的空字符串 我如何自学 iOS 开发 为什么我不喜欢社交网络 如何与人见面 为什么我不喜欢即时通讯 以配置信息(UserDefaults)的形式存储应用数据 在文件沙盒中读取与写入应用数据 在 iOS 开发中使用键值对监听(KVO)与通知(Notification) 介绍 GCD 中的线程,队列,延迟执行,线程阻断,信号量,任务组与任务对象 iOS 原生 URLSession 网络请求 什么是自动引用计数(ARC)和引用循环 在 iOS 开发中使用代理与协议 独立开发的第一个应用:行动日 为什么我会把 Google Pixel 换成 iPhone SE? 手动进行 Nexus 和 Pixel 系列手机的 OTA 更新 开启 Chromebook 的夜间模式
如何让 iOS 给你的应用开后门
kinnouka bokudo · 2020-06-02 · via 木土金王可

本文将简单介绍 iOS 的后台任务,iOS 的后台任务不仅仅可以让应用在进入后台之后,申请额外的系统资源去执行未完成的任务,还可以通过 iOS 的深度学习预测用户打开应用的时间,并在那之前提前执行预定的后台任务,使用应用更快响应。

添加背景模式

由于本文将分别介绍后台刷新与后台数据处理,所以在背景模式中分别勾选了 Background fetchBackground processing,在实际的开发中应该按需选择。

添加后台任务标识

每个后台任务都需要一个标识,系统才能以此判断需要执行哪个任务。

Info.plist 文件中,添加 Permitted background task scheduler identifiers选项,并在此选项下添加所需执行后台任务的标识。

如图所示,我添加了两个任务标识,分别表示刷新任务与数据处理任务。

注册后台任务标识

首先以刷新任务为例,在 AppDelegate.swiftapplication(_:didFinishLaunchingWithOptions:) 代理方法内加入如下代码。

import BackgroundTasks

BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.demo.refresh", using: nil) { task in
    let refreshAppTask = task as! BGAppRefreshTask

    refreshAppTask.expirationHandler = {

    }

    ...

    task.setTaskCompleted(success: true)
}

因为是以刷新任务为例,所以在注册回调中需将任务强转为 BGAppRefreshTask 类型,值得注意的是,系统分配的任务时间有限,所以当系统分配的任务时间即将到期,或者系统提前终结任务时调将会调用 refreshAppTaskexpirationHandler 回调,所以可以将一些处理未完成任务的操作放入这里。

另外,在任务结束后需调用 setTaskCompleted(success: Bool) 方法,以节省系统资源。

数据处理任务同理,只是任务类型相应的变为 BGProcessingTask 类型,并注意不要将任务标识传错。

提交后台任务请求

同样先以刷新任务为例,在 AppDelegate.swiftapplicationDidEnterBackground(_:) 代理方法内加入如下代码。

let request = BGAppRefreshTaskRequest(identifier: "com.demo.refresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)

do {
    try BGTaskScheduler.shared.submit(request)

} catch {
    print(error)
}

其中 earliestBeginDate 表示最早开始执行背景任务的时间,可以理解为至少应用进入后台多久之后,才可以执行预定的后台任务,上述代码中为至少应用进入后台十五分钟之后,才可以执行后台任务。

值得注意的有两点,一是在执行 submit 操作时,会阻塞主线程。二是如果需要后台持续刷新,可将此段代码放入注册后台任务标识的回调中。

数据处理任务的请求也差不多,只是请求类型需要为 BGProcessingTaskRequest,但是数据处理任务请求有两个额外的属性可设置。一是 requiresNetworkConnectivity,表示是否需要联网,默认为否。二是 requiresExternalPower,也就是是否只能在充电时进行,默认为否。

调试

为了调试,首先需要将应用放入一次后台以提交后台任务请求,再次打开应用并在控制台输入:

e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"]

即可模拟执行后台任务;输入:

e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateExpirationForTaskWithIdentifier:@"TASK_IDENTIFIER"]

即可模拟后台任务时间到期。

2020 年 6 月 2 日