版本、更新、授權與隱私
版本號從哪裡來、正式版怎麼簽章與發布、App 怎麼通知更新,以及授權條款和資料處理的重點。
內容來源:macOS repo docs/UPDATES.md、PRIVACY.md、LICENSE(v1.4.5 標籤)。網站展示經審閱的固定版本,最新內容以 repo 為準。
版本號
Resources/Info.plist是版本(CFBundleShortVersionString)與 build(CFBundleVersion)的唯一來源。選單顯示、本機建置與正式更新包都讀同一組數字。- 正式發布時,版本與 build 要同時提高,build 要大於已公開更新清單裡的 build。
- 每次發布同步更新
CHANGELOG.md(完整紀錄)與RELEASE_NOTES.md(這一版給使用者看的說明)。 - 曾經只在本機使用、沒有公開的候選版,會在 CHANGELOG 標成「本機候選,未正式發佈」,公開版用更高的版本號區分。
正式發布的流程
- 維護者在 PR 裡提高版本與 build,更新 CHANGELOG 與 RELEASE_NOTES,CI 通過後合併到
main。 main收到版本變更後,GitHub Actions 自動執行「Release macOS」:重跑測試、用固定的程式碼簽章憑證簽署、驗證簽章身分與 Bundle ID。- 產生首次安裝用的 ZIP、只含 App 的更新 ZIP、SHA-256 清單與 Sparkle 更新清單(appcast),並用 Ed25519 私鑰簽署更新清單與更新包。
- 驗證全部通過後才建立版本 tag 與草稿 Release,資產上傳完成才標成正式 latest。
- 發布後再從 GitHub 下載一次所有資產,重新核對 SHA-256、程式碼簽章與 Ed25519 簽章。
已公開的版本不會被覆蓋。發現問題時,用更高的版本號發一個修正版。
為什麼不用 Apple 公證
這個專案採用免費方案:沿用一份固定的程式碼簽章憑證維持 App 身分,再用 Sparkle 的 Ed25519 金鑰驗證更新來源。不需要付費的 Apple Developer Program、Developer ID 或公證。
代價是使用者第一次開啟時,macOS 可能顯示安全提示,需要用右鍵「打開」或在「隱私權與安全性」選「仍要打開」。安裝工具與文件都不會教使用者清除隔離屬性、關閉 Gatekeeper 或安裝憑證到系統信任區。
PR 與 fork 的 CI 工作拿不到任何發布憑證,開發用安裝包只用 ad-hoc 簽章,也不會進入公開更新清單。
App 怎麼通知更新
- 安裝含更新器的版本(1.3.0 以後)之後,App 每天在背景檢查 GitHub 上的更新清單一次。
- 有新版時只發通知,由使用者選擇安裝、稍後提醒或略過;不會在背景自動下載安裝(
SUAllowsAutomaticUpdates=false)。 - 錄音、辨識或等待重試時,提示與重新啟動都會延後。
- 選單有「檢查更新…」與可關閉的「自動偵測新版本」。
- 更新只替換 App 本體,保留鑰匙圈裡的 API Key、快捷鍵、偏好設定與使用者資料夾的
cat.config.json。
更新清單網址:
https://github.com/yuipan0611/whats-up-my-neighbor-ai-input-macos/releases/latest/download/appcast.xml
1.4.3(含)以前安裝的 App 讀的是舊 repo 網址,GitHub 會轉址到新 repo,所以舊 repo 名稱保留不再使用。
授權
macOS 與 Windows 版原始碼都以 MIT License 授權。Sparkle 依其自身授權隨 App 一起發布(Sparkle-LICENSE.txt)。
隱私重點
完整內容以 PRIVACY.md 為準,這裡整理開發時最常需要對照的部分。
| 資料 | 去向 | 保存 |
|---|---|---|
| 錄音 | 只傳給 Groq Speech-to-Text API | 暫存目錄;寫入剪貼簿後立刻刪除,失敗時最多保留兩分鐘 |
| Groq API Key | 不傳給 Groq 以外的地方 | macOS 鑰匙圈(App 專用項目) |
| 轉錄文字 | 系統剪貼簿與目前輸入框 | 啟用時進入本機剪貼簿歷史(10 筆) |
| 輸入目標 | 不傳出 | 錄音期間在記憶體記下 App、視窗與焦點元素身分,不讀文字、不截圖 |
| 啟用的詞典詞條 | 依提示額度送給 Groq | UserDefaults |
| 更新檢查 | GitHub(一般網路請求資訊) | 不傳送金鑰、錄音、文字或設定;Sparkle 系統統計關閉 |
| 桌面小黑貓 | 不傳出 | 只在記憶體讀桌面資料夾位置 |
App 沒有帳號系統、分析工具、廣告 SDK 或開發者後端。新增任何資料流向時,PR 要同步更新 PRIVACY.md。
目前已知的文件差異
PRIVACY.md 的「刪除」段落寫到執行 移除.command 會一併刪除本機剪貼簿歷史,但 1.4.5 的移除工具實際上沒有刪除 ~/Library/Application Support/AI語音輸入/ 與貓咪設定資料夾(選單「開啟貓咪設定資料夾…」打開的那個)。在修正前,使用教學 會告訴使用者這兩個資料夾需要手動刪除。
內容和 App 畫面對不上,或步驟走不下去?可以到 GitHub Issues 告訴我們是哪一篇、哪一步。