標籤: iOS

如何為單一 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 會自動幫忙產生必要的檔案,以及做好基本設定。

繼續閱讀 ➜

如何使用 PHPickerViewController 取得 PHAsset

PHPickerViewController 是系統內建的一個照片選取工具,透過 PHPickerConfiguration 設定它,然後從它的 delegate function func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) 取得用戶選取的結果。看起來非常簡單直覺,直到我踩了坑...

繼續閱讀 ➜

UIScrollView and AutoLayout

以前的作法

在以前要用 Auto Layout 來設置 UIScrollView 的 sub views 並不是一件讓人愉快的事情,雖然不複雜,但步驟就是有點麻煩。因為 scroll view 自身的特性,所以必須設定它本身的位置與尺寸,然後設定 sub views 的位置與尺寸,最後算出 contentSize 的尺寸。總結來說大概分成以下幾步:

  1. 設定 UIScrollView 本身的位置與尺寸
  2. 建立一個 contentView 並加到 UIScrollView 的 sub view
  3. 設定 contentView 的位置,通常是四邊都貼齊 UIScrollView
  4. 可以滾動的 sub views 都加到 contentView,然後用 auto layout 設定這些 sub views 的位置與尺寸
  5. 如果設定無誤的話,contentView 就可算出正確的尺寸,這就是 UIScrollViewcontentSize

最讓人困惑且忽略的就是第三點,因為它很不自然,但在 UIScrollView 卻又是必須的。另外就是第四點,一定要有明確的位置跟尺寸,這樣才有辦法算出 contentSizeUIScrollView 使用。

現在的作法

從 iOS 11 開始,UIScrollView 多了 frameLayoutGuidecontentLayoutGuide 這兩個方便的屬性,讓我們不必再用不自然的方式去設定 content 的 auto layout。

  1. 可以使用舊有的方式或是使用 frameLayoutGuide 設定 UIScrollView 本身的位置與尺寸
  2. 不需要額外的 contentView 了,直接把內容加到 sub view
  3. 這些 sub views 與 contentLayoutGuide 建立 auto layout constraints

整個設定流程變得自然許多,也更不容易出錯。現在我們只要確定 sub views 有設好明確的位置與尺寸,讓系統能夠算出 contentSize 即可。

簡介 iOS Native 與 Web 的互動方式

有的時候一些跨平台共用的頁面會使用網頁的方式打造,在 iOS 的世界裡我們可以使用 WKWebView 呈現網頁內容,除了單純的呈現之外,彼此的互動也是不可或缺的一環。這篇文章將會簡單介紹該如何達成網頁與 iOS 原生程式碼之間的雙向溝通。

繼續閱讀 ➜