欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flutter iOS開(kāi)發(fā)OC混編Swift動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)問(wèn)題填坑

 更新時(shí)間:2022年07月20日 16:51:37   作者:戀貓de小郭  
這篇文章主要為大家介紹了Flutter iOS OC 混編 Swift動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)問(wèn)題填坑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

Flutter 在 iOS 上的編譯問(wèn)題相信大家多多少少遇到過(guò),不知道大家在搜索這方便的問(wèn)題時(shí),得到的答案是不是讓你 clean 或者 install 多幾次,很多時(shí)候就算解決完問(wèn)題,也是處于薛定諤的狀態(tài),所以本篇也簡(jiǎn)單記錄下 Flutter 開(kāi)發(fā)中,OC 混編 Swift 遭遇動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的問(wèn)題,希望對(duì)“蒙圈”中的你有點(diǎn)幫助。

OC接入Swift 插件

首先,當(dāng)我在一個(gè) OC 項(xiàng)目里接入一個(gè) Swift 插件,可能會(huì)遇到什么問(wèn)題?

如下圖所示,如果你是一個(gè)比較老的 Flutter 項(xiàng)目,那可能會(huì)出現(xiàn) swift 插件出現(xiàn) not found 的問(wèn)題。

針對(duì)這個(gè)問(wèn)題,一般都是建議在 Podfile 文件下添加 use_frameworks! ,有時(shí)候還會(huì)建議添加 use_modular_headers! ,那這兩個(gè)標(biāo)記位的作用是什么?

target 'Runner' do
  use_frameworks! 
  use_modular_headers!
  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

我們知道 Podfile 的作用是處理 CocoaPads ,而 use_frameworks!告訴 CocoaPods 你想使用 Framework 而不是靜態(tài)庫(kù),而默認(rèn)由于 Swift 不支持靜態(tài)庫(kù),因此有一開(kāi)始 Swift 必須使用 Framework 的限制。

靜態(tài)庫(kù)和 Framework 區(qū)別

靜態(tài)庫(kù)和 Framework 的區(qū)別在于:

  • *.a 的靜態(tài)庫(kù)類似于編譯好的機(jī)械代碼,源代碼和庫(kù)代碼都被整合到單個(gè)可執(zhí)行文件中,所以它會(huì)和設(shè)備架構(gòu)綁定,并且不包含資源文件比如圖片;
  • Framework 支持將動(dòng)態(tài)庫(kù)、頭文件和資源文件封裝到一起的一種格式,其中動(dòng)態(tài)庫(kù)的簡(jiǎn)單理解是:不會(huì)像靜態(tài)庫(kù)一樣被整合到一起,而是在運(yùn)行或者運(yùn)行時(shí)動(dòng)態(tài)鏈接;

另外一個(gè)配置 use_modular_headers! ,它主要是將 pods 轉(zhuǎn)為 Modular,因?yàn)?Modular 是可以直接在 Swift中 import ,所以不需要再經(jīng)過(guò) bridging-header 的橋接。

但是開(kāi)啟 use_modular_headers! 之后,會(huì)使用更嚴(yán)格的 header 搜索路徑,開(kāi)啟后 pod 會(huì)啟用更嚴(yán)格的搜索路徑和生成模塊映射,歷史項(xiàng)目可能會(huì)出現(xiàn)重復(fù)引用等問(wèn)題,因?yàn)樵谝恍├享?xiàng)目里 CocoaPods 是利用Header Search Paths 來(lái)完成引入編譯,當(dāng)然使用 use_modular_headers!可以提高加載性能和減少體積。

繼續(xù)回到問(wèn)題上,我們?cè)谔砑油?use_frameworks! 之后,有一定幾率中獎(jiǎng)各種 Undefined symbol 的錯(cuò)誤問(wèn)題,這時(shí)候不要慌,因?yàn)檫@是 Swfit 里有靜態(tài)庫(kù)導(dǎo)致。

很明顯 Swift 不支持靜態(tài)庫(kù)的行為不科學(xué),所以從 Xcode 9 開(kāi)始 Swift 就開(kāi)始支持靜態(tài)庫(kù),而 CocoaPods 1.9.0 開(kāi)始,引入了 use_frameworks! :linkage => :static 來(lái)生支持有靜態(tài)庫(kù)和 Framework 的情況。

新的問(wèn)題: non-modular heade

所以修改 use_frameworks 配置,增加 static 之后可以看到 Undefined symbol 的錯(cuò)誤都消失了,但是運(yùn)行之后,可能會(huì)喜提新的問(wèn)題: non-modular header 。

如果你去搜索答案,有很多答案會(huì)告訴你如下圖所示,通過(guò) Allow Non-modular Includes in Framework Modules 設(shè)置為 true 就可以解決問(wèn)題,但是很明顯這并不是正解,它更多適用于臨時(shí)的緊急狀體下。

當(dāng)然,你也可以在出現(xiàn)問(wèn)題的插件的 .podspec 下單獨(dú)配置 ALLOW ,效果相同,更輕量級(jí),但是這也只是臨時(shí)解決方案。

s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }

為什么說(shuō)這種方式不靠譜,因?yàn)槟悴恢拦俜綍?huì)什么時(shí)候刪除這種允許,當(dāng)然這個(gè)問(wèn)題網(wǎng)友提供的解決方案其實(shí)千奇百怪:

  • 如果是 App 使用 dynamic framework 里的 header 導(dǎo)致錯(cuò)誤,可以使用 #import "MyFile.h" 而不是 #import <MyFramework/MyFile.h> ;
  • #import語(yǔ)句移到 .m(而不是將其放在.h頭文件中), 這樣它就不會(huì)有包含 non-modular header 的問(wèn)題,例如: github.com/AFNetworkin… ;
  • 重命名 header ,不要讓 header 和模塊名一樣,變?yōu)?#import <FrameworkName/Header.h>
  • 在 build setting 配置 OTHER_SWIFT_FLAGS -Xcc -Wno-error=non-modular-include-in-framework-module 解決 Swift 的問(wèn)題;

有可能它們都能解決你的問(wèn)題,但是為什么呢?下次遇到這些問(wèn)題要選哪個(gè)解決?

不能在Framework Module中使用非Modular 的 Header

回歸到我們的問(wèn)題,其實(shí)我的問(wèn)題關(guān)鍵是:不能在 Framework Module 中使用非 Modular 的 Header,也就問(wèn)題是在 Framework Module 中加載了非當(dāng)前 Module 的頭文件,而由于 Header 是對(duì)外 public ,比如配置到了 s.public_header_files ,就會(huì)導(dǎo)致非 Modular 的 Header 也出現(xiàn)對(duì)外暴露的風(fēng)險(xiǎn),所以我這邊的解放方式也很簡(jiǎn)單:

*在 s.public_header_files 里只放需要公開(kāi)的 Plugin.h ,使用了非 Modular 的 Header 不對(duì)外 public,從而符合規(guī)范達(dá)到編譯成功。

所以這里面的核心是:不要在 Umbrella Header File 中引用不需要對(duì)外公開(kāi)的 OC 頭文件去作為子 module ,這也解釋了為什么上面講出問(wèn)題的 #import語(yǔ)句移到 .m 就解決問(wèn)題的邏輯。

例如有時(shí)候你還會(huì)引用一些系統(tǒng)的 C Module ,其實(shí)在 Framework Module 化過(guò)程中也會(huì)有類似的問(wèn)題。

所以知道了為什么和怎么解決,就不會(huì)只是粗暴通過(guò) LLVM 的配置來(lái)設(shè)置 Allow Non-modular Includes in Framework Modules 去解決薛定諤的問(wèn)題。

另外你可能還有用到的,比如模擬器編譯提示 unsupport arm64、 BITCODE 失敗,SWIFT_VERSION 版本沖突等等:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
        # building for iOS Simulator, but linking in an object file built for iOS, for architecture ‘a(chǎn)rm64'
        config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
        #不支持 BITCODE
        config.build_settings['ENABLE_BITCODE'] = 'NO'
        #解決swift模塊問(wèn)題
        config.build_settings['SWIFT_VERSION'] = '5.0' 
    end
  end
end

當(dāng)然,最后一句話:珍愛(ài)頭發(fā),遠(yuǎn)離 Swift 混編。

以上就是Flutter iOS開(kāi)發(fā)OC混編Swift動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)問(wèn)題填坑的詳細(xì)內(nèi)容,更多關(guān)于Flutter iOS OC混編Swift的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例

    SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例

    緩存就是一個(gè)存儲(chǔ)器,常用 Redis作為緩存數(shù)據(jù)庫(kù),本文主要介紹了SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Swift利用AFN實(shí)現(xiàn)封裝網(wǎng)絡(luò)請(qǐng)求詳解

    Swift利用AFN實(shí)現(xiàn)封裝網(wǎng)絡(luò)請(qǐng)求詳解

    網(wǎng)絡(luò)請(qǐng)求工具是我們經(jīng)常用到的工具類,所以下面這篇文章主要給大家介紹了關(guān)于Swift利用AFN如何實(shí)現(xiàn)封裝網(wǎng)絡(luò)請(qǐng)求的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Swift源碼解析之弱引用

    Swift源碼解析之弱引用

    這篇文章主要給大家介紹了關(guān)于Swift源碼解析之弱引用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Swift4.1轉(zhuǎn)場(chǎng)動(dòng)畫(huà)實(shí)現(xiàn)側(cè)滑抽屜效果

    Swift4.1轉(zhuǎn)場(chǎng)動(dòng)畫(huà)實(shí)現(xiàn)側(cè)滑抽屜效果

    這篇文章主要為大家詳細(xì)介紹了Swift4.1轉(zhuǎn)場(chǎng)動(dòng)畫(huà)實(shí)現(xiàn)側(cè)滑抽屜效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Swift4.0 Array數(shù)組詳解

    Swift4.0 Array數(shù)組詳解

    這篇文章主要為大家詳細(xì)介紹了Swift4.0 Array數(shù)組的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 詳解Swift中的函數(shù)及函數(shù)閉包使用

    詳解Swift中的函數(shù)及函數(shù)閉包使用

    Swift的函數(shù)在創(chuàng)建和調(diào)用時(shí)非常簡(jiǎn)潔,在編寫(xiě)具有閉包特性的函數(shù)時(shí)同樣也相當(dāng)方便,以下我們就來(lái)詳解Swift中的函數(shù)及函數(shù)閉包使用:
    2016-06-06
  • Swift循環(huán)遍歷集合的方法總結(jié)分享

    Swift循環(huán)遍歷集合的方法總結(jié)分享

    SWIFT是蘋(píng)果于2014年WWDC發(fā)布的新開(kāi)發(fā)語(yǔ)言,可與Objective-C*共同運(yùn)行于Mac OS和iOS平臺(tái),用于搭建基于蘋(píng)果平臺(tái)的應(yīng)用程序。這篇文章主要給大家總結(jié)介紹了關(guān)于Swift循環(huán)遍歷集合的方法,如for-in循環(huán)、for循環(huán)以及基于塊的遍歷等方法,需要的朋友可以參考下。
    2017-03-03
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之?dāng)U展

    Swift 3.0基礎(chǔ)學(xué)習(xí)之?dāng)U展

    擴(kuò)展是向一個(gè)已有的類、結(jié)構(gòu)體或枚舉類型添加新的功能(在swift中擴(kuò)展沒(méi)有名字)。相當(dāng)于Objective-C中Category(OC中可以有名字的,而且只能擴(kuò)展類)。這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之?dāng)U展的相關(guān)資料,需要的朋友可以參考下。
    2017-03-03
  • Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model的方法及HandyJSON使用講解

    Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model的方法及HandyJSON使用講解

    這篇文章給大家介紹了Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model的方法及HandyJSON使用講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-07-07
  • 詳解Swift中enum枚舉類型的用法

    詳解Swift中enum枚舉類型的用法

    Swift中通過(guò)enum關(guān)鍵字可以直接創(chuàng)建出枚舉對(duì)象,而且可以使用switch和case語(yǔ)句來(lái)進(jìn)行流程控制,十分強(qiáng)大和靈活,這里我們就來(lái)詳解Swift中enum枚舉類型的用法
    2016-06-06

最新評(píng)論