無(wú)需第三方 App,同樣可以把你的 iOS 設(shè)備變成 Mac「遙控器」

轉(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ò)LCPWorkflow,我們?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é)到一些有用好玩的技巧。

參考文章:

《把你的 iOS 設(shè)備變成控制 Mac 的「遙控器」》

AutoForwardIMessage

Introduction to AppleScript Language Guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,155評(píng)論 3 425
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,635評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,539評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,255評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,646評(píng)論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,838評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,399評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,146評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,338評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,565評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,983評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,257評(píng)論 1 292
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,059評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,296評(píng)論 2 376

推薦閱讀更多精彩內(nèi)容