Matrix 精選Matrix 是少數(shù)派的寫作社區(qū),我們主張分享真實(shí)的產(chǎn)品體驗(yàn),有實(shí)用價值的經(jīng)驗(yàn)與思考。我們會不定期挑選 Matrix 最優(yōu)質(zhì)的文章,展示來自用戶的最真實(shí)的體驗(yàn)和觀點(diǎn)。 文章代表作者個人觀點(diǎn),少數(shù)派僅對標(biāo)題和排版略作修改。 前言快捷指令,是 Apple 收購 Workflow 后為 iOS 設(shè)計(jì)的自動化工具。在中文社區(qū)另有一個更為人所知的名字:捷徑。 在 iOS 12 上 Apple 發(fā)布了第三方應(yīng)用的捷徑接口,可以提供自定義的操作。但顯然那是一個不成熟的版本:雖然第三方應(yīng)用可以提供操作,卻無法從捷徑獲取參數(shù),也無法返回結(jié)果給下一個操作。 在當(dāng)時,比較常見的做法是將參數(shù)寫到剪貼板,第三方應(yīng)用讀取剪貼板,再把結(jié)果寫回剪貼板,然后捷徑再讀取剪貼板。這樣復(fù)雜的操作讓第三方應(yīng)用與捷徑的配合成為了雞肋,沒有多少實(shí)用價值。 在 iOS 13 上 Apple 終于解決了這個問題,JSBox 為此做了諸多改進(jìn),因此我想通過這篇文章來介紹這些改進(jìn)。 本文的受眾是「快捷指令」用戶和 JSBox 用戶,了解如何更好地將兩個軟件結(jié)合在一起。對于我個人而言,「快捷指令」的強(qiáng)大在于可以快速地組合出一些功能,JSBox 的強(qiáng)大之處在于更靈活、底層、以及能夠?qū)崿F(xiàn)更好的用戶交互。 所以,這篇文章就來研究一下 JSBox 和「快捷指令」如何取長補(bǔ)短,而不是互相取代。 JSBox 支持的「快捷指令」操作目前在 iOS 13 上面,JSBox 為「快捷指令」提供了三個操作:
下面,我將使用一些簡單的例子介紹這幾個動作。 運(yùn)行 JavaScript這個操作為「快捷指令」提供了直接運(yùn)行 JavaScript 腳本的能力,在一些比較「高級」的快捷指令里面,你可能看過為了運(yùn)行復(fù)雜邏輯而將 JavaScript 填寫到一個網(wǎng)頁,然后獲取網(wǎng)頁運(yùn)行結(jié)果的做法,像是 這篇文章 里面介紹的那樣。 我得承認(rèn)這個做法的聰明之處,因?yàn)樵凇缚旖葜噶睢估锩孀鲆恍?fù)雜運(yùn)算是一件很痛苦的事情,尤其是對于一些復(fù)雜的數(shù)學(xué)運(yùn)算和邏輯運(yùn)算?!缚旖葜噶睢共⒉荒苤苯舆\(yùn)行代碼,通過網(wǎng)頁來執(zhí)行是非常巧妙的變通辦法。但這個方法操作成本極高,你需要花費(fèi)巨大的力氣,而僅僅是為了在「快捷指令」里面執(zhí)行一段 JavaScript。 如果通過 JSBox 提供的這個操作則非常容易,你可以直接構(gòu)造一段 JavaScript 代碼傳遞給 JSBox,然后直接獲得運(yùn)行結(jié)果。代碼同步執(zhí)行會直接將最后的值作為「快捷指令」的輸出,如果需要異步執(zhí)行腳本,可以使用 通過「快捷指令」提供的模板字符串,我們可以輕松地用變量構(gòu)造出 JavaScript,并傳遞給 JSBox 來執(zhí)行: ![]() 由于使用的是 JSBox 內(nèi)置的 JavaScript 引擎(JavaScriptCore),不僅支持最新的語法,還支持 JSBox 提供的接口(文檔)。這樣能做到的事情就多了很多,甚至有些功能是「快捷指令」并未提供的,例如獲取設(shè)備類型、實(shí)現(xiàn)遞歸和復(fù)雜的數(shù)學(xué)計(jì)算: ![]() 此外,在下一個大版本里面,JSBox 將支持運(yùn)行 Node.js,這個能力同樣也會提供給「快捷指令」。 運(yùn)行 JSBox 腳本通過傳入腳本名和參數(shù)來在后臺運(yùn)行 JSBox 腳本。腳本可以通過代碼獲取到「快捷指令」輸入的參數(shù),進(jìn)行一頓操作之后,將結(jié)果輸出給下一個「快捷指令」操作??蛇x的參數(shù)是一個「詞典」類型,在「快捷指令」里面表現(xiàn)為一個鍵值對,而在 JSBox 腳本里面,則可以用 ![]() 腳本運(yùn)行結(jié)束后,通過上面介紹過的 可以在結(jié)果里面填入一個 JSON 字符串,然后利用「快捷指令」的數(shù)據(jù)自動轉(zhuǎn)換功能將其轉(zhuǎn)換成一個詞典,例如這樣: ![]() 通過這樣的參數(shù)傳遞,在 iOS 13 的「快捷指令」里面,我們可以將支持「快捷指令」的第三方應(yīng)用都串聯(lián)起來,實(shí)現(xiàn)任意應(yīng)用的互通。 顯示 JSBox 界面JSBox 提供了強(qiáng)大的界面接口,你可以輕松的用 JavaScript 實(shí)現(xiàn)出簡潔、漂亮的用戶界面,而這恰恰是「快捷指令」的一個弱項(xiàng)。 這個操作大體上和運(yùn)行 JSBox 腳本的動作使用方式一樣,也是通過腳本名和可選參數(shù)來啟動。區(qū)別是在于這個操作是用來顯示一個用戶界面,這個界面是由 JSBox 腳本實(shí)現(xiàn)的。 例如下面這個例子,用 JSBox 改進(jìn)在「快捷指令」和 Siri 頁面的顯示: ![]() ![]() 類似這種在 Siri 界面無法提供良好顯示的「快捷指令」,通過 JSBox 可以更好地顯示: 左:快捷指令,右:JSBox實(shí)現(xiàn)上面兩個例子用的代碼也十分簡單: ![]() 實(shí)用案例:本地化在「快捷指令」里面實(shí)際上是不好做本地化的,不方便為一個標(biāo)簽在不同語言下,提供不同的文本,但通過 JSBox 卻可以輕易做到: ![]() JSBox 通過判斷當(dāng)前設(shè)備的語言,返回給「快捷指令」不同的詞典,然后「快捷指令」就可以通過鍵來讀取本地化后的文本,從而實(shí)現(xiàn)「快捷指令」的本地化。 實(shí)用案例:數(shù)據(jù)庫「快捷指令」沒有提供良好的持久化方案,目前常見的做法是將內(nèi)容編碼成文本后存在 iCloud 云盤,但通過 JSBox 你卻可以在「快捷指令」里面使用數(shù)據(jù)庫: ![]() ![]() JSBox 的代碼實(shí)現(xiàn)也很簡單,甚至提供了可視化的數(shù)據(jù)庫查看工具: ![]() 考慮到篇幅限制,這個案例只展示了如何插入和查詢一個簡單的數(shù)據(jù),但實(shí)際上 JSBox 對 SQLite 進(jìn)行了完整的封裝,能做的事情遠(yuǎn)不止于此。 使用「快捷指令」增強(qiáng) JSBox上面的話題基本上是圍繞如何用 JSBox 增強(qiáng)「快捷指令」,而下面我們要討論一個相反的話題:如何用「快捷指令」增強(qiáng) JSBox?!缚旖葜噶睢棺鳛榈谝环絻?nèi)置的應(yīng)用,有很多第三方應(yīng)用無法獲得的超級入口,作為第三方應(yīng)用,JSBox 盡可能地利用了這些接口,從而讓以使用 JSBox 為主的用戶可以更方便。 「快捷指令」自動化其實(shí)在很久以前,JSBox 也提供了類似「快捷指令」自動化的功能,不過受限于第三方應(yīng)用的限制,JSBox 只支持了:定時、定位、打開應(yīng)用等幾個簡單的場景。在觸發(fā)之后,JSBox 會發(fā)一個通知給用戶,點(diǎn)擊之后可以運(yùn)行腳本。 雖然流程極為類似,但「快捷指令」擁有很多第三方應(yīng)用無法實(shí)現(xiàn)的觸發(fā)器。這里我就以我個人在使用的一個自動化操作為例,連接到 CarPlay 的時候,自動打開 JSBox 執(zhí)行一個腳本(使用 JSBox 的 URL scheme): ![]() 我在 CarPlay 的腳本里面實(shí)現(xiàn)了大量的邏輯,這些邏輯在「快捷指令」里面并非不能實(shí)現(xiàn),只是實(shí)現(xiàn)起來極為復(fù)雜。目前我用的場景還不是很多,但我相信在之后的版本里面,「快捷指令」會提供更多觸發(fā)選項(xiàng),讓自動化更實(shí)用。 輔助觸控在 iOS 系統(tǒng)設(shè)置里的「輔助功能 - 觸控 - 輔助觸控」選項(xiàng)里面,你可以設(shè)置 iPhone 屏幕上的輔助觸控按鈕(通俗講法叫「小圓點(diǎn)」)。我們不在這里討論這個輔助觸控的設(shè)計(jì)意圖是什么,僅聊聊輔助觸控選項(xiàng)可以設(shè)置為「快捷指令」這件事。 是的,在 iOS 13 里面,輔助觸控的選項(xiàng)不僅可以換成固定的那幾個,還可以設(shè)置成任意的一個「快捷指令」: ![]() 這樣的話你就得到了屏幕漂浮起來的一個按鈕,點(diǎn)擊之后就可以運(yùn)行一個「快捷指令」。如果希望更快,甚至可以將頂層菜單的內(nèi)容刪到只剩下一個,或者是將 3D Touch 的操作設(shè)置成一個「快捷指令」。 如果希望運(yùn)行的是 JSBox 腳本呢?當(dāng)然是利用上面提到的方法將 JSBox 的「快捷指令」操作塞進(jìn)去啦,類似這樣: ![]() 這個方案提供了一種極為有趣的交互方式,讓小圓點(diǎn)的功能從理論上變成了無限可能。 共享表單英文原文是 Share Sheet,「快捷指令」里面翻譯成共享表單,指的是 iOS 系統(tǒng)提供的分享界面??赡芎芏嗳艘呀?jīng)注意到了,在 iOS 13 上一個具體的「快捷指令」可以直接成為共享表單的一級選項(xiàng): ![]() 類似 JSBox 的第三方應(yīng)用只能把自己的選項(xiàng)納入應(yīng)用圖標(biāo)下的二級選項(xiàng),意味著要多一次點(diǎn)擊。我們可以故技重施,利用「快捷指令」來調(diào)用 JSBox 從而把腳本變成一級選項(xiàng): ![]() 添加到主屏幕包括 JSBox 在內(nèi)的很多應(yīng)用都提供了將某個功能添加到 iOS 主屏幕的功能,支付寶小程序也有類似的設(shè)計(jì)。這個功能的技術(shù)原理是添加一個網(wǎng)頁書簽到桌面,然后通過 URL Scheme 在網(wǎng)頁上跳轉(zhuǎn)到原生應(yīng)用。 很不幸的是,在 iOS 13 上面這個功能壞掉了,所有類似的方案都不能正確地跳轉(zhuǎn)(第一次打開書簽?zāi)苷LD(zhuǎn),但是之后的跳轉(zhuǎn)都不會成功)。 目前我還沒有想到比較好的辦法來為 JSBox 用戶修復(fù)這個問題,這里先提供一個變通辦法:
![]() 由于 iOS 13 上面「快捷指令」的桌面圖標(biāo)功能使用起來非???,不需要通過網(wǎng)頁跳轉(zhuǎn)(畢竟是「親兒子」),所以這個做法實(shí)際上并沒有比 iOS 12 效率低,只是添加過程稍微麻煩了一點(diǎn)。 總結(jié)我個人認(rèn)為,去年的「快捷指令」尚不能真正發(fā)揮多個應(yīng)用整合的威力,而從今年開始,輸入輸出參數(shù)的支持讓應(yīng)用互通這件事變得更方便,我們也一定會看到更多有趣的實(shí)現(xiàn)。 JSBox 作為面向效率而生的應(yīng)用,在之后也會提供更多與「快捷指令」互通的可能性,例如文件操作接口、打開應(yīng)用執(zhí)行等等。 希望這篇文章對「快捷指令」用戶和 JSBox 用戶能有一定的幫助,如果你有任何的看法或是建議,請通過下方的留言讓我知道,感謝。 送碼在評論區(qū)說說你對于 JSBox 的建議和看法,你對于「快捷指令」+ JSBox 的搭配有沒有不一樣的玩法?開發(fā)者會在評論區(qū)選擇 5 位讀者送出 JSBox 兌換碼一枚。 |
|