在開發行動應用程式時,我們常常會陷入「功能越多越好、架構越穩越好」的迷思中。然而,有時候「敢於做減法」才是產品能快速落地的關鍵。

本文將與大家分享如何從旗艦級的雲端社群專案 Nailora 中,拆分並打造出一款純本地、免登入的 iOS App —— NailNote 本地美甲筆記。這款 App 的核心定位是個人專用的美甲筆記與照片相簿,所有資料皆儲存於手機本機(SQLite + 本地檔案),做到零後端、零社群。

在這次的獨立開發實踐中,筆者負責了從「離線優先(Offline-First)」的設計取捨、資料層架構,到 App Store 送審的完整流程。以下是本次專案的複盤與經驗分享。


成果速覽

在這次的開發過程中,我們最顯著的成效在於用「砍對範圍」換取開發速度

  • 極速開發:從建立專案骨架到正式送交 App Store 審查,僅僅花了約三天的時間。
  • 完全離線與隱私安全:採用 expo-sqlite(WAL mode)搭配照片本機化儲存,實現了零後端、零隱私風險、100% 可離線運作。
  • 簡化上架流程:由於不收集任何用戶資料,隱私問卷可直接勾選「Data Not Collected」,且無須進行複雜的加密傳輸申報,大幅縮短了合規審查的準備時間。

技術棧

本專案本著「無後端、無外接服務」的原則,技術選型極其精簡:

層級技術
框架React Native 0.81 + Expo SDK 54 + Expo Router
語言TypeScript strict
資料expo-sqlite(SQLite,WAL mode,同步 API)
媒體expo-image-picker + expo-file-system(複製到本機 documentDirectory
UIexpo-glass-effect、linear-gradient、reanimated(用 pinch 手勢縮放欄數)
外部依賴無 Supabase、無 Auth、無後端、無 Sentry

關鍵設計決策與經驗

在將一個龐大的雲端專案重構成純本地 App 時,我們做了幾項關鍵的架構與技術調整:

1. 資料模型「坍縮」

在母專案中,圖片資料為了因應 CDN 優化,採用了極其複雜的結構,包含多尺寸 URL、blurhash 以及縮圖機制。然而,本地版完全不需要 CDN,因此我們大膽將資料結構簡化為單一的本機 uri。這種「資料模型坍縮」成功砍掉了不必要的複雜度。

2. Migration 要能自癒

在開發 React Native 時,Fast Refresh 經常會導致資料庫的單例(Singleton)被保留,進而讓 Migration(資料庫遷移)無法正常重跑,甚至卡在半遷移狀態。 為了防止這個坑,我們不再單純依賴 user_version,而是改用 PRAGMA table_info() 來主動判斷資料表欄位是否存在。這樣一來,即使開發時遇到卡頓,重開 App 也能自動修復。

3. 功能合併與 Schema 保留

在重構過程中,我們決定將獨立的相簿功能合併進筆記的顯示模式中。不過,我們依然在資料庫中保留了原先的 Schema。這樣做既無害、零風險,也能確保未來的向下相容性。

4. 孤兒檔清理機制

當照片完全儲存在手機本機時,隨著時間推移,可能會累積許多無用的垃圾檔案。為此,我們設計了「孤兒檔清理機制」:App 每次啟動時,會自動掃描照片目錄,並刪除那些沒有被任何資料庫欄位引用的圖片檔案,避免佔用用戶寶貴的手機空間。


App Store 上架經驗

將 App 送上 App Store 往往是獨立開發者最頭痛的一關,但「純本地」的特性在這裡成了巨大的優勢:

  1. 極簡隱私問卷:因為資料完全存在本機、不收集任何資料,隱私問卷可以直接勾選「Data Not Collected」,省去繁瑣的隱私條款宣告。
  2. 免除加密申報:在設定中配置 ITSAppUsesNonExemptEncryption: false(無加密傳輸),直接省掉了繁雜的出口加密申報流程。
  3. 上架工作流
    • 快速完成 CRUD 與照片本地化功能。
    • 完成相簿合併與排序優化。
    • 設計並套用正式的 Icon、Splash 啟動畫面,備妥隱私政策頁面。
    • 確保 TypeScript 檢查(tsc)全綠通過。
    • 使用 EAS 進行 Production build 並順利 submit。

目前進度:已完成編譯並送出 App Store 審查(Waiting for Review),目前正靜待 Apple 審核通過後手動發佈上架。


可遷移的通用知識

從這次的 NailNote 實踐中,筆者整理出兩點非常值得複用的開發觀念:

  • 「離線優先」是小團隊的利器: 如果你的產品核心功能不需要網路協作,那麼「離線優先」是降低首版複雜度與隱私合規負擔的極佳路線。沒有後端,意味著你不需要處理金鑰管理、資料列級安全性原則(RLS)以及任何潛在的資料外洩風險。

  • 精準砍功能的能力: 從大型雲端專案拆分、重構出輕量工具時,最大的價值不在於你保留了什麼,而在於你「敢砍什麼」——將母專案複雜的架構,果斷精簡成本地夠用的最小可行性產品(MVP)。


小結

NailNote 的誕生證明了:有時候「少即是多」。透過將複雜的雲端架構大膽簡化,專注於本地端的流暢體驗與隱私保護,我們不僅在三天內完成了開發到送審,更為用戶提供了一個極速、安全且無負擔的美甲紀錄工具。

如果你也正準備將手邊的大型專案重構成輕量工具,不妨也試試「離線優先」與「資料模型坍縮」的思路,或許會帶來意想不到的開發效率!

相關連結