NailNote 本地美甲筆記 App 複盤
想要把做過的美甲照片存在手機裡留底,卻發現市面上的美甲記錄軟體幾乎都強迫註冊,還要把私人照片上傳到別人的伺服器,讓人很不安心。 我在這件事中負責一人 AI 協作開發,完成從零到實際上架 App Store 的完整流程。
成果速覽
- 已送出審查,目前等待審核中:從空專案開始撰寫到完成送審,前後僅花費約三天。
- 隱私申報極簡化:透過完全本機儲存、不收集任何使用者資料的架構,在申請上架填寫問卷時,直接宣告不收集資料,大幅縮短審查等待期。
- 無痛離線使用:採用純手機內部資料庫與本機圖片管理,不需要任何雲端伺服器或網路連線,既省下維護成本,又做到百分之百的隱私安全。
為什麼想做這個小工具?
我想隨手記下美甲細節,但不希望生活照被上傳到陌生雲端。這就像寫日記,鎖在抽屜的實體筆記本最安全,沒必要寄存別人家。
這個專案叫作 NailNote,是一個記錄美甲照片的本機筆記 App。它是我之前開發、具社群功能的母體 App,也就是 [[Nailora 美甲情報 App 複盤]] 的極簡版。既然要極簡,我大膽砍掉所有雲端與社群功能,將複雜的資料結構化繁為簡。
這裡的資料流向圖,展示了它與一般聯網軟體的不同:
graph TD
A[使用者拍照] --> B[手機本機相簿]
B --> C{NailNote 儲存}
C -->|複製圖片| D[本機專屬資料夾]
C -->|寫入文字與路徑| E[本機輕量資料庫(SQLite)]
note技術細節:專案起因與結構簡化
- 母專案 [[Nailora 美甲情報 App 複盤]] 原本使用複雜的圖片網址、模糊預覽圖與縮圖結構。
- 本專案將其簡化為單一本機路徑,完全免除快取與網頁分發節點的複雜設計。
- 開發框架採用 React Native 0.81 與 Expo SDK 54,搭配 Expo Router 處理路由。
如何不靠網路,把資料與照片穩穩存在手機裡?
要完全不用網路,我必須在手機內部打造專屬的「檔案櫃」與「記帳本」。
首先是「記帳本」,我採用 SQLite,也就是本機輕量資料庫。這就像在手機裡建一個小巧的 Excel 表格,不連網也能快速讀寫。為了解決畫面卡頓,我開啟了 WAL 模式,也就是預寫日誌模式。這就像服務生先用便條紙記點單,等空閒再抄進主帳本,能讓寫入速度極快、畫面不卡頓。
接著是「檔案櫃」,當選好美甲照片後,系統會複製到手機專屬的檔案目錄。即使你刪除手機相簿的原圖,軟體內的記錄依然完好如初。
note技術細節:資料與媒體儲存實作
- 資料庫:使用 expo-sqlite,並啟用 WAL 模式(Write-Ahead Logging)以提升同步寫入效能。
- 媒體:透過 expo-image-picker 選取圖片,並以 expo-file-system 複製至 documentDirectory 本機目錄。
- UI 效果:採用 expo-glass-effect 與 linear-gradient 打造毛玻璃與漸層,並用 reanimated 支援雙指縮放變更欄數。
解決開發時的資料打結與垃圾遺留問題
開發時最容易遇到「資料庫改版打結」與「垃圾檔案堆積」的問題。
首先是資料表升級。軟體改版時,資料庫欄位常需調整。這就像辦公室重新裝潢,傳統做法是按門牌版本號決定如何動工,但開發時常因程式自動重載,導致版本號記錄未完成而卡死。我的解決辦法是不看版本號,直接開門檢查。軟體啟動時會掃描資料庫,確認特定欄位是否存在,不存在就現場補上。
其次是垃圾檔案。當使用者刪除筆記,資料庫文字消失了,但複製進檔案櫃的照片仍留在手機深處。為避免佔用空間,我設計了開機清掃機制,啟動時會自動掃描並刪除無用照片。
note技術細節:防呆升級機制與孤兒檔清理
- 利用 PRAGMA table_info() 檢查欄位是否存在,跳過僅依賴 user_version 的不穩定機制,避免 Fast Refresh 造成的遷移卡死。
- 清理機制:App 啟動時非同步掃描 documentDirectory 下的照片檔案,比對資料庫欄位,主動刪除無引用的孤兒圖檔。
- 相簿與排序:將獨立相簿與筆記顯示模式合併,並保留既有資料表架構以維持向下相容。
三天完成上架申報的通關秘訣
將產品送上 App Store 就像過海關。若收集個資或使用複雜加密技術,就必須排在漫長隊伍中接受反覆盤問。
由於我的軟體完全不靠網路,所有資料都留在使用者手機裡。面對蘋果官方嚴格的隱私問卷時,我可以理直氣壯地宣告不收集任何資料,也不需進行任何加密申報。
這種零後端設計讓我直接走綠色通道。從動工到送審,只花了三天時間。
note技術細節:上架與合規申報
- 隱私問卷勾選「Data Not Collected」,完全無隱私權政策與個資外洩風險。
- 在設定檔中宣告 ITSAppUsesNonExemptEncryption 為 false,省去繁瑣的美國出口加密商品申報。
- 通關流程:本地開發測試 -> 專案設定與圖示製作 -> EAS 生產環境打包 -> 送出審查。
這次實作學到的事
雖然工具功能陽春,但它讓我明白,敢砍功能是縮短開發時程最強大的武器。從大專案拆分小工具時,最大的價值在於將複雜架構簡化到極致。
拿掉所有聯網需求後,開發變得極為純粹,更換來無懈可擊的隱私安全與零伺服器維護成本。這條離線優先的開發路線,值得未來驗證新想法時反覆實踐。
相關筆記:
- [[Nailora 美甲情報 App 複盤]] — 本專案的母體(雲端社群版)