越狱后的 URL Schemes 使用详解

在 Activator 的 1.9.3 版本里,Activator 加入了通过 URL Schemes 来触发所有 Activator 动作的功能。而 Activator 想必大家都清楚,它的动作涵盖面非常广,有些可以直接模拟 iOS 设备的按键;有些可以打开或关闭某个系统功能的开关;有些可以打开 App 还有些可以打开 App 的具体某个功能……而且作为基石级别的插件,它也会随着系统不断进化,比如现在 Activator 可以在非 6S 系的设备上,将 3D Touch 呼出的菜单里的项目作为动作。

对于关注效率的人们来说,越狱后使用 Activator 带来的这套 URL Schemes 的意义在于,它可以填补非越狱状态下 iOS 的 URL Schemes 所不能做的一些空档。

文章内容较多,请根据需要选择相应的部分查看:

引子

"Home 键的 URL Schemes 是什么?"

Workflow 估计是这两年评价最高的 App,我也写了它的测评以及一整套的 Workflow 的原创教程。文章首发在指南,后来受少数派邀稿写了教程的最后一篇,并且将之前的教程也都转手放在那,他们把这些教程整理在了一起

教程这样的东西,不同基础的人看完会有各种问题,但我被问到最多的问题大概是这两个问题:

  • 可不可以运行完某个动作以后返回主界面?
  • 可不可以运行完某个动作以后锁屏?

在《URL Schemes 使用详解》这篇文章的评论里,也有一条评论,问的就是:

Home 键的 URL Schemes 是什么?

其实一定程度上懂 iOS 的机制的人大概不会问出这样的问题,因为我们已经习惯了别人画的边界,习惯于在这个框架里思考问题和解决方案。但是实际上,一旦出了这个圈,原来束缚着我们的框架也就不再存在。

不了解一个东西机制的人自然不在这个圈里面,所以我一直以来对所谓小白们的提出的问题抱着很复杂的感情,一方面有的问题确实很欠考虑,也就是所谓的伸手党,答案靠搜一下就能出来却拿起嘴就问。另一方面,有一些问题也很有价值,那是所谓已经入门了的人会忽视的问题,但忽视并非因为了解,反而更多是因为“这点记住就行了”这样的原因,所以这种问题一旦被问出来,很难答出所以然。

这篇文章本来只是为了回答 Home 键的 URL Schemes 而写的,但随着深入了解,却让我发现了一片新天地。

具体使用情景

做到不越狱的 iOS 设备用 URL Schemes 不能做的事;优雅地做到某些不越狱的 iOS 设备用 URL Schemes 做得很难看的事。

如果不越狱的话,前文中提到的那几个需求是不太容易满足的。Laucnher 这个 App 想了个办法模拟 Home 键——让自己闪退!

然而实际使用后的感受非常别扭,它的过程是这样的:

(在任何界面)拉出通知中心-选择"主屏幕"这个动作-先打开 Launcher-再将自己强行闪退…

所以有些事情,如果不越狱,就只有这种很不体面的解决方案;如果越狱了,情况就大不相同。

执行系统操作

比如说,文首提到的几件事,有了 Activator 提供的 URL Schemes 就可以轻松做到:

  • 模拟按一下 Home 键的 URL Schemes 是:activator://send/libactivator.system.homebutton
  • 模拟按一下 Power 键的 URL Schemes 是:activator://send/libactivator.system.sleepbutton

如果你现在是越狱状态并安装了 Activator,你可以直接按下面者两个链接试试:

<center>Home 键 & Power 键 </center>

在 Workflow 使用这些 URL Schemes 就跟正常使用其它 URL Schemes 是一样的,放一个 URLs,接一个 Open URLs

而且,除了 Workflow,这些 URL 可以在各个 URL Schemes 启动器里使用,像 Launcher、Launch Center Pro 还有 Drafts 这些都可以。

运行插件

除了文首的两个问题,我还被问到过一个问题——如何在 Workflow 执行过动作后返回上一个 App?

虽然我不太理解为什么这么做,不过确实有执行它的办法,前提是除了 Activator,你还要装一个叫做 Lastapp 的插件。

执行这个插件的 URL Schemes 是 activator://send/jp.ashikase.lastapp

像上面执行 Home 键的操作一样,只要在你 Workflow 的最后接上一组 URL 的动作,就能够在运行完动作后回到上一个 App。注意:如果上一个 App 为空,也就是你是从 Home Screen 启动的 Workflow 然后运行的动作,Activator 的 URL 会跳转到 Activator 的动作界面。

同理,其它支持用 Activator 开启的插件,都可以用同样的办法来执行,只要找到它们的 Activator Listener ID 即可,而这个东西怎么找会在后文详细介绍。

启动 App

我在 URL Schemes 使用详解里面提到过不是所有 App 都有基本 URL Schemes,所以不越狱想要用 URL Schemes 启动所有 App 是不可能的。但是,所有 App 都必须有 Bundle ID,通过 Bundle ID,利用 Activator 的 URL Schemes 可以直接打开所有应用!而且格式也非常简单:activator://send/Bundle ID

和 URL Schemes 一样,App 的 Bundle ID 放在 info.plist 中。在 info.plist 里搜 CFBundleIdentifier,一般来说下一行就是:

如果你不知道 info.plist 上哪找,你需要看 URL Schemes 使用详解这篇文章的相关部分

启动 App 的 3D Touch 动作

3D Touch 的动作是 6S 的特权,当然,越狱后也已经有了像 revealMenu 和 Peek-a-Boo 这样的插件来实现 3D Touch 的功能。不过,有趣的是,有不少 3D Touch 的快速操作动作不支持 URL Schemes,比如 Dropbox 的"搜索",Safari 的"新无痕浏览标签页"等等。

通过 Activator 的动作 ID,你就可以用 URL Schemes 打开这些 App 的暗藏在快速操作菜单中的动作。

下面我们就来看如何获取 Activator 的动作 ID。

获取 Activator 动作的 ID

看过前面的内容你会察觉到 Activator 动作相关的 URL Schemes 都是以 activator://send/ 开头,后面接动作的 Identifier(后简称 ID)。

这其实非常聪明:

  1. 足够简单,它变量只有一个就是 ID,没有乱七八糟的格式,比不越狱状态下 iOS 的 URL Schemes 规范多了,容易让新手比葫芦画瓢。
  2. 更加精准,ID 不允许重复,不会出现此前的安全事件
  3. 相对易读,因为 Activator 的 ID 的格式和 iOS App 的 Bundle ID 一样,如果开发者不是特别个性,你都应该能直接从这个 Bundle ID 里读出来这是什么 App。Activator 动作的 ID 也一样,你看上面提到过的模拟 Home 键或是 Power 键的动作,一看就知道是干什么的。
  4. 你可以一次性找到所有你设备支持的 Activator 动作的 ID。传统的 URL Schemes 需要到每个 App 里去找,这一点真是太方便了。

第一步:获取列表

你可以直接在 Cydia 搜索 Terminal 来查找自己想用的终端类的 App。好像支持 iOS 9 的只有 @ichitasoMobileTerminal。然后输入 activator listeners 就会刷刷出现你所有的 Activator 动作的 ID。

本来,通过 pbcopy 是很容易做到把上面这一堆东西直接按格式复制下来的。但是因为 iOS 的 /usr/bin 下并没有 pbcopy 的二进制文件,所以无法做到直接复制。

通过 MobileTermina 本身,也无法使用传统的办法进行全选结果然后复制。所以我们需要绕下远路,通过其它 App 用 SSH 的办法来用其它设备获取我们的动作列表。

实际上办法有几个,这里介绍最简单的一种,你可以用 PC、Mac 或另一台 iOS 设备完成。

  1. 在装有 Activaror 的设备上下载 OpenSSH
  2. 在这台设备的设置选项里,查看自己使用的 Wi-Fi 名后面的 i 标签后的界面,里面有你设备的 IP 地址
  3. 把另一台设备也接入同样的 Wi-Fi
  4. 在另一台设备打开 SSH 软件(此处例子为 Mac,可以直接用 Terminal),输入 ssh root@你的 IP 地址
  5. 然后会让你输密码,初始密码是 alpine
  6. 密码对的话就会登录成功
  7. 登陆成功第一件事先改密码,输入 passwd,然后输入新密码即可。
  8. 输入 activator listeners,你就能看到你链接的那个设备上能够执行的动作的 ID 了。

如果对上述步骤的文字版有恐慌,可以看指南曾经出过的相关视频

获取列表后,在设备上全选,然后粘贴到一个你 iOS 设备随时能使用到的地方,它最好能支持搜索,并且对搜索结果高亮。

第二步:认识这些 ID

你看到的这些 ID 大概可以分为以下几个类别:

形式 例子 含义
1 系统设置选项 libactivator.settings.wifi  系统设置中的 Wi-Fi 选项
2 系统功能开关 switch-on.com.a3tweaks.switch.wifi  打开 Wi-Fi
3 系统事件 libactivator.system.homebutton  模拟 Home 键
4 插件功能 jp.ashikase.lastapp Lastapp
5 App 名称 com.ifttt.ifttt com.ifttt.ifttt
6 3D Touch 菜单项 libactivator.shortcut:com.apple.AppStore:Redeem  App Store 兑换界面
7 电话/邮件/信息 libactivator.call/mail  给某个号码打电话/发信息/发邮件

所有动作大概就是这几类,主要的几类上面已经介绍过了。这些动作的 ID 具有高度的规律性。比如说系统设置选项,都是以 libactivator.settings 开头的。如果你想建立打开系统设置选项的动作,直接就可以搜 libactivator.settings 来找自己需要的动作 ID,其它种类同理。

认识了 ID 以后,为了方便你日后分类使用,这里有一个分类查询的技巧:你可以用 grep -i 这个命令去单独匹配你想要的 Activator Listeners,比如说,你想获取关机、Home 键等系统动作,你可以使用命令 activator listeners | grep -i r.system,这样就会出现下图中的 Activator Listeners:

另外这里用 r.system 而不直接用 system 的原因是,直接用后者会匹配到一堆系统铃声相关的 Activator Listeners,这些不属于系统动作。

进阶插件搭配

在这介绍两款免费强大的插件:

给任意 App 增加 3D Touch 选项

由于这篇文章主要说的就是 Bundle ID 跟 URL Schemes,所以正好可以把 Traverse 这个插件推荐给大家。 它是款能够给任意一个 App 增加 3D Touch 快捷操作的插件,利用的就是 App 的 Bundle ID 来确定功能、URL Schemes 来制定动作。

装完 Traverse 后,设置选项的 3D Touch 快捷操作就会出现一个 Respring 的动作:

我们就以这个为例子来看看 Traverse 的动作是如何编写的:

第一步:在设置选项找到 Traverse

诀窍:T 这个字母排列靠后,往下翻。

第二部:编辑或新建动作

编辑的话直接点动作即可,新建的话,先点右上角的 Edit,然后再点左上角的加号:

第三步:动作内容

按完加号你会看到一个比较陌生的界面,通过这个界面你将为指定的 App 自定义任何一个 3D Touch 的快捷动作:

  • Title: 动作标题
  • Sub-title: 动作副标题
  • Bundle ID: App 的 Bundle ID
  • URL Schemes:你想要加的动作的 URL Schemes(这一步需要用到前面讲的东西了)

第四步:动作图标

动作图标指的是快捷操作前的图标,比如前面 Respring 的动作前,有个菊花的图标。不过那个是特制的,目前 Traverse 只支持以下几种图标样式:

这个插件的应用场景很多:比如说在不支持 3D Touch 的设备中,Launch Center Pro 是没有调节快捷操作的选项的,也就是说就算你装了插件,也不能使用 Launch Center Pro 的快捷操作。通过 Traverse,就能实现这样的功能。

Traverse 内部有个 Database,是一些别人做好的动作,大家有兴趣的话也可以自己尝试。

当然我还是觉得自己学会了原理去做适合自己的动作更好。

串联多个系统动作

这里的例子是使用 Activator 的 Listener ID 加上 Activate Command 这个插件,做到让你的 iOS 设备连上蓝牙音箱就自动播音乐

这个动作可以只使用 Activator 内置的动作来完成:

但是内置的动作流的问题是没有调整音量这个能力。这个细节其实很重要,因为当接上蓝牙音箱的时候,iOS 会自动调整到上次我们使用音箱时的那个音量。但这个音量未必是你现在想要的,你不希望太大也不希望太小,更不希望很酷地做了一个自动化动作,结果音量炸裂最后还蠢蠢地要去调整音量……

所以,音量很重要,而要加入音量预设,就只能用命令行来解决:

activator send libactivator.audio.volume.media.10

我们来看这句:

  • activator send:还是和以前的 activator://send/ 一样,只是没了符号(没有符号很重要!)。记得每个 Activator Listeners 之前都要加上它。
  • libactivator.audio.volume.media.10: 这句来控制音量,数字代表百分比,100 就是最大音量。

然后你需要把这段命令粘贴到你的 Activate Command 中:

最后再把这个步骤添加到 Activator 中:

如果你怕误操作,还可以让设备再自动锁屏一下,把锁屏这个动作接到降低音量下面。

整个命令完成的任务是:

打开音响——自动播放音乐——并调节到你想要的音量——锁屏

所以意思就是,你手机都不用掏出裤兜,除了按下蓝牙音箱以后音乐自动想起以外,其它没有任何变化。MAGIC!

这只是我个人使用的一个例子,希望你可以结合自己的需求做出来更符合自己使用情景的东西。

结语

越狱失去意义?My ass.

iOS 4 是越狱的鼎盛时期,我记得 iOS 5 的时候越狱出现还上了微博热门话题。当时越狱盛行的原因是,iPhone 已经普及到了一定地步,但人们关于使用 iOS 的知识和消费习惯都还没有培养出来,消费渠道也很局限。除此之外,iOS 还有不少事情做得让人不够满意,尤其对于国人来说,用惯了九宫输入法和来电归属地黑名单的人太希望自己的设备能做到这些。但 iOS 4 以后,每一次 iOS 的大版本更新,都会有人出来说越狱已死。因为我们会看到那些主流需求一个又一个地在 iOS 内部被实现。

但是越狱这样的事的意义不仅是刚需,它还有很多其它的意义,其中一个就是探索 iOS 能力边界。狱中有 Workflow 这样的 App 在 iOS 的边界上游走,而越狱让我们出了这个边界我们可以做到更多的事。苹果可以把越狱后满足的主流需求融入到 iOS 之中,但是越狱反过来也可以利用这些新的特性做出更巧妙的事:iOS 有了通知中心,越狱就有了通知中心插件;iOS 有了控制中心越狱了就能自定义这个控制中心;iOS 有了 3D Touch,越狱后我们可以修改或者在其它地方利用 3D Touch 的快速操作……

就像盆和水,盆每年都会大一些深一些,但是水还是每年都能溢出来。