Missing required modules: ‘FirebaseMessaging’, ‘GoogleSignIn’

模組找不到大魔王又來找我了 :)

Photo by Breno Machado on Unsplash

繼上一篇文章建立 framework 專案 因為編譯器關係無法成功建置 SDK 後,以為已經解決問題而在開心撒花的me,最近在測試的 App 中 import 此 SDK 會直接找不到模組,晴天霹靂登愣愣⚡️

首先介紹一下背景,開發的 SDK 為純 Swift 動態庫,用 SPM 靜態引入三方套件,單例的 SdkManager 是公開的接口暴露處,此 class 引入了 Firebase, Firebase Messaging, GoogleSignIn, FacebookCore… 等套件

當 APP 專案 embed Sdk.framework 且設定為 Embed & Sign -> 需要的地方 import Sdk -> 立馬跳紅色警示 ,抑或是 compile 後出現紅色警示🙂

Missing required module ‘Firebase’

Module ‘FirebaseMessaging’ not found

無論 APP 專案是 ObjectiveC or Swift 都一樣

爬文了一大輪,改用 CocoaPods 引入、修改 Build setting、轉成 XcFramework、Package 通通失敗…

以下有兩個成功的方式,只是不適合我們專案的狀況,提供給大家:

  1. 在 import 前面加上 @_implementationOnly
    但這個前綴只能讀取不能覆寫,專案中需要繼承 FirebaseMessaging 的 delegate 因此不適用,想了解更多可以閱讀:https://pofat.substack.com/i/121437986/new-access-control-package
  2. App 專案中也引入這些三方套件,但某些版本的 Xcode 會有重複引入的 Log 提示

最後主管提議,還是引用 Firebase 的地方拉出來用 OC 寫試試看?

於是,就這麼成功了!!!

我們最後歸因出來推測的緣由是,某些三方套件(我的案例是 Firebase, GoogleSignIn, AppsFlyer)的 header 設定權限是 project 而不是 public,因此 SDK 專案內建立的 DemoApp 引用 SDK 不會出問題,但包出去給新建的 App 專案會有問題,因為不是在同一個 project 中就讀取不到三方套件的 header

同理可證,因為 SdkManager 是公開的接口,將 SdkManager 中引用三方的部分整個拉出去獨立寫一個 internal 權限的 ThirdPartyClass,SdkManager 需要時再透過 ThirdPartyClass 去做事情,ThirdPartyClass 用 OC 的方式寫,記得在 .m 文件中引入三方套件。這樣的方式讓 import 三方套件不會暴露在外面,compile 時也不會因為找不到模組而被中斷,確實功能也能夠運行

如果有不理解、更不錯的想法或是寫錯的地方歡迎糾正討論,祝大家都沒有蟲蟲每天快樂撒花!

--

--