標籤: iOS

Swift Package 多語言支援

在開發 iOS 應用程式時,使用 Swift Package Manager (SPM) 來模組化程式碼已經成為主流做法。然而,當你在 Swift Package 中實作多國語言支援時,可能會遇到一個令人困惑的問題:Package 內的本地化在測試時運作正常,但整合到主專案後卻失效了。本文將深入探討這個問題的根源,以及如何透過 CFBundleLocalizationsCFBundleAllowMixedLocalizations 這兩個 Info.plist 設定來解決。

繼續閱讀 ➜

我偏好的 Coordinator Pattern

前言

當我實作畫面流程時,我會為一組「流程」建立一個 Coordinator。如果這組流程很複雜,它可以拆分成多個「子流程」,那每一個子流程也會有對應的 Sub-Coordinator。主流程的 Coordinator 可以管理子流程的 Sub-Coordinator。

Coordinator 用來管理流程的畫面,它負責建立畫面、傳遞資料給畫面、回應畫面的請求、移除畫面等等。如果用 tree 來理解畫面流程的話,Coordinator 就是 root,各個畫面就是 leaf。換個角度看,Coordinator 像一個容器 — 它自己不產出畫面內容,而是決定裡面放哪些畫面、什麼時候切換。

繼續閱讀 ➜

如何為單一 Feature 建立 Swift Package

在專案開發到一定規模後,你可能會發現某些 feature 其實相對獨立:它們有自己的流程、畫面、資源檔,甚至可以被其他專案重用。這時候,最乾淨、最有彈性的做法,就是把它抽成 Swift Package

以我最近在做的功能為例,它是一個完整的獨立模組 - 有多個頁面、支援多國語言、使用圖片與動畫資源。為了避免日後整合時出現命名衝突、相依過重或編譯過慢的問題,我選擇把它獨立成一個 Swift Package。在將 feature 抽出到 Package 的過程我也踩到了一些坑,趁著這個機會記錄下來,以免日後忘記。

為什麼要把 Feature 打包成 Swift Package?

建立專屬的 Swift Package 有幾個明顯的好處:

  • 可獨立開發與測試:模組化後不必依賴主專案,可單獨編譯與驗證。
  • ⚙️ 降低相依與衝突:減少命名重複、依賴鏈過長等問題。
  • 🚀 加快編譯速度:主專案不需每次都重新編譯整個功能。
  • 🔄 方便整合與重用:未來可以直接被其他 app 或團隊使用。
繼續閱讀 ➜

FormattedListKit: Elegant List Displays Made Easy

When developing iOS and macOS applications, formatting lists is a common requirement. Whether it's terms and conditions, setting options, or tutorial steps, we often need to present ordered or unordered list content. However, Apple's native frameworks have relatively limited support for list formatting, which often puts developers in a dilemma: existing solutions aren't perfect, while heavier solutions seem like overkill.

To solve this problem, I developed FormattedListKit, a lightweight yet fully-featured Swift Package specifically designed for creating beautifully formatted ordered and unordered lists.

繼續閱讀 ➜

如何建立 iOS Share Extension

在網路上已經有很多關於 iOS Share Extension 的教學,例如這裡就有一篇。有需要的人可以自行在網路上搜尋,這邊就不多作著墨。我這次想要分享的主要是在開發 share extension 的過程遇到一些要注意的事項,以及踩到的一些坑。

我的開發環境是 macOS Sonoma + Xcode 15,使用 Swift 開發。

要建立一個 share extension 很簡單,就是在你的專案新增一個 target 然後選擇 Share Extension 即可。Xcode 會自動幫忙產生必要的檔案,以及做好基本設定。

繼續閱讀 ➜

Repository Design Pattern

為何需要 Repository Design Pattern

在最近參與的專案當中,我們開始導入了 Repository Design Pattern,一句話總結它的用途就是「負責處理資料的新增、讀取、更新、刪除 (CRUD) 的角色」,建立這樣一個角色來負責處理資料能帶來什麼好處呢?

繼續閱讀 ➜