Flutter插件包開發中趟過的坑

首先說一下這個坑在iOS版的插件包中遇見的。從發現問題到截止到剛纔找到解決方案我們兩個同事已經研究了兩三天,昨天下午我也投入到這個問題中一直到剛纔纔算解脫。廢話不說,看下坑:

  • 我們在項目中用到了網絡電話功能,基於sip協議,之前實現過原生版功能,所以現在我們用Flutter做項目時就把它做成Flutter的插件包進行使用:
  • 首先我們創建插件包工程,這個過程上篇文章已經總結過不再贅述,看下工程結構:

圖片描述

iOS版本的功能需要卸載ios目錄下面。現在我們要實現的功能需要藉助第三方pod 'pjsip','~> 2.8.0' ,如何在插件包裏的iOS目錄裏引用第三方的pod,需要在 pjdemo/Pod 下的podspec配置文件中進行依賴編寫:
圖片描述

然後我們cd到 插件包目錄/example/ios下進行pod install操作安裝 pjsip這個第三方。成功後的目錄是這樣:
圖片描述

現在我們安裝了pjsip的文件,那麼我們在iOS的文件裏引用這個第三方:比如在PjdemoPlugin.m中 導入 #include <pjsua-lib/pjsua.h> 。。。。。。。

  • 重點來了,不用編譯,鏈接時報錯!!! 'pjsua-lib/pjsua.h' file not found !!!!!

然後慢慢發現在主工程中調用是一點問題沒有的,但是現在是在做插件包,插件代碼必須寫在pod工程下固定的iOS目錄下才行。
就是這個問題困擾了我們小夥伴將近三天時間,都是沒學幾天Flutter,所以邊做邊解決問題,而且這個問題也很怪異,其實我現在即使找到了解決方案但仍然感覺很慶幸,也還有一些不解。測試了別的第三方庫,在引用別的三方庫時是沒有問題的,比如 Afnetworking Masonry等......

  • 這樣的問題知道是鏈接有問題,那麼就反覆地檢查xcode中 build setting 裏各種路徑配置,像 Header Search Path 等等這種:
    圖片描述

我們反覆確認了很多遍xocde build setting 裏的配置是一點問題沒有的。最後怪圈裏轉了很久有點懵,只有一個問題其實,爲什麼pjdemo依賴了pjsip,主工程能調用pjdemo卻不能。最後想放棄的時候看了一眼主工程的pod相關文件和Pod工程裏的pod相關文件,看到了兩者的xcconfig文件:
圖片描述
圖片描述
上面第一張圖是主工程的xcconfig,第二張圖是Pod工程裏 pjdemo的xcconfig 。很幸運我注意到了他們的HEADER_SEARCH_PATHS 後面的值,主工程裏的字段包含了pjsip目錄下所有的子目錄,而pjdemo裏確實只有一個pjsip根目錄。那麼根據鏈接原理頭文件搜索路徑 pjdemo裏是搜索不全的。於是從主工程裏把pjdemo裏沒有的sip子目錄複製到pjdemo下,編譯通過!!!在快要放棄的時候發現了細節,真的很幸運。

  • 那麼 xcconfig 和 xcode 的build setting裏的配置到底是什麼關係呢?爲什麼兩者有差異,起作用的到底是哪個優先級是怎樣?

xcconfig文件其實就是xcode裏的config文件,本質是一個用來保存Build Settings鍵值對的純文本文件。這些鍵值對覆蓋Build Settings中的值,所以當在xcconfig文件中配置了的選項,在Build Settings中設置將失效。

很強大..........

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章