Side Projects

WorkRoll 工作相簿

WorkRoll 工作相簿

讓工作照片與影片和私人圖庫分開的 iPhone App。先選 App 內相簿再拍照錄影,工地、案場、收據、白板直接歸位;支援相簿密碼、Face ID App 鎖、照片說明、分享延伸功能、整本分享與匯出到「檔案」。不需帳號、不上傳伺服器、不同步 iCloud 照片。SwiftUI + SwiftData 原生開發,Pro 一次買斷。

要解決的問題

工地、案場、收據與白板照一拍就進系統「照片」,和家人、旅遊照片混在一起,也跟著同步到 iCloud。案子結束後要一張張找出來刪,要把整案照片傳給同事或客戶也很麻煩。WorkRoll 讓工作照片與影片從拍攝那一刻起就放在 App 內的獨立相簿,和私人圖庫分開。

畫面截圖

  • WorkRoll 首頁的 App 內相簿頁,列出「現場紀錄」與受密碼保護的「客戶資料」相簿
  • WorkRoll 相機畫面,下方目的地列可選擇照片要存到哪本相簿
  • WorkRoll「現場紀錄」相簿,格狀顯示收據、白板與工地照片,下方可搜尋說明
  • WorkRoll 相簿密碼管理畫面,可更改、新增或移除密碼

主要功能

  • 拍攝前先選目的地

    全螢幕相機下方有目的地列,可選系統照片、某個系統相簿或 App 內相簿,照片與影片直接存到該處。相機支援照片/影片切換、點按對焦曝光、雙指縮放與錄影計時。

  • App 內相簿與系統相簿分區

    首頁分成 App 內相簿與系統相簿兩頁;App 內媒體不同步到「iCloud 照片」,也能把既有照片與影片匯入,或存回系統圖庫。

  • 相簿密碼與 Face ID App 鎖

    每本相簿可設密碼,App 可用 Face ID 上鎖,切到背景時畫面會被遮住。密碼是 App 內的存取控制,忘記無法救回,設定時會明確提醒。

  • 到期自動清除

    每本相簿可設定保留天數,App 啟動或回到前景時清除到期項目,案子結束不必手動整理。

  • 照片說明與搜尋

    每張照片或影片可加多行說明,在檢視器下方顯示,並能在相簿內搜尋說明文字。

  • 分享與匯出

    可一鍵分享整本相簿,也能從其他 App 的分享選單把照片送進指定相簿;「匯出到檔案」會把整本相簿存成資料夾,可選雲端硬碟或 NAS 位置。

技術架構

WorkRoll 是 iPhone 專用的原生 App,以 SwiftUI 搭配 @Observable 撰寫,相簿與項目資料存在 SwiftData,媒體檔則放在 App 沙盒並排除於裝置備份之外(可在設定中自行開啟納入 iCloud 備份)。相機以 AVFoundation 自行實作,系統相簿的讀取、匯入與存回透過 PhotoKit,Face ID 使用 LocalAuthentication。分享延伸功能與主 App 共用 App Group,Pro 一次買斷的購買狀態由 RevenueCat 處理,使用匿名識別碼,不需要帳號。專案以 XcodeGen 產生,介面支援繁體中文與英文。

技術挑戰與取捨

  • 系統「照片」無法排除 iCloud,相機也不能改存檔位置

    iOS 的「照片」圖庫只要開了 iCloud 照片就會整體同步,沒辦法把個別相簿排除;系統相機也不能指定照片存到哪裡。因此工作照片只能存在 App 自己的沙盒,並且要有自己的相機,在拍攝前就決定目的地。代價是刪除 App 會連同照片一起刪除,所以首次引導、設定與刪除相簿時都會提醒,並提供「匯出到檔案」與存回系統照片兩條保存途徑。

  • 分享延伸功能的匯入流程

    分享延伸功能的執行時間與記憶體有限,也不適合直接改動主 App 的資料庫。做法是延伸功能只把檔案以 URL 複製到 App Group 中的待匯入區,寫入目的相簿與固定項目 ID 等資訊後原子更名為就緒狀態;主 App 啟動或回到前景時再透過既有的媒體儲存流程匯入。固定 ID 避免重複匯入,相簿或密碼已變更、額度不足時則保留待匯入檔並回報,不會丟掉使用者分享進來的內容。

  • 分享進來的照片無法安全刪除原檔

    曾考慮在分享介面提供「加入後刪除原始項目」。但 NSItemProvider 提供的檔案只是暫存拷貝,公開 API 並不保證能拿到對應的 PHAsset 識別碼,用檔名比對也無法確定是哪一張原檔。因此分享介面不提供這個選項,避免放一個可能刪錯或沒有作用的開關;需要刪除原檔時,改用主 App 的系統照片匯入流程,那裡已知 asset ID,並由 iOS 跳出系統確認。

現況

iPhone App(iOS 17 以上),已在 App Store 推出 1.0 版,介面為繁體中文與英文。免費即可使用主要功能,Pro 為一次買斷。

使用技術

  • Swift
  • SwiftUI
  • SwiftData
  • AVFoundation
  • PhotoKit
  • RevenueCat
  • iOS

更多Side Projects