macOS 第三方輸入法debug 方法

macOS 已經更新到 26 了, 但對於第三方輸入法的支持一直沒有任何變化,最新的 Xcode 26 破壞了之前我一直用的方法——直接把編譯路徑改到 /庫/輸入法 現在這麼做 xcode 會報錯,因為項目依賴的 framework 不會再寫到這個目錄了。

只有去掉所有更改編譯目錄的設置後編譯就可以成功。我猜測大概是因為新版的 SPM 不再遵循 Xcode 項目輸出目錄設置了……總之,已經用了好幾年的辦法不行了,得換新的。

新的 debug 方案

很多人說macOS 第三方輸入法是不能直接 attach 的,這樣會導致系統卡死。其實不會,自從上次蘋果更新了 macOS 第三方輸入法架構後就沒問題了。只是不要在 attach 的情況下切換到 Xcode 就行。所以恢復到傳統的編譯→複製app到 /庫/輸入法 →註銷系統→在系統終端裡查看 print 這種流程是萬萬無法接受的。

根據 Gemini 3 的建議,首先我一直用的辦法確實是不行了,回復到默認編譯路徑後,可以用 post script 殺掉當前進程並將編譯的 app 移動到輸入法目錄,這就解決了app位置問題。

值得注意的是,不能使用 Xcode 的 run script, 因為那是編譯的一部分,不論如何設置順序,Xcode 都會在鏈接和簽名之前執行,這樣你拷貝過去的 app 就是未完成的狀態, 就不能運行的。

解決辦法是編輯項目的 scheme, 添加腳本到 build 的 post-actions 裡:

使用 post-actions 來將編譯好的 app 移動到 /Library/Input Method 目錄
使用 post-actions 來將編譯好的 app 移動到 /Library/Input Method 目錄

注意要把 “Provide build settings from” 這個選成你的 target, 如果是默認的 none,則不會帶有項目的環境參數。這樣腳本就沒辦法找到 app 的路徑了:

# 輸入腳本或從工作區拖曳腳本檔案以插入其路徑.
# 配置
目的地="/庫/輸入法"
應用程式名稱="${FULL_PRODUCT_NAME}"
來源應用="${內建產品目錄}/${APP_NAME}"
目標應用="${目的地}/${APP_NAME}"
進程名稱="${EXECUTABLE_NAME}"

# 1. 殺死正在運行的進程以釋放檔案鎖
#    (如果進程未運行則忽略錯誤)
pkill -f "$PROCESS_NAME" || true

# 2. 確保目的地存在
如果 [ ! -ð "$目的地" ]; 然後
    mkdir -p "$目的地"
菲

# 3. 使用 rsync 代替 cp
#    -一個: 存檔模式 (保留符號連結, 權限, 次)
#    --刪除: 刪除目標中不在來源中的舊文件
rsync -a --刪除 "$SOURCE_APP/" "$DEST_APP/"

# 4. 批判的: 去掉 "檢疫" attributes
#    macOS 通常將複製的應用程式標記為 "損壞的" 要么 "不安全"
xattr-cr "$目的地應用程式"

# 5. 告訴系統應用程式已更新
觸摸 "$目的地應用程式"

接下來, 就是搞定 debug attach 的問題了。

使用 /Library/Input Method 目錄代替原本 app 路徑進行debug
使用 /Library/Input Method 目錄代替原本 app 路徑進行debug

同樣繼續修改 scheme,這次是 run 頁面,在可執行文件這裡,要選 other,然後手動定位到 /庫/輸入法 目錄下的 app 上,這樣在編譯後 xcode 就會自動從那裡啟動進程,代替系統啟動,所有 print 等debug 信息就還能正常顯示在終端。

我曾嘗試關閉 Xcode 自動執行,讓它等待我手動啟動。但這樣的結果就是系統啟動了輸入法,由於啟動身份不同,在 xcode 上 debug 出來的信息全都被 <私人的> 遮蓋了。

本文由 落格博客 原創撰寫:落格博客 » macOS 第三方輸入法debug 方法

轉載請保留出處和原文鏈接:https://www.logcg.com/archives/4196.html

關於作者

R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。