Side Projects
WorkRoll 工作相簿

讓工作照片與影片和私人圖庫分開的 iPhone App。先選 App 內相簿再拍照錄影,工地、案場、收據、白板直接歸位;支援相簿密碼、Face ID App 鎖、照片說明、分享延伸功能、整本分享與匯出到「檔案」。不需帳號、不上傳伺服器、不同步 iCloud 照片。SwiftUI + SwiftData 原生開發,Pro 一次買斷。
要解決的問題
工地、案場、收據與白板照一拍就進系統「照片」,和家人、旅遊照片混在一起,也跟著同步到 iCloud。案子結束後要一張張找出來刪,要把整案照片傳給同事或客戶也很麻煩。WorkRoll 讓工作照片與影片從拍攝那一刻起就放在 App 內的獨立相簿,和私人圖庫分開。
畫面截圖
主要功能
拍攝前先選目的地
全螢幕相機下方有目的地列,可選系統照片、某個系統相簿或 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



