轉(zhuǎn)載自:無(wú)需第三方 App,同樣可以把你的 iOS 設(shè)備變成 Mac「遙控器」 - 少數(shù)派
一個(gè)月前JailbreakHum同學(xué)寫(xiě)了一篇《把你的 iOS 設(shè)備變成控制 Mac 的「遙控器」》。碰巧我當(dāng)時(shí)也想要寫(xiě)一篇類(lèi)似的文章,當(dāng)這標(biāo)題映入眼簾,我心里便是咯噔一下,腦海里閃過(guò) N 個(gè)加粗大字:「該死,我想寫(xiě)的東西居然被搶先了!」。
不過(guò),仔細(xì)一讀,發(fā)現(xiàn)雖然晚了一步,但自己的方法還是有可取之處的,簡(jiǎn)單來(lái)講,我的方法和 JailbreakHum 那篇文章實(shí)現(xiàn)的效果相同,都利用了 AppleScript,但是我不需要用Hazel,事實(shí)上無(wú)需任何第三方應(yīng)用,就可以實(shí)現(xiàn)通過(guò) iPhone 來(lái)控制 Mac。
原理
想要遙控 Mac,關(guān)鍵就在于 Mac 上要有一個(gè)能根據(jù)手機(jī)上的指令自動(dòng)觸發(fā) AppleScript 的后臺(tái)程序。但是,我們有沒(méi)有必要為了遙控 Mac 特意買(mǎi)一些應(yīng)用(比如 Hazel),然后單純?yōu)榱诉b控 Mac 就讓這些應(yīng)用常駐后臺(tái),這是對(duì)金錢(qián)和內(nèi)存的雙重浪費(fèi)。
所以在我看來(lái),這個(gè)用來(lái)觸發(fā) AppleScript 的扳機(jī)應(yīng)該滿足兩個(gè)條件:
這是一個(gè)我們本來(lái)就一直放在后臺(tái)的應(yīng)用;
這個(gè)應(yīng)用最好免費(fèi)。
好消息是,確實(shí)有兩個(gè)應(yīng)用完全符合要求,它們就是 Message 和 Mail 兩個(gè)原生應(yīng)用。大多數(shù)人都不知道 Message 和 Mail 都自帶了自動(dòng)運(yùn)行 AppleScript 功能,下面請(qǐng)讓我一一介紹。
通過(guò) Message 操控 Mac
Message 啟用自動(dòng)觸發(fā) AppleScript 的方法是在應(yīng)用偏好設(shè)置中打開(kāi) 「通用 - AppleScript 處理程序」菜單,從中選擇我們想要運(yùn)行的 AppleScript。
令人意外的是,蘋(píng)果已經(jīng)為我們準(zhǔn)備好了幾個(gè)十分有用的 AppleScript,例如用來(lái)遙控 iTunes 的 iTunes Remote Control。而這些用來(lái)運(yùn)行的 AppleScript 就儲(chǔ)存在/Users/用戶名/Library/Application Scripts/com.apple.iChat/中。
點(diǎn)開(kāi)這些 AppleScript 文件,在文件最開(kāi)頭的是蘋(píng)果的免責(zé)聲明,后面就是腳本代碼了,代碼的注解非常詳細(xì),即使不熟悉 AppleScript 的人也能大概看懂(學(xué)習(xí) AppleScript 的好教材)。
這里以選擇 iTunes Remote Control 為例。先讓我們來(lái)看一下這個(gè) AppleScript 的效果。
首先,確保我們 Mac 上所使用的 iMessage 帳號(hào)與我們手機(jī)上的帳號(hào)不同(你可以先試一試如果賬號(hào)一樣會(huì)發(fā)生什么)。
然后,我們只要從 iPhone 上向電腦上的 iMessage 帳號(hào)發(fā)送play,iTunes 就會(huì)被自動(dòng)打開(kāi)并播放音樂(lè),不僅如此,你還會(huì)收到 iMessage 回復(fù)告訴現(xiàn)在正在播放的是什么。除了 play 以外,其它指令還包括:
pause: 暫停
status: 播放狀態(tài)
next: 下一首
previous: 上一首
mute: 靜音
unmute: 解除靜音
help: 顯示幫助
但是,這個(gè) AppleScript 有兩個(gè)小的問(wèn)題。
1. 我們 Mac 上的 iMessage 帳號(hào)與 iPhone 上的一般是一樣的,我們不可能為了遙控器的需求,去讓 Mac 使用一個(gè)不同的賬號(hào) ,但請(qǐng)看代碼的這里:
on getCurrentiTunesTrack()
set theCurrentTrackMessage to "Not playing."
由于反饋信息 (theResponse) 被默認(rèn)為 「Unknown Command.」,即一旦收的任何沒(méi)有預(yù)先設(shè)定過(guò)的命令,Apple Script 都會(huì)自動(dòng)回復(fù) 「Unknown Command」, 而 「Unknown Command.」 本身也并非定義過(guò)的指令!所以當(dāng)自己給自己發(fā)送信息后會(huì)發(fā)生什么,相信聰明如你應(yīng)該明白了吧。
2. 萬(wàn)一你的基(姬)友也看到了這篇文章,趁你在開(kāi)會(huì)時(shí)給你發(fā)了 「unmute」「play」那又該怎么辦……?
所以,我們希望能通過(guò)「自己給自己發(fā)短信」的形式來(lái)激活這個(gè) AppleScript,而且確保只有自己的 iMessage 賬號(hào)才能遙控 Mac。
為了解決這些問(wèn)題,我想先簡(jiǎn)單介紹一下這個(gè) AppleScript 的代碼。代碼主要由兩部分組成,第一部分類(lèi)似一個(gè)「控制器」(message received),會(huì)在收到手機(jī)發(fā)來(lái)的信息時(shí)將命令提取出來(lái),之后通知第二部分(runiTunesRemoteControl)用提取出的命令對(duì) Mac 上的 iTunes 進(jìn)行操作。
操作結(jié)束后,第二部分會(huì)生成一個(gè)反饋信息,并將它發(fā)回「控制器」,再由「控制器」將反饋信息發(fā)給手機(jī)。
可以想象,如果「控制器」能在收到信息時(shí)檢查一下信息是否來(lái)自我們本人,再?zèng)Q定是否通知第二部分進(jìn)行操作,并且能在發(fā)送反饋信息給手機(jī)前,確保不會(huì)再將 「Unknown Command.」 發(fā)回,一切不就解決了嗎?
因此我們的改動(dòng)將集中在「控制器」,也就是這段代碼上:
on message received theMessage from theBuddy for theChat
-- 將命令(theMessage)傳到第一部分,并將反饋信息存在 theResponse 中
set theResponse to runiTunesRemoteControl(theMessage)
-- 向手機(jī)發(fā)送 theResponse
send theResponse to theChat
end message received
改動(dòng)后:
on message received theMessage from theBuddy for theChat
set serviceBuddy to name of service of theBuddy
-- 檢查發(fā)送者是否是我自己
if serviceBuddy = myiMessageAccount then
set theResponse to runiTunesRemoteControl(theMessage)
-- 確保反饋不是 「Unknown Command.」
if theResponse ≠ "Unknown command." then
send theResponse to theChat
end if
end if
end message received
這樣一來(lái),問(wèn)題就算是解決了,當(dāng)然你也可以在此基礎(chǔ)上加上其他你想要的功能,例如關(guān)閉屏幕等。這些改動(dòng)需要在代碼的第二部分中完成,只需要在多加幾個(gè) 「if」 條件語(yǔ)句即可。
如果你有一定編程基礎(chǔ)的話,這個(gè)腳本還可以變得更加強(qiáng)大,它可以把手機(jī)上發(fā)來(lái)的信息直接輸入 Mac 的 Termial,這樣一來(lái)我們手機(jī)上的 Message 應(yīng)用可以變成一個(gè)類(lèi)似 shell 的存在,可以動(dòng)態(tài)執(zhí)行手機(jī)上傳來(lái)的命令。
也就是說(shuō),我們的手機(jī)可以遙控 Mac 干任何事情,如果有讀者有興趣,我會(huì)在更新時(shí)貼上實(shí)現(xiàn)方法。
通過(guò) Mail 操控 Mac
相較于使用 Message, Mail 的好處在于可以設(shè)定不同規(guī)則觸發(fā)不同的 AppleScript,這樣我們就沒(méi)有必要把所有 AppleScript 寫(xiě)在一個(gè)文件里或是寫(xiě)一個(gè)需要調(diào)度其他 AppleScript 的 AppleScript。
除此以外,還有一個(gè)好處就是如果你是 Android 手機(jī),可能無(wú)法使用 iMessage 給自己發(fā)信息,但是 Mail 卻是完全通用的。
Mail 的設(shè)置相較 Message 容易,因?yàn)槲覀兛梢酝ㄟ^(guò) Mail 直接設(shè)定 AppleScript 的觸發(fā)條件,而不是在 AppleScript 里用代碼來(lái)判斷。這樣對(duì)于沒(méi)有編程基礎(chǔ)的人來(lái)說(shuō)更為簡(jiǎn)單。
這里以添加一個(gè)能關(guān)閉屏幕的 AppleScript 為例。
1. 先創(chuàng)建一條關(guān)閉屏幕的 AppleScript,在應(yīng)用程序中打開(kāi)「腳本編輯器」,新建一個(gè) AppleScript,命令很簡(jiǎn)單,只要輸入一行do shell script "pmset displaysleepnow"即可,之后保存。
2. 打開(kāi)郵件應(yīng)用,在偏好設(shè)置里點(diǎn)擊「規(guī)則 - 添加規(guī)則」;
3. 在這里我們就可以設(shè)定條件,我們把條件設(shè)置為 「主題包含 Turn off the screen」 且 「發(fā)件人等于 XX@XXX.com(你的郵箱)」,并在「就執(zhí)行下列操作」中選擇「運(yùn)行 AppleScript」,然后選擇運(yùn)行我們事先寫(xiě)好的可以關(guān)閉屏幕的腳本,在運(yùn)行完后視情況刪除郵件。
與 Launch Center Pro & Workflow 整合
所謂沒(méi)有最懶只有更懶,通過(guò)LCP與Workflow,我們?cè)谶b控時(shí)就不用重復(fù)輸入命令了。
首先介紹 Message 版的設(shè)置方法:
1. 在 Workflow 里建立動(dòng)作,在 Text 塊中輸入命令,這里以 「Pause」 為例,然后添加一個(gè) Send Message 塊。
2. 點(diǎn)擊右上角的齒輪,選擇 「Share Workflow」,在第二行中選擇 「Add to Launch Center」 。
3. 然后在 LCP 中,建立一個(gè) Remote Control 組,把 Workflow 放入即可。
這樣一來(lái),我們就能兩鍵暫停 Mac 上的音樂(lè)了(因?yàn)榘l(fā)送信息還要點(diǎn)一次)。
對(duì)于 Mail 版,操作則可以徹底一鍵化,因?yàn)?Workflow 可以在應(yīng)用內(nèi)發(fā)送郵件。我們可以這樣設(shè)置 Workflow:
同樣,與 LCP 整合后:
寫(xiě)在最后
我原來(lái)還想介紹一下如何用Command-C來(lái)遙控,但是因?yàn)?macOS Sierra 的新特性——通用剪貼板,Command-C 可以說(shuō)已經(jīng)退出了歷史的舞臺(tái)。
同時(shí)我也要感謝 JailbreakHum 的文章,結(jié)合他的文章,讀者們也許可以學(xué)到更多。
希望大家能在這篇文章里學(xué)到一些有用好玩的技巧。
參考文章: