苹果刚发布优山美地的新操作系统的时候,每个人都一直讨论iOS 8、iPhone 6、iPhone 6+ 和手表,但还有一个重要的特性是OS X的JavaScript自动化作业。当它可能被所有的记者忽略时,没有被我们忘记。 Burke Holland写了一篇非常精彩的论述JavaScript目前是怎么作为第一公民的博文。除了苹果公司网站上的初级的文档,几乎没有任何关于此内容的资料,既然如此,那这篇文章将会为你展示怎么使用Javascript来实现OS X 自动化作业。
注意:我正使用的API还处于开发中。下面展示的任何内容可能会发生变化。
开始
在你安装优山美地后,进入“应用程序(Applications)” -> “实用工具(Utilities)”,下翻直至你看见如图1所示的脚本编辑器(Script Editor)
图1:脚本编辑器路径以前你编写自动作业的唯一选择是 AppleScript,现在你发现 Javascript 被添加进去了。
图2:脚本编辑器选择 JavaScript,我们一起创建些东西。
实例:自动发送邮件
如果你曾经自动化过作业,你肯定和邮件应用(Mail app)打过交道。 下面是一个AppleScript片段。
1 2 3 4 |
tell application "Mail" set theMessage to make new outgoing message with properties {visible:true, subject:"Thanks for buying from us!", content:"My Body"} end tell |
我用同样的片段,加一点点复杂的正文,但全部是由 JavaScript写成的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Mail = Application('Mail'); content = "Hi Michael,nn" + "Hello, How are you! nnThanks for stopping by today!" + " We really appreciate your business nn" + "Sincerely,nn" + "Company Name"; msg = Mail.OutgoingMessage({ subject: "Thanks for buying from us!", content: content, visible: true }); Mail.outgoingMessages.push(msg); Mail.activate(); |
这里有一些事情需要注意:
- 分号是可选的,因为分号自动插入。
- 我实例化了一个全局变量;而不是使用下面的代码:
var Mail = Application(Mail);
- 我可以使用单引号或者双引号包给出硬编码的值
如果运行这个脚本,将出现下面的邮件对话框,如图3所示
图3:邮件信息和已填的域
但是我们如何知道哪些属性是可用的?
好问题,如果你处在脚本编辑器中,点击“窗口(Windows)”->“资源库(Library)”,看到一个你可以交互的应用列表。
如果我们选择邮件应用,它会默认使用AppleScript。 简单换成 JavaScript,你可以看到图4中我们刚使用的OutgoingMessagen类上可用的属性。
图4:文档中检查OutgoingMessagen类
很酷,但是其他的应用呢?
备忘录是我们可以交互的另一个应用程序,但是苹果设置了安全提示来阻止恶意脚本。 我们可以简单地用几行 JavaScript 和备忘录进行交互。
1 2 3 4 5 6 7 8 |
Notes = Application('Notes'); Notes.activate(); delay(1); SystemEvents = Application('System Events'); Notes = SystemEvents.processes['Notes']; Notes.windows[0].splitterGroups[0].groups[1].groups[0].buttons[0].click(); |
若你运行这个应用,你会遇到下面如图5所示的对话框。
图5:安装和策略对话框点击打开“系统偏好设置”后,你可以授予这段脚本权限,笔记本程序就会自动打开。
现在,我确信你想知道不在脚本编辑器中如何运行这些脚本。 你可以点击文件->导出,改变格式为应用,如图6所示。
其他自动化作业
你可能不想和一个应用程序交互,而是希望你的应用朗读东西给用户。你可以用几行 JavaScript实现这。
1 2 3 |
App = Application.currentApplication(); App.includeStandardAdditions = true; App.say("Hello from Telerik Headquarters"); |
这将会使用你系统已安装的默认语音和语言来朗读出这些文字“Hello from Telerik Headquarters”。
你也可以用它来获取输入,例如名字:
1 2 3 4 5 6 7 8 |
App = Application.currentApplication(); App.includeStandardAdditions = true; answer = App.displayDialog('Please enter your Name', { withTitle: 'Name', defaultAnswer: 'Telerik' }); |
这会显示一个提示框(图7),你可以在Results 窗口中看见他们实际输入的内容(图8)。 这个例子中,我输入我的名字,“Michael”。
也可以通过终端使用JavaScritp自动化作业
已经足够惊喜了,JavaScript自动化对来那些使用 bash来自动化作业的人也是非常有用的。 这里是一个使用 osacriopt 交互模式打开 Safari,新建一个 tab 页并导航到 http://www.telerik.com 的命令行。以下是我们前面说到的纯 JavaScript 脚本。
1 2 3 4 5 6 7 |
osascript -l JavaScript -i Safari = Application("Safari"); window = Safari.windows[0]; window.name(); tab = Safari.Tab({url:"http://www.telerik.com"}); window.tabs.push(tab); window.currentTab = tab; |
图9中的截图显示了它在终端中的呈现。
Safari 会被打开并新建一个tab 页,如下图所示
回顾终端,注意当我调用window.name()时,它返回“ Top sites”。这对了解用户处在哪个页面是非常有用的。
利用Objective-C桥接器
如果你希望使用不在默认Foundation库中的库,它是非常有用的。 你可以实现下面的代码来利用类似 Cocoa的库。
1 2 3 |
ObjC.import('Cocoa'); str = $.NSString.alloc.initWithUTF8String('Writing text to file through obj-c bridge.'); str.writeToFileAtomically('/Users/MichaelCrump/FromObjCBridge.txt', true); |
这段代码导入了Cocoa库,用文本实例化一个 NSString并传入文件位置和设置第二参数为True来调用writeToFileAtomically方法。这确保在磁盘上完全写完新文件完之前,旧文件不会被修改或者删除。
我们可以进到我们的文件夹来打开文本文件,并看到如图10所示的预期结果。
图10:Obj-C桥接器写文件到磁盘上
JavaScript开发人员的更多机会
我们感受到越来越多关于JavaScript 作为优山美地中一等公民的影响。 对于NativeScript来说是前沿且核心的。NativeScript使得开发人员可以用JavaScript轻易地利用可用的或自定义设备的API,如摄像头,加速器,地理位置等,来构建原生应用。有许多关于NativeScript 的讨论,如果你想了解更多,我将给出FAQ链接。
NativeScript允许我们用JavaScript为iOS,Android和通用的Windows创建原生应用。
前瞻
对于目前我所看到关于优山美地自动化的JavaScript,我感到非常兴奋。在写这篇文章前,我从未使用过 AppleScript,但我写过JavaScript。 我能用我熟悉的语法成功地写自动化任务。 全世界的JavaScript 开发者应该庆贺,即使他们不打算编写自动化任务,因为专长变得越来越重要。