ipad + mac mini 自動隨航(最佳化方案)
背景
在之前的文章中,介紹了搭建 vscode 伺服器,透過 ipad 進行訪問的方式,但實際操作下來,發現還是沒有辦法達到很好的效果。
問題包括:
- 網頁連線 vscode 之後,在不同應用中切換經常會導致重連,也很容易超時重連,用來當玩具可以,但如果要用作實際工作,則發現效率很低。
- 只能使用 vscode,其他相關聯的工具沒法使用,同樣會導致用 ipad 無法進行順暢的工作,達不到一臺“電腦”的效果
而自己實際上還是在家工作的場景多,更多的時候,只是不想長時間坐在書桌旁,而想“居家移動式”辦公,可以癱在沙發上辦公,或者冬天晚上在被窩裡。走到書桌旁辦公,總有種需要 “正襟危坐” 的感覺。而我只想隨手開啟筆記本就可以開始幹活。
所以我希望用 ipad+鍵盤,實現在家裡能控制mac mini,讓 ipad+鍵盤 變成一個遠端客戶端,這樣就可以避免 ipad os 上各種軟體,體驗不相容的問題。
對比
網上搜尋相關的指引,基本就是兩類,一類是透過 ipad 的隨航功能。另一類這是透過向日葵之類的遠端軟體。
-
遠端軟體的方式是更成熟的連線,能夠真正用在“生產力”上面,但缺點是要💰,而且自己的電腦也不想裝遠端控制軟體
-
網上提供的隨航的功能方法,還停留在“玩具”階段,看起來可行,但如果在要用在日常辦公上,就不那麼理想,原本的隨航方案,最主要的問題有兩個:
-
使用過程中連線斷開或者滑鼠卡死,這時需要跑到 mac mini 上面重新連線,這種打斷在真實工作的場景中,影響是非常大的,直接會讓自己無法繼續使用 ipad 工作,試想我的活幹到一半,然後連線斷掉了,還要跑到 mac 邊上操作。人都走到 mac 邊上了,就直接在 mac 上幹活了,可以在家居環境中移動的優勢就立馬被消滅
-
對於每次拿起ipad 想要開始“辦公”時,就要先去到辦公桌上對著 mac mini 登入,連線,那所謂的“移動性”帶來的方便,也同樣是如雞肋一般。
-
因此本文主要就是在“隨航”的方案基礎上,透過一些最佳化策略,實現真正的“居家移動辦公”場景。
實現過程
整個實現過程包括幾個步驟:
- 透過 apple script 指令碼,實現自動的開啟&關閉隨航
- 透過 shell 指令碼監控當前的顯示器狀態,實現斷開自動重連
- 透過 web 服務,實現在 ipad 端主動連線/斷開
- 透過開機免密登入+crontab,實現開機後自動啟動 web 服務
透過上述操作,可以真正除了 mac 開機需要手動在 mac 裝置上操作,其他所有操作都可以脫離 mac 裝置,在 ipad 上完成。如果 mac 機器常年不關機,且設定了斷電後自啟動的,那在家裡幾乎任何時候,都可以把 ipad 等同於 macbook。
step1. 自動開啟&關閉隨航
這部份的內容,就是參考網上的指令碼,當然由於 mac os 版本的原因,這個指令碼不一定都能使用。我的mac os 是13.6 到 14.4, 這兩個系統的指令碼略有差異,具體可以見末尾的 github 連結。
具體要做的事情,就是:
- 使用
mac
自帶的指令碼編輯器,編寫指令碼,並進行除錯,確保能在自己的系統上自動開啟&關閉隨航
指令碼編輯器:
自動開啟/關閉隨航指令碼:
這裡有幾點需要說明:
- “隨航” 和 “通用控制” 的區別:
- 通用控制是使用同一鍵盤和滑鼠操控 Mac 和 iPad,簡單的說,就是多臺裝置共享滑鼠&鍵盤,但 mac 還是mac,ipad 還是 ipad,可以理解成用一套藍芽鍵鼠,同時連著 mac 和 ipad(或者多臺mac)
- 隨航是將 ipad 當作一塊螢幕,可以作擴充套件屏,或者做螢幕映象。所以我採用的方式,就是把 ipad 做 mac 電腦的螢幕映象,然後搭配一個連線到 mac 的藍芽鍵鼠(或者蘋果原裝的妙控鍵盤),實現“螢幕是Mac的螢幕,鍵鼠也是Mac的鍵鼠”,四捨五入,這個ipad就是個mac了。
- “隨航”的各種玩法嘗試:
- 最開始我試著想把 通用控制 + 隨航 同時開啟,這樣不就即共享滑鼠鍵盤,又共享螢幕了麼(I have an apple, I have a pen 。。。)。而且早期操作中,的確成功過(貌似觸發了什麼bug,就是在不同的切換通用控制&隨航功能,有機率兩個都生效),只是成功率極低。後來升級系統不怎麼遇到了。
- 如果使用的是藍芽鍵鼠,那麼藍芽需要連到 mac 上面,這樣才能控制 mac,從而實現一個
padbook
。這種方式比較好理解,成本也低一些,整個藍芽鍵鼠平替就可以了(另外為了移動效能好,最好買類似妙控鍵盤那種,自帶支撐的,如果是螢幕背後需要一個腿來支撐的話,會大大限制移動使用的場景,例如就不能直接把padbook
放在腿上辦公了) - 如果使用的是原生的妙控鍵盤,你會發現,“隨航” 其實不僅僅是一塊擴充套件螢幕那麼簡單。蘋果的隨航,隨航在把螢幕映象的同時,鍵盤依舊是可以使用的(也就是鍵盤同時可以控制mac和ipad,是共用的),而且 apple pencil 也是如此,是 ipad 和 mac 共用,只不過如果是在 mac 上面,pencil 不能畫畫,寫字,只能像滑鼠一樣進行點選,拖動。遺憾的是,觸控板不能做到共用,觸控板始終只能控制 ipad。所以如果是
隨航+妙控鍵盤
,那麼還需要額外加一個藍芽滑鼠,連線到 mac 上面
- 妙控方案 & 藍芽方案的體驗對比:
- 對比
隨航+妙控鍵盤+藍芽滑鼠
與隨航+藍芽鍵鼠
,妙控方案的好處是體驗好,延遲低,在實際使用過程中,幾乎感受跟一臺 macbook 沒有差異,妙控鍵盤的打字型驗也非常舒服,唯一的確定是需要額外加一個滑鼠,對場景有一丟丟限制,但不多。 - 藍芽方案的優點就是形態上完全等同於一臺筆記本,操作上也是如此,不過在延遲上,以及鍵盤的使用體驗上會差一些,觸控板移動滑鼠可能明顯感受到延遲,而且鍵盤的打字型驗也沒有妙控鍵盤好(當然這可能跟我買的是三四百的平價藍芽鍵鼠有關,可能買個貴一些的藍芽鍵鼠,效果會更好)
- 對比
- 螢幕映象的配置:
- sidecar 指令碼相關
- sidecar 指令碼儲存到應用程式的目錄
- 在“系統設定--隱私與安全性“中,為 sidecar 指令碼增加許可權(這裡要注意,每次修改指令碼之後,要在這裡刪除舊的指令碼,重新新增,否則不生效)
- 由於後續是透過python指令碼觸發shell指令碼的,所以需要把python和shell,也在“隱私與安全性”中新增許可權,新增的方式,可以在命令列終端中,先透過
which python
,which sh
找到檔案路徑,然後用ln -s python的系統路徑 任意自己能訪問的路徑
建立一個軟連結,這樣可以在訪達中,直接將軟連結拖動到系統設定的視窗,就可以了。
到這裡,就可以透過手動觸發sidecar指令碼,觸發mac的隨航功能了,大部份網上關於隨航用法的介紹,也是到這裡為止,這部份操作如果遇到問題,可以網上找找資料,應該都可以解決。下面就是自己動手的部分了。
下文中涉及到指令碼,請參考文末的github連結
step2. shell指令碼自動重連
要想做到真正可用,關鍵有兩步:
- 讓
shell
指令碼能夠觸發sidecar
應用程式,代替我們手動觸發的動作- 網上的有些介紹,會讓你將電腦設定成免密登入,然後把
sidecar
指令碼設定成開機自啟動,這種方法只是“玩具”性質的,因為它只解決了開機的觸發的問題,但使用過程中,還是每次斷開就需要重連,本質上觸發指令碼還是需要手動在mac上做,問題沒有得到解決 - 所以我透過命令
osascript /Applications/sidecar.app
觸發sidecar
,這樣實現了從shell
啟動隨航的功能。依賴shell
的程式設計能力,就有很大的擴充套件性了。
- 網上的有些介紹,會讓你將電腦設定成免密登入,然後把
- 透過
shell
監控當前是否開啟“隨航”- 要想能夠“智慧”的自動重連,就離不開對系統狀態的監控,所以需要判斷當前是否已經啟動隨航,這裡我是透過判斷顯示器中是否有
Sidecar Display
來判斷的,當啟動隨航之後,mac 系統有兩個顯示器裝置,其中ipad
這個顯示器就是Sidecar Display
,因此可以透過檢視顯示器,判斷是否啟動隨航。 - 命令如下:
/usr/sbin/system_profiler SPDisplaysDataType | grep "Sidecar Display" | wc -l
- 要想能夠“智慧”的自動重連,就離不開對系統狀態的監控,所以需要判斷當前是否已經啟動隨航,這裡我是透過判斷顯示器中是否有
解決上述兩個問題之後,剩下的就是簡單的shell
指令碼邏輯了,判斷隨航是否開啟,沒有開啟就觸發指令碼開啟隨航,有開啟就跳過。這樣指令碼就可以一直跑著,就能隨時斷開隨時重連。
step3. 透過web
服務,實現ipad
端主動觸發
雖然透過shell
指令碼能夠實現指令碼的自動斷連,但始終還是要從mac
端發起,ipad
只能被動等待mac
連線,這樣從ipad端使用起來自由度就大打折扣,例如不需要使用mac,想讓ipad做回平板,如果還是保持自動重連,就始終會連上電腦。反過來,如果從ipad想切回mac,如果不能從ipad端觸發,就還是要去操作mac,就顯得不方便了。
所以我在mac上用pywebio簡單做了一個web服務,支援“連線ipad”和“斷開ipad”功能,這樣就可以隨時在ipad上,透過瀏覽器訪問工具網頁,然後觸發連線,或者斷開連線。這樣即使遇到一些其他的異常情況,基本也可以在ipad端操作,不再需要直接操作mac.
透過將這個web服務加到 crontab 中(同時開啟免密登入),則可以實現電腦啟動之後,自動啟動服務,開啟mac之後,等待服務啟動,就可以在ipad上去控制電腦是否開啟隨航,使用起來更加絲滑,而且,透過web服務觸發,即使在mac電腦鎖屏狀態下,只要聯網且服務是啟動的,就依舊可以觸發隨航。實際使用起來,感覺更像是在 ipad 上開啟一個電腦模式,而不是在 mac 上開啟隨航。
最終效果
- 在 ipad 上就可以觸發連線或者斷開連線,不需要事先連線到 mac mini
- ipad 斷開後,可以自動重連
- mac mini 只需要確保電腦開啟,即使電腦在鎖屏登入介面,也可以自動連線
連結
- github-macmini2ipad