
苹果自动化脚本这件事我做了大概三年。从最开始只会点几个快捷指令模板到后来把 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 与 JXAMac 用户深入系统自动化的大门如果你用的是 Mac那两条隐藏路线值得知道AppleScript 和 JXAJavaScript for Automation。它们可以直接控制支持脚本化的 Mac 应用比如“告诉邮件发送某封信”“让浏览器打开某个页面”“让系统通知中心弹一个提醒”还能做文件系统层面的批量操作。AppleScript 是老牌脚本语言语法接近英文看起来挺“玄学”。JXA 是苹果在 macOS 里加入的 JavaScript 版本能用 JS 语法调用应用脚本接口对会写 JS 的人友好很多。我自己的感觉是在 Mac 上做系统级自动化JXA 是真正的杀手锏。配合osascript -l JavaScript命令行或者 launchd 定时任务可以实现很多 iOS 上做不到的事比如批量整理桌面文件、自动生成周报、定时备份某个文件夹。1.4 三条路线怎么对比一张表说清楚我把这三条路线常用的维度列成一张表方便你对照自己的情况对比维度快捷指令ScriptableAppleScript / JXA运行设备iPhone / iPad / MaciOS / iPadOSMac上手门槛极低图形化编排中低会 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 加 launchdMac 上的需求更多集中在文件处理上。我每周都会从设计网站和文档平台下载很多参考文件桌面和“下载”文件夹经常一片混乱。手动整理非常烦。我用 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 协作我反而会先停一下想想是不是把流程拆错了。自动化脚本这件事最棒的时刻不是写完代码的一瞬间而是某个周六早上你醒来看见手机已经默默把一周的简报整理好放在备忘录里那种感觉才是坚持做下去的真正动力。