ipad + mac mini 自動隨航(最佳化方案)

coreylin發表於2024-04-05

ipad + mac mini 自動隨航(最佳化方案)

背景

在之前的文章中,介紹了搭建 vscode 伺服器,透過 ipad 進行訪問的方式,但實際操作下來,發現還是沒有辦法達到很好的效果。

問題包括:

  • 網頁連線 vscode 之後,在不同應用中切換經常會導致重連,也很容易超時重連,用來當玩具可以,但如果要用作實際工作,則發現效率很低。
  • 只能使用 vscode,其他相關聯的工具沒法使用,同樣會導致用 ipad 無法進行順暢的工作,達不到一臺“電腦”的效果

而自己實際上還是在家工作的場景多,更多的時候,只是不想長時間坐在書桌旁,而想“居家移動式”辦公,可以癱在沙發上辦公,或者冬天晚上在被窩裡。走到書桌旁辦公,總有種需要 “正襟危坐” 的感覺。而我只想隨手開啟筆記本就可以開始幹活。

所以我希望用 ipad+鍵盤,實現在家裡能控制mac mini,讓 ipad+鍵盤 變成一個遠端客戶端,這樣就可以避免 ipad os 上各種軟體,體驗不相容的問題。

對比

網上搜尋相關的指引,基本就是兩類,一類是透過 ipad 的隨航功能。另一類這是透過向日葵之類的遠端軟體。

  • 遠端軟體的方式是更成熟的連線,能夠真正用在“生產力”上面,但缺點是要💰,而且自己的電腦也不想裝遠端控制軟體

  • 網上提供的隨航的功能方法,還停留在“玩具”階段,看起來可行,但如果在要用在日常辦公上,就不那麼理想,原本的隨航方案,最主要的問題有兩個:

    1. 使用過程中連線斷開或者滑鼠卡死,這時需要跑到 mac mini 上面重新連線,這種打斷在真實工作的場景中,影響是非常大的,直接會讓自己無法繼續使用 ipad 工作,試想我的活幹到一半,然後連線斷掉了,還要跑到 mac 邊上操作。人都走到 mac 邊上了,就直接在 mac 上幹活了,可以在家居環境中移動的優勢就立馬被消滅

    2. 對於每次拿起ipad 想要開始“辦公”時,就要先去到辦公桌上對著 mac mini 登入,連線,那所謂的“移動性”帶來的方便,也同樣是如雞肋一般。

因此本文主要就是在“隨航”的方案基礎上,透過一些最佳化策略,實現真正的“居家移動辦公”場景。

實現過程

整個實現過程包括幾個步驟:

  1. 透過 apple script 指令碼,實現自動的開啟&關閉隨航
  2. 透過 shell 指令碼監控當前的顯示器狀態,實現斷開自動重連
  3. 透過 web 服務,實現在 ipad 端主動連線/斷開
  4. 透過開機免密登入+crontab,實現開機後自動啟動 web 服務

透過上述操作,可以真正除了 mac 開機需要手動在 mac 裝置上操作,其他所有操作都可以脫離 mac 裝置,在 ipad 上完成。如果 mac 機器常年不關機,且設定了斷電後自啟動的,那在家裡幾乎任何時候,都可以把 ipad 等同於 macbook。

step1. 自動開啟&關閉隨航

這部份的內容,就是參考網上的指令碼,當然由於 mac os 版本的原因,這個指令碼不一定都能使用。我的mac os 是13.6 到 14.4, 這兩個系統的指令碼略有差異,具體可以見末尾的 github 連結。

具體要做的事情,就是:

  1. 使用mac自帶的指令碼編輯器,編寫指令碼,並進行除錯,確保能在自己的系統上自動開啟&關閉隨航

指令碼編輯器:
指令碼編輯器

自動開啟/關閉隨航指令碼:
自動開啟/關閉隨航指令碼

這裡有幾點需要說明:

  1. “隨航” 和 “通用控制” 的區別:
    • 通用控制是使用同一鍵盤和滑鼠操控 Mac 和 iPad,簡單的說,就是多臺裝置共享滑鼠&鍵盤,但 mac 還是mac,ipad 還是 ipad,可以理解成用一套藍芽鍵鼠,同時連著 mac 和 ipad(或者多臺mac)
    • 隨航是將 ipad 當作一塊螢幕,可以作擴充套件屏,或者做螢幕映象。所以我採用的方式,就是把 ipad 做 mac 電腦的螢幕映象,然後搭配一個連線到 mac 的藍芽鍵鼠(或者蘋果原裝的妙控鍵盤),實現“螢幕是Mac的螢幕,鍵鼠也是Mac的鍵鼠”,四捨五入,這個ipad就是個mac了。
  2. “隨航”的各種玩法嘗試:
    • 最開始我試著想把 通用控制 + 隨航 同時開啟,這樣不就即共享滑鼠鍵盤,又共享螢幕了麼(I have an apple, I have a pen 。。。)。而且早期操作中,的確成功過(貌似觸發了什麼bug,就是在不同的切換通用控制&隨航功能,有機率兩個都生效),只是成功率極低。後來升級系統不怎麼遇到了。
    • 如果使用的是藍芽鍵鼠,那麼藍芽需要連到 mac 上面,這樣才能控制 mac,從而實現一個 padbook。這種方式比較好理解,成本也低一些,整個藍芽鍵鼠平替就可以了(另外為了移動效能好,最好買類似妙控鍵盤那種,自帶支撐的,如果是螢幕背後需要一個腿來支撐的話,會大大限制移動使用的場景,例如就不能直接把 padbook 放在腿上辦公了)
    • 如果使用的是原生的妙控鍵盤,你會發現,“隨航” 其實不僅僅是一塊擴充套件螢幕那麼簡單。蘋果的隨航,隨航在把螢幕映象的同時,鍵盤依舊是可以使用的(也就是鍵盤同時可以控制mac和ipad,是共用的),而且 apple pencil 也是如此,是 ipad 和 mac 共用,只不過如果是在 mac 上面,pencil 不能畫畫,寫字,只能像滑鼠一樣進行點選,拖動。遺憾的是,觸控板不能做到共用,觸控板始終只能控制 ipad。所以如果是 隨航+妙控鍵盤,那麼還需要額外加一個藍芽滑鼠,連線到 mac 上面
  3. 妙控方案 & 藍芽方案的體驗對比:
    • 對比 隨航+妙控鍵盤+藍芽滑鼠隨航+藍芽鍵鼠,妙控方案的好處是體驗好,延遲低,在實際使用過程中,幾乎感受跟一臺 macbook 沒有差異,妙控鍵盤的打字型驗也非常舒服,唯一的確定是需要額外加一個滑鼠,對場景有一丟丟限制,但不多。
    • 藍芽方案的優點就是形態上完全等同於一臺筆記本,操作上也是如此,不過在延遲上,以及鍵盤的使用體驗上會差一些,觸控板移動滑鼠可能明顯感受到延遲,而且鍵盤的打字型驗也沒有妙控鍵盤好(當然這可能跟我買的是三四百的平價藍芽鍵鼠有關,可能買個貴一些的藍芽鍵鼠,效果會更好)
  4. 螢幕映象的配置:
  5. sidecar 指令碼相關
    • sidecar 指令碼儲存到應用程式的目錄
    • 在“系統設定--隱私與安全性“中,為 sidecar 指令碼增加許可權(這裡要注意,每次修改指令碼之後,要在這裡刪除舊的指令碼,重新新增,否則不生效)
    • 由於後續是透過python指令碼觸發shell指令碼的,所以需要把python和shell,也在“隱私與安全性”中新增許可權,新增的方式,可以在命令列終端中,先透過 which python, which sh 找到檔案路徑,然後用 ln -s python的系統路徑 任意自己能訪問的路徑 建立一個軟連結,這樣可以在訪達中,直接將軟連結拖動到系統設定的視窗,就可以了。

到這裡,就可以透過手動觸發sidecar指令碼,觸發mac的隨航功能了,大部份網上關於隨航用法的介紹,也是到這裡為止,這部份操作如果遇到問題,可以網上找找資料,應該都可以解決。下面就是自己動手的部分了。

下文中涉及到指令碼,請參考文末的github連結

step2. shell指令碼自動重連

要想做到真正可用,關鍵有兩步:

  1. shell 指令碼能夠觸發 sidecar 應用程式,代替我們手動觸發的動作
    • 網上的有些介紹,會讓你將電腦設定成免密登入,然後把 sidecar 指令碼設定成開機自啟動,這種方法只是“玩具”性質的,因為它只解決了開機的觸發的問題,但使用過程中,還是每次斷開就需要重連,本質上觸發指令碼還是需要手動在mac上做,問題沒有得到解決
    • 所以我透過命令 osascript /Applications/sidecar.app 觸發 sidecar,這樣實現了從 shell 啟動隨航的功能。依賴 shell 的程式設計能力,就有很大的擴充套件性了。
  2. 透過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服務頁面

透過將這個web服務加到 crontab 中(同時開啟免密登入),則可以實現電腦啟動之後,自動啟動服務,開啟mac之後,等待服務啟動,就可以在ipad上去控制電腦是否開啟隨航,使用起來更加絲滑,而且,透過web服務觸發,即使在mac電腦鎖屏狀態下,只要聯網且服務是啟動的,就依舊可以觸發隨航。實際使用起來,感覺更像是在 ipad 上開啟一個電腦模式,而不是在 mac 上開啟隨航。

最終效果

  • 在 ipad 上就可以觸發連線或者斷開連線,不需要事先連線到 mac mini
  • ipad 斷開後,可以自動重連
  • mac mini 只需要確保電腦開啟,即使電腦在鎖屏登入介面,也可以自動連線

連結

  • github-macmini2ipad

相關文章