前言

本人近日在b站发布了一个视频,展示了使用快捷指令开启部分iOS系统内隐藏应用程序的操作。传送门
之所以想到使用快捷指令来打开隐藏应用,是因为一个偶然的发现:从iPhone X之后的机型中,在拨号界面输入 *3001#12345#* 不再启动原有的场测程序(FieldTest.app),而是FTMInternal-4;但在旧设备同版本的操作系统中则是启动FieldTest。

在这篇文章中,我会向你介绍快捷指令的历史,以及上述操作的实现思路。

希望能给各位iOS高玩提供一些帮助。


快捷指令的前身-Workflow工作流

Workflow采用了类似图形编程的设计方法,允许用户组合不同的操作,例如网络请求、图片修改、逻辑运算等,实现一定程度的自动化。

2015年,Workflow被评选为“App Store最佳应用”,并在2017年被Apple收购,成为如今iOS上备受欢迎的“快捷指令(Shortcuts)”应用。

2018年,随着iOS12的发布,SiriKit与WorkflowKit两个模块同时被内置在系统的私有模块(PrivateFrameworks)中,快捷指令成为了系统应用程序。

快捷指令如何工作

快捷指令将用户写入的一系列动作(Action)保存为属性表文件(*.wflow*.shortcut),并在用户需要执行时依次读取属性表中的操作。

将用户的操作记录为工作流的优点在于,用户不需要知道如何使用编程语言就可以直接实现简单的编程操作。

例如,通过快捷指令来自动查找最近的咖啡厅以及行动路线

最近的咖啡厅

在这个快捷指令中一共使用了三个动作,分别为查找咖啡厅、用户选择其中一个咖啡厅、显示到达目标咖啡厅的路线。

保存为快捷指令后,用户往往只需要单击执行该快捷指令,就可以自动完成搜索、选择和显示路线的操作。对应的手动操作就是打开地图app-输入咖啡厅-搜索-选择某个咖啡厅-显示路线。

不难判断,如果总是依靠手动来执行需要的操作,无疑增加了时间成本。但保存为快捷指令后,相应的动作可以随时被执行。


Workflow属性表

除了通过图形界面来操作以外,对于追求编写效率或者过于繁琐的快捷指令来说,作者往往可以选择直接编辑快捷指令的源码。

如果需要编辑快捷指令的源文件,可以利用快捷指令的导出功能将属性表导出。

Workflow Export

该操作将从设备已有的快捷指令中选择一个或多个快捷指令,并保存为文件

最终效果如下:

使用文本编辑器查看后我们可以发现,它们在格式上遵守Apple的plist规范,因此我们可以直接使用支持plist的工具来查看并编辑,由于笔者尚未在App Store找到可视图化编辑plist的工具,故直接使用文本编辑器。
可以看到,Workflow使用了一个叫做WFWorkflowActions的字典(dict)保存了一个包含动作的数组(array),所有动作在数组中依次排列,与快捷指令软件中显示的顺序保持一致。

WFWorkflowActionIdentifier:动作ID

WFWorkflowActionParameters:动作参数

在上图中,动作ID的内容是is.workflow.actions.searchlocalbusinesses,可以看出是用来搜索附近商户的动作。
动作参数中,我们找到该动作要搜索的内容对应的参数WFSearchQuery,可以看到这个字符串(string)的内容是Coffee,与我们的设置一致。

如果我们修改这里的Coffee为其他内容,那么在导入回快捷指令时也能看到效果。
如果你在使用iOS12及之前的版本,那么你可以直接将快捷指令属性表文件导入到应用程序中;如果你在使用iOS13或更高则会看到如下提示:
因此,你需要将文件形式的快捷指令上传到苹果并制作iCloud链接才能将快捷指令安装到本地。
Workflow Import

至此,你已经了解了它的运作方式,接下来我们可以开始尝试打开隐藏应用程序了。


“打开App”动作

这个动作允许你使用快捷指令打开某个应用程序,使用之前只需要选择一个目标应用程序即可。
这个动作执行时将跳转到“相机”软件。

但是在设置此动作时可以发现与其他动作的差异:打开App动作的变量设置是直接从应用程序列表中选择,而其他动作可以更自由地设置变量
在系统的应用列表中,默认情况下只列出显示在主界面(SpringBoard)的应用程序,因此如果想要实现打开隐藏的应用程序,我们是不能够通过这个方式实现的。

部分隐藏应用拥有对应的URL Schemes(一种通过URL唤起应用程序的机制),但是通过这种方式并不能实现打开任意程序的目标,因此本文不介绍该方法。
之所以不使用此方法,是因为快捷指令拥有不通过URL Scheme唤起其他应用程序的能力,因此我们可以推测 ,快捷指令依靠应用程序的BundleID实现应用唤起。

Bundle ID:应用程序唯一识别符(或称签名)

为了验证这个想法,我们可以将这个快捷指令导出为文件
可以发现动作参数中,WFAppIdentifier表示应用程序ID,内容则是相机的签名com.apple.camera

按照上面的操作流程,理论上我们如果将这个字符串的内容更改为某个隐藏应用的ID,我们就可以使用快捷指令直接唤起这个隐藏应用。

为了搞清设备中有哪些隐藏应用,我们可以前往The iPhone Wiki一探究竟。

已知系统应用的目录在/Applications,The iPhone Wiki中记录了历代iOS版本的系统应用,我们可以很轻易地查询到有关的信息
The iPhone Wiki - /Applications

现在,我们获取了系统中隐藏应用的列表,下一步就是用快捷指令打开它了。

例如我们想要启动场测程序,那么就将WFAppIdentifier的内容更改为com.apple.fieldtest
随后导入修改后的快捷指令,可以看到预览中,打开App的参数是“FieldTest”
Open FieldTest.app

运行后,可以看到场测程序被正常打开。
至此,我们就完成了“调出隐藏应用”的操作。


总结

  1. 快捷指令可以导出为文件形式,并且可被导入
  2. 可以通过直接编辑源文件的方式绕过“打开App”的限制
  3. 有经验者可使用plist编辑器直接编写快捷指令

本文讲解的快捷指令均已提供下载链接,欢迎各位尝试,希望该文章对各位有所帮助。

【附源码例】快捷指令实现调出iOS隐藏应用程序-原理解析相关推荐

  1. [附源码]计算机毕业设计Python+uniapp智能公交查询APP59sm2(程序+lw+APP+远程部署)

    [附源码]计算机毕业设计Python+uniapp智能公交查询APP59sm2(程序+lw+APP+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Py ...

  2. [附源码]计算机毕业设计Python+uniapp作业批改系统APP4238p(程序+lw+APP+远程部署)

    [附源码]计算机毕业设计Python+uniapp作业批改系统APP4238p(程序+lw+APP+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Py ...

  3. [附源码]Python计算机毕业设计SSM绩效考核管理系统(程序+LW)

    [附源码]Python计算机毕业设计SSM绩效考核管理系统(程序+LW) 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ ...

  4. [附源码]计算机毕业设计Python+uniapp家政服务系统小程序7na26(程序+lw+远程部署)

    [附源码]计算机毕业设计Python+uniapp家政服务系统小程序7na26(程序+lw+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Python ...

  5. [附源码]计算机毕业设计Python+uniapp智慧校园平台APP06l79(程序+lw+APP+远程部署)

    [附源码]计算机毕业设计Python+uniapp智慧校园平台APP06l79(程序+lw+APP+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Py ...

  6. [附源码]计算机毕业设计Python+uniapp安卓日程管理APPqksh9(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp安卓日程管理APPqksh9(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Pyt ...

  7. [附源码]PHP计算机毕业设计社区居家养老管理系统(程序+LW)

    [附源码]PHP计算机毕业设计社区居家养老管理系统(程序+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: PHP+ Vscode + Mysql ...

  8. [附源码]PHP计算机毕业设计主机游戏商店网站(程序+LW)

    [附源码]PHP计算机毕业设计主机游戏商店网站(程序+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: PHP+ Vscode + Mysql5. ...

  9. [附源码]PHP计算机毕业设计Buff饰品交易平台论文(程序+LW)

    [附源码]PHP计算机毕业设计Buff饰品交易平台论文(程序+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: PHP+ Vscode + Mys ...

最新文章

  1. 关于学习Python的一点学习总结(51)
  2. 密码技术--RSA数字签名及Go语言应用
  3. 文件服务器 工作站 通信媒体,用于多工作站/多平台非线性视频编辑系统的媒体文件访问和存储解决方案...
  4. 5G完整标准出台,产业应用爆发在即,抢先规划势在必行
  5. GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟。...
  6. Python:通过命令行发送新浪微博
  7. 难以置信,MySQL也可以无损自由切换
  8. macOS 12 Monterey 推出首个测试版本
  9. 如何建立数学模型系列之【一.通俗解释及相关概念】
  10. 西南科技大学OJ题 集合的交运算的实现1045
  11. 手工扒网页模板简单流程
  12. android pc投屏,如何解决乐播投屏中投屏失败的问题【乐播投屏】
  13. 生成带参数微信公众号二维码
  14. cents OS 重装yum,配置阿里yum源
  15. Unity il2cpp LinuxInterop_dlopen Error
  16. Java数字转中文大写,数字转英文
  17. python古诗默写_Python网络爬虫:爬取古诗文中的某个制定诗句来实现搜索
  18. OCR实时扫描识别中英文--tess_two在Android的使用
  19. 职业资格证书查询与验证
  20. 可编程SoC(SoPC),什么是可编程SoC(SoPC)

热门文章

  1. 什么是开源?为什么要坚持开源?
  2. Allegro172版本DFM规则之DFA outline
  3. Docker快速搭建OpenProject项目管理协作平台
  4. 基于ubuntu环境搭建janus服务器
  5. Apache2.2+MySql5.5+PHP5.4的安装和配置(windows)
  6. 基于QT的串口调试助手
  7. MicrobiomeAnalyst 文件配置及使用
  8. 红米路由器ac2100怎样设置ipv6_【路由刷机】红米小米 AC2100 Windows下刷Padavan固件小小白教程、升级固件...
  9. stm32之IIC应用实例(AT24C02芯片,硬件和软件方式驱动)
  10. ognl表达式 讲解