苹果自动化脚本这件事,我做了大概三年。从最开始只会点几个快捷指令模板,到后来把 Scriptable、JXA、AppleScript 全用上,得到的最大教训是:选哪条路线,根本不取决于你会写多少代码,而是取决于你每天到底要重复做什么。
见过太多人一上来就研究 Scriptable 的 API,准备大干一场,结果半个月后连一个能稳定跑的脚本都没有。原因很简单:他们连自己需要解决什么问题都没想清楚。反而那些先老老实实列了一周“重复动作”清单的人,往往两三小时就能落地第一个自动化,后面越做越顺。
这篇就把我自己的选型方法和踩坑过程完整写出来。不管你现在是快捷指令都没摸过的纯新手,还是已经在折腾 JXA 的进阶用户,都可以把它当一份“先对任务、再选工具”的参考路线。
1. 苹果自动化脚本有哪些路线可选?先把家底摸清
在匹配任务之前,得先清楚苹果生态里到底有哪几条路能走。很多人以为自动化脚本等于快捷指令,其实这只是看得见的那一条。我按“门槛由低到高、能力由浅入深”的顺序,帮你把几条常用路线盘一遍。
1.1 快捷指令:普通用户的第一站,也确实是多数场景的最优解
快捷指令(Shortcuts)是苹果官方主推的自动化工具,支持 iPhone、iPad、Mac。它最大的意义在于把系统能力打包成了积木块,比如“获取当前日期”“读取剪贴板”“发送信息”“打开 App”“获取 URL 内容”这些动作,你可以像搭积木一样串起来。
它的地位不只是入门工具。我做了几年自动化之后回头看,大概六成以上的重复操作,用快捷指令是最省事、最稳定的方案,原因有两个:
- 系统原生集成,不需要额外安装运行环境,和 iOS 的日历、提醒事项、备忘录、照片、文件、邮件都能直接互通。
- “个人自动化”触发能力是别的工具没有的,包括定时、闹钟停止、充电器连接、到达或离开某地、连接特定 Wi-Fi 或蓝牙设备、打开某个 App 等。
快捷指令的缺点也很明显:复杂的逻辑处理能力很弱。你要做循环嵌套、写大量判断条件、处理字符串数组,积木块拼起来会很痛苦,跑起来也容易出错。另外它不能直接控制第三方 App 内部界面上的按钮(除非那个 App 提供了快捷指令接口),这一点很多人一开始不知道,后面遇到了才明白。
1.2 Scriptable:给“想写点代码但不想折腾系统”的人准备的甜点
Scriptable 是 iOS 上一个用 JavaScript 写脚本的应用,你可以把它理解成一个“深藏在苹果系统里的迷你执行环境”。它比快捷指令灵活得多,可以直接发起网络请求、解析 JSON、读写剪贴板、操作日历和提醒事项、生成桌面小组件,甚至做 Canvas 绘图。
我和 Scriptable 的配合方式通常是这样:把快捷指令当调度器,把 Scriptable 当执行器。快捷指令负责在固定时间触发,然后调用 Scriptable 里的某个脚本,脚本完成后把结果交给快捷指令做后续处理(比如弹通知、存备忘录、发消息)。这样既绕开了快捷指令逻辑弱的短板,又保留了它的定时触发能力。
Scriptable 的上手成本很低,因为它是纯前端 JavaScript,市面上资料也多。但它也有边界:
- 很多接口是只是简单的封装,比如浏览器能力有限、某些超长任务容易被打断。
- App 本身已经被苹果收购后停更一段时间,但 iOS 17、18 上实测仍然稳定,社区维护也跟着。
1.3 AppleScript 与 JXA:Mac 用户深入系统自动化的大门
如果你用的是 Mac,那两条隐藏路线值得知道:AppleScript 和 JXA(JavaScript for Automation)。它们可以直接控制支持脚本化的 Mac 应用,比如“告诉邮件发送某封信”“让浏览器打开某个页面”“让系统通知中心弹一个提醒”,还能做文件系统层面的批量操作。
AppleScript 是老牌脚本语言,语法接近英文,看起来挺“玄学”。JXA 是苹果在 macOS 里加入的 JavaScript 版本,能用 JS 语法调用应用脚本接口,对会写 JS 的人友好很多。
我自己的感觉是:在 Mac 上做系统级自动化,JXA 是真正的杀手锏。配合osascript -l JavaScript命令行或者 launchd 定时任务,可以实现很多 iOS 上做不到的事,比如批量整理桌面文件、自动生成周报、定时备份某个文件夹。
1.4 三条路线怎么对比?一张表说清楚
我把这三条路线常用的维度列成一张表,方便你对照自己的情况:
| 对比维度 | 快捷指令 | Scriptable | AppleScript / JXA |
|---|---|---|---|
| 运行设备 | iPhone / iPad / Mac | iOS / iPadOS | Mac |
| 上手门槛 | 极低,图形化编排 | 中低,会 JS 即可 | 中高,需理解系统脚本机制 |
| 逻辑处理能力 | 弱,复杂逻辑难拼 | 较强,可写函数和循环 | 最强,可控制系统级资源 |
| 定时触发 | 支持,尤其是个人自动化 | 需要借助快捷指令或后台刷新 | Mac 可用 launchd 做到精确定时 |
| 与系统 App 通信 | 非常好 | 一般,局限于脚本接口 | 非常好,可操作许多应用 |
| 网络请求 | 有限,适合简单接口 | 很强,可处理 JSON、REST API | 能配合 curl 等命令,能力看发挥 |
| 后台稳定性 | 高(不过 iOS 有弹窗限制) | 中,脚本太长可能被挂起 | 高,Mac 上基本稳定 |
| 适合的任务 | 提醒、文件整理、日常联动 | 数据抓取、小组件、文本处理 | 文件批处理、自动化办公、系统控制 |
看完这张表你应该能明白:没有任何一条路线是“全都能干”的,任务类型决定了该选谁。接下来关键一步,就是盘清楚自己手上到底有哪些重复任务。
2. 选路线前必做的一步:盘点你的重复任务
我见过最快翻车的方式,就是拍脑袋想一个“高深”的自动化需求,然后折腾几天做出来,发现根本用不上或者根本不该自动化。正确的做法刚好相反:先花三分钟审视自己,再花十分钟记录,最后才决定要不要写脚本。
2.1 别急着学脚本,先记录一周的“无脑操作”
这一周里,你只需要做一件事:每次发现自己在重复做同一个动作,就立刻记下来。不用记太多细节,记一句人话就行。比如:
- 每天上班第一件事,打开日历看今天有哪些会。
- 每天下午发一条固定的工作进度给同事。
- 每次出门前,把导航 App 打开但要先手动切到“回家”地址。
- 每次下载完文件,都要从“下载”文件夹拖到某个项目文件夹。
- 每天睡觉前,手动把手机开勿扰模式。
- 每周五下班前,整理这周拍的照片并传到电脑。
这些看似零散的动作,其实已经泄露了你的真实需求。你会发现大多数重复任务其实集中在四类场景里,继续往下看。
2.2 把重复任务分成四种类型:触发式、定时式、批处理式、跨 App 联动式
我盘任务时习惯先给每条动作打个标签,因为同一类任务往往对应同一条技术路线。
第一类是触发式任务。特点是“当某件事发生时,我需要立刻做另一件事”,比如连上公司 Wi-Fi 就静音手机、打开某 App 时自动弹一个待办、充电到 80% 时给自己发个提醒。这类任务和快捷指令的个人自动化是最匹配的,因为它本身就是事件驱动。
第二类是定时式任务。每天、每周固定时间要做的事,比如早上九点自动生成待办清单、下班前自动把当天文件归档、周四上午自动组织库存报表。这类任务在 iOS 上最好用快捷指令的“定时”自动化,在 Mac 上则可以用 launchd 把 JXA 脚本变成定时任务。
第三类是批处理式任务。一次要处理很多同类对象,比如把几十张照片压缩改名、把一个文件夹里所有 PDF 合并、把网页上的多条数据汇总成表格。这类任务如果放在 iOS 上,Scriptable 会顺手很多;如果是在 Mac 上,JXA 配合osascript是最高效的。
第四类是跨 App 联动式任务。一个流程要经过好几个应用,比如“从邮件里提取附件→存到网盘→发一条通知给同事”。这种任务通常需要快捷指令当“总指挥”,因为它能在多个系统接口之间传递数据,比任何单一脚本工具都舒服。
2.3 判断优先级:只看三项指标
记录了一周重复动作后,条目可能有二十几条,你不可能全做自动化。我建议只按三个指标筛出真正值得做的:
- 频率:每天发生和每周发生,优先度完全不同。
- 耗时:单次耗时超过一分钟,价值才会体现出来。
- 出错率:如果这个动作经常漏做、做错,自动化价值极高,因为脚本不会忘记。
举个例子,我有个朋友说“每天要手动把短信验证码填到网页里”,频率高、耗时短、出错率低,这就不值得反复折腾。但“每天下班前把当天的报销收据整理到一个文件夹”,频率高、耗时长、又容易漏,自动化价值就大。先把这类“高频率、耗时长、经常错”的任务筛出来,再去匹配路线。
3. 根据任务类型匹配路线:这才是“选路线”的核心
盘完自己的重复任务之后,选路线就不再是玄学。我把最常见的需求场景和对应路线拆开讲,每个场景我都会给出具体建议,以及为什么会这么选。
3.1 定时提醒与事件触发类:走快捷指令自动化,够用且稳
如果你的任务属于“某时某刻我要做个操作”或“进入某个环境我要切换状态”,比如上班打卡提醒、离开公司时打开导航、连上公司 Wi-Fi 自动调成静音,那基本不需要写代码,快捷指令的个人自动化就是标准答案。
具体做法并不复杂:打开快捷指令 App,点底部的“自动化”标签,新建个人自动化,选择触发条件(时间、地点、Wi-Fi、蓝牙、充电器等),添加动作,然后关闭底部“运行前询问”开关(部分触发类型允许关闭,后面会讲到坑)。一次配置完,后面就自动触发。
我常碰到有人在这里纠结“要不要用 Scriptable 写一个更高级的定时器”,我的建议是别折腾。快捷指令的“每天上午 9:00”触发已经够精确,而且它会在后台运行,只有通知才弹给你。Scriptable 虽能写更复杂的逻辑,但它没有独立的后台定时能力,最终还是要靠快捷指令或其它手段触发,绕了一圈得不偿失。
3.2 文本处理与数据整理类:Scriptable 是甜点区
如果你的任务是“把一段文本变成另一种格式”“抓取一个网页上的数据并整理成清单”“从剪贴板中提取链接和标题信息”,这类任务用快捷指令的积木块拼能拼出来,但非常痛苦。我试过用快捷指令写一个“获取当前剪贴板内容→提取 URL→抓取标题→追加到备忘录”的流程,逻辑简单,可每加一步都要拖拽半天,后面改格式时更是一场噩梦。
换成 Scriptable 之后,整个体验完全不同。你可以直接用 JavaScript 处理字符串、正则匹配、数组排序,然后调用 API 写进备忘录或生成一个 Markdown 文本。快捷指令负责“调用脚本”那一步,其余交给代码。
举个例子,我想把每天的新闻链接整理成“标题 + 链接 + 摘要”的清单。原先手动复制粘贴十几分钟,现在 Scriptable 脚本里用Request抓取页面,RegExp提取标题,最后CalendarEvent.present或者Pasteboard写入剪贴板。整个过程不到三秒。这种需要处理文本的任务,第一选择永远是 Scriptable。
3.3 网页数据抓取与信息聚合:快捷指令加 Scriptable 的组合拳
苹果生态里没有像电脑那样可以装 Chrome 扩展的自由环境,网页抓取这一步要拆成两层。第一层是获取数据源,第二层是解析和输出。获取数据源有时候快捷指令的“获取 URL 内容”就能完成,但如果目标网页是动态渲染的,或者接口需要自定义 Header、处理 Cookie,快捷指令就非常吃力了。
这种时候我会把 Scriptable 拿来做主执行:在脚本里发请求、处理响应、解析 JSON,最后再回调给快捷指令做后续通知或保存。这个组合我用了大半年,目前最稳定的一个场景是“每天早上抓取某几个网站的更新列表,汇总成一个 Markdown 文件存进 iCloud Drive”,全程不打开任何 App。
有一点要注意:脚本跑的频次太高容易触发网页端的反爬策略。别贪心,一天拉一次就好,尽量加一个 User-Agent 伪装,再设置超时重试。我之前遇到过连续请求十几次后 IP 被封的情况,后面改成 5 分钟缓存一次,稳定多了。
3.4 跨 App 深度联动与文件批处理:Mac 上的 JXA 才是归宿
当任务场景从“整理手机上的几条信息”升级到“整理电脑上的一堆文件”时,快捷指令和 Scriptable 都不再是最优选,原因很简单:它们对 Mac 桌面应用程序的控制力太弱。JXA 此时出场,它可以直接给“访达”“邮件”“备忘录”“浏览器”发指令,能移动文件、发消息、改文件名,甚至控制第三方应用的脚本菜单项。
我举一个真实例子。我每周五需要把桌面上一周产生的截图和下载文件归档到本周日期命名的文件夹里,并给文件夹里的文件名加日期前缀。这个流程用快捷指令做很别扭,因为涉及大量文件系统操作,而且不合适在 iPhone 上跑。后来我用 JXA 写了不到八十行脚本,配合简单脚本命令直接处理。第一次跑就成功,后面再用,稳定得让我怀疑以前手动做了多久。
如果遇到“要操作的应用不支持 AppleScript 或 JXA 接口”,就别死磕这条路,可以先查一下该 App 是否有 URL Scheme 或快捷指令接口,实在不行就回到快捷指令用“打开 URL”过渡。选路线不是越高级越好,而是看它能不能稳定触达你需要的应用。
4. 实操案例:三条路线的完整落地过程
理论讲了不少,下面分享三个我实际跑通的案例,每个都尽量还原我当时怎么想的、怎么试的、最后怎么做出来的。这三个案例分别对应快捷指令、Scriptable、JXA 三条路线,你可以对照自己的任务类型看。
4.1 案例一:每天九点自动生成当日待办清单(快捷指令)
我的需求是每天上午 9 点自动生成当天日期和一张固定格式的待办清单,存到备忘录里。听上去很简单,但快捷指令里有一个容易忽略的点:它默认生成的是“当天提醒”,而我想要的是一个完整清单,最好还能直接显示在备忘录。
我最终的做法是建一个“新建备忘录”快捷指令,内容用“格式化日期”加一段换行文字拼起来,然后在“不询问”模式下定时运行。具体步骤:
- 新建快捷指令,添加“文本”动作,输入今天的日期。
- 再添加一个“文本”动作,内容为几个常见的待办项占位符。
- 用“将内容附加到备忘录”动作,把日期和文本一起写到备忘录里。
- 在自动化里选“定时”,设为每工作日上午 9 点,关闭运行前询问。
这个流程我跑了一个多月,一次都没失败过。唯一要适应的是 iOS 弹“快捷指令自动化已运行”的通知会频繁出现,这个可以在系统设置里单独把快捷指令通知关掉,不碍事。
4.2 案例二:每天下班把剪贴板内容整理成日报草稿(Scriptable)
第二个需求来自一个朋友:他每天下班前要把当天复制过的几条关键信息整理成日报草稿发给团队。他原来是在各个聊天记录里翻找复制内容,效率极低。我给他做了一套方案,核心是用 Scriptable 读剪贴板历史,然后格式化输出。
Scriptable 本身没有自动保存剪贴板历史的能力,所以我们用一个变通思路:在快捷指令里定时把剪贴板内容用 Scriptable 脚本写入一个文本文件,一天里的复制记录会按时间追加。到傍晚触发另一个快捷指令,让 Scriptable 读取当天文件、按时间排序、生成一段“日期 + 内容清单”的日报草稿,再返回给快捷指令弹出来。
这套流程实际跑起来以后,他的日报填写时间从十五分钟缩短到两分钟。核心心得是:Scriptable 的价值不在写复杂代码,而在于它能持久化处理数据,把快捷指令拿不到的数据保存到文件,后面再组合。
4.3 案例三:每周五自动整理下载文件夹(JXA 加 launchd)
Mac 上的需求更多集中在文件处理上。我每周都会从设计网站和文档平台下载很多参考文件,桌面和“下载”文件夹经常一片混乱。手动整理非常烦。我用 JXA 写了一个脚本,按以下逻辑运行:
- 读取“下载”文件夹里的文件列表。
- 按扩展名分成“图片”“文档”“压缩包”“其他”。
- 为每个分类创建子文件夹,把文件移动进去,并在文件名前加上日期前缀。
- 整理完成后发一条系统通知。
然后我用 macOS 自带的 launchd 写了一个定时任务,设定每周五下午 5 点半运行。这个方案不需要任何第三方软件,稳定性远超我之前用“Automator 文件夹操作”做的版本。
跑了几周后,我把移动文件的依据从扩展名改成了“文件是否一周内修改过”,这样避免误把系统下载的临时文件也归类进去。JXA 里获取修改日期的接口一开始没找对,后来查文档发现是FileManager的modificationDate属性,这个细节值得记一下。
4.4 案例四:快捷指令自动化里“运行前询问”这个开关怎么处理
“运行前询问”是快捷指令个人自动化里一个影响很大的设置项,经常有人在这里踩坑。它相当于每次自动触发前弹一个确认按钮,某种程度上是为了防止误操作,但也会让“自动化”名存实亡。
不是所有触发类型都允许关闭这个开关。我实测过:时间、闹钟、充电器、连接 Wi-Fi 等触发通常可以关闭;打开 App、到达某个低功耗模式下无法访问的场景,则可能强制要求确认,甚至 iOS 版本更新后行为还会变化。建议你在配完自动化后手动测一次触发,看是否会弹窗,再把开关固定下来。
如果某些触发确实关不掉确认,那就要评估“手动点一下确认”是否可以接受。我的原则是:十分钟一次的操作可以接受手动确认;每天多次、多动作的自动化,就必须换触发方式或者换 Scriptable 跑完整流程,把“确认”这个动作本身省掉。
5. 真正常踩的坑和排查心得
前面这些案例能跑通,不代表一开始就顺利。做自动化脚本这件事,最大的压力其实来自“明明逻辑正确,系统却不按预期跑”。下面几条坑,是我实打实踩过、也花了最多时间解决的。
5.1 快捷指令自动化被系统限制,怎么判断是不是触发条件问题
快捷指令的自动化并不具备完全后台权限,它依赖系统在合适时机唤醒。如果你发现某个自动化“偶尔触发、偶尔不触发”,先检查这几个地方:充电状态下设备是否锁定、自动化触发条件是否和当前状态冲突、快捷指令 App 的通知权限是否被关闭。
我一次遇到过“地理围栏触发”三四天才跑一次的情况,排查后发现问题出在“精确定位”没开。定位权限如果只允许“使用期间”,自动化脚本就无法在后台读取位置。把所有位置权限改成“始终”,之后触发就正常了。
5.2 Scriptable 脚本频繁被杀,多半是内存或请求时间过长
Scriptable 运行在 iOS 的沙盒里,如果脚本一次性加载太多页面、请求量非常大,很可能会被系统“掐断”。我建议把任务拆小,一次脚本只做一件事。比如抓取十条新闻就十条,不要让脚本循环抓取几十个页面后再统一处理,那样特别容易被系统判定为“失控”。
另一个常见问题是脚本写日志。有人喜欢在脚本里加大量console.log,执行完之后又把日志留在内存里,占用高还可能卡死。我后来都是把日志写到文件或者直接省掉,只保留关键输出。
5.3 后台运行时间太长,系统会在锁屏时挂起脚本
iOS 为了省电,锁屏后一段时间内会暂停后台任务。凡是超出几秒的脚本,最好在“前台运行”或者“用通知提醒用户注意不要锁屏”。我习惯在快捷指令里加一个“显示结果”或“通知”,输出完成后再锁屏,这样脚本基本不会被挂起。
如果你要跑更长时间的任务(比如下载大文件、批量压缩图片),建议切到 Mac 上用 JXA 或命令行脚本去做。手机端硬扛长时间任务,后面一定还会碰到各种偶发中断。
5.4 版本升级后的兼容问题:给脚本留好后路
苹果各版本对快捷指令和自动化权限的限制一直在调整。以前能在 iOS 15 正常跑的自动化,到 iOS 16 可能就必须加一步确认;Scriptable 在某个新版本里也可能改掉某个接口。我的习惯是:核心脚本不要只依赖一个版本行为,尽量把关键逻辑写得“老派”一点,比如多用系统自带动作,少依赖某个 App 的新接口。
同时建议对重要脚本做版本备份。Scriptable 里可以直接复制脚本,快捷指令也可以创建副本。每次系统大版本更新后,先跑一遍副本确认行为没变,再继续使用,这个习惯能帮你省下未来大量排查时间。
6. 给三类读者各自的练习路线
最后这部分,不按功能讲了,按读者水平拆三条练习路径。你对照自己的情况,直接照做就行。
6.1 纯小白:只玩快捷指令,从改模板开始
如果你现在每天还在手动切换专注模式、手动填重复表单,建议只用快捷指令这一条路线。先不必学编程,打开快捷指令 App,找几个常用的官方模板,比如“打开勿扰模式”“记录灵感”,修改其中的动作参数,然后用自动化把定时或地点触发加上。
目标很简单:两周内先做通一个小闭环。比如“每天下午 6 点到家连上家里 Wi-Fi 时,自动把 App 分组切到居家模式并打开记住任务列表”。这类闭环不需要任何代码,但你已经能体会到自动化带来的正反馈。
6.2 有一点基础:从 Scriptable 写第一个脚本开始
如果你已经能把快捷指令玩顺,或者有一点点 JavaScript 基础,就直接进入 Scriptable。先从一个实用小脚本开始,例如“抓取某个网页的标题和摘要并存到备忘录”,把官方文档里Safari Web Extension相关示例跑一遍,慢慢就熟悉了。
最推荐的进阶路径是“快捷指令调脚本”。写一个 Scriptable 脚本,然后在快捷指令里用“运行我的脚本”动作把它接进来,这样你就掌握了“调度器 + 执行器”的组合模式,后面绝大多数复杂自动化都是这个套路。
6.3 想深入系统自动化:从 JXA 开始
如果你在 Mac 上有大量重复操作,建议直接学 JXA。先不用背语法,装一个编辑器(VS Code 就可以),写一个“打开所有工作窗口并隐藏桌面图标”的脚本,再慢慢扩展成“整理下载文件夹”这类实用任务。
JXA 的资料不算多,但苹果官方文档里有很多示例代码,可以直接搜 “JXA examples”。把它和launchd或cron配合,你就能把定时、循环、文件操作都固化下来,基本是 macOS 本地自动化最纯粹的一条路线。
6.4 我的个人建议:先跑通一个完整闭环,再追求复杂
我见过太多人把自动化做成了一本书的工程量。实际上,自动化脚本的价值不是“代码写得漂亮”,而是“每天帮我省下十分钟,且连续两个月不出错”。所以我的个人经验是:每接到一个新自动化需求,我都会先问自己两个问题——这个任务能不能用最简单的快捷指令完成?如果必须写脚本,脚本能不能控制在五十行以内?
如果两个问题的答案都是肯定的,就果断做下去;如果复杂到要写几百行,或者依赖三四个第三方 App 协作,我反而会先停一下,想想是不是把流程拆错了。自动化脚本这件事,最棒的时刻不是写完代码的一瞬间,而是某个周六早上,你醒来看见手机已经默默把一周的简报整理好放在备忘录里,那种感觉,才是坚持做下去的真正动力。