組件化開發(fā)之-如何解決Swift/OC-Framenwork/Library混合創(chuàng)建pod問題

原創(chuàng) 2017-06-28

關(guān)鍵點(diǎn)

  • Swift依賴第三方Objective-C Framework、Library創(chuàng)建Pod
  • Swift與Objective-C代碼混合創(chuàng)建Pod
  • Swift與OC萝招、第三方Framework/Library混合創(chuàng)建Pod

在我的另一篇文章中介紹到了如何創(chuàng)建自己的公有、私有Pod,我以為創(chuàng)建Pod的坑就可以很簡(jiǎn)單的跳過颠放,但是事情不是這樣子的饼酿,在使用組件化開發(fā)私有組件的時(shí)候我又遇到了新問題(由于項(xiàng)目采用的是Objective-C開發(fā)):

  • 業(yè)務(wù)組件依賴其他第三方廠家提供的OC Frameworwk、Library涩堤,這些第三方只提供了OC工具包眷蜓,這個(gè)時(shí)候我們應(yīng)該怎樣讓他集成到我們自己的其中一個(gè)業(yè)務(wù)組建中?
  • 在私有業(yè)務(wù)組件開發(fā)中胎围,遇到了項(xiàng)目急需演示驗(yàn)收吁系,這個(gè)時(shí)候你并沒有足夠的時(shí)間采用Swift來實(shí)現(xiàn)你的業(yè)務(wù)(已經(jīng)實(shí)現(xiàn)了一部分),但是在以前的OC開發(fā)項(xiàng)目中白魂,你已經(jīng)實(shí)現(xiàn)了此業(yè)務(wù)另一部分汽纤,現(xiàn)在你需要做的是把它們拿過來集成到你現(xiàn)在開發(fā)的一個(gè)業(yè)務(wù)組件中來 ,但是如何集成呢福荸?

下面來說一說解決辦法:

準(zhǔn)備工作

在這里我們需要有一個(gè)Development Pod讓我們來進(jìn)行開發(fā)蕴坪、測(cè)試,首先我們通過pod lib 來創(chuàng)建一個(gè)Pod,使其包含Example背传,Pods等呆瞻,當(dāng)然你也可以自己手動(dòng)完成這一系列事情。

pod lib create Verify-SwiftOC3rd
Cloning `https://github.com/CocoaPods/pod-template.git` into `Verify-SwiftOC3rd`.
Configuring Verify-SwiftOC3rd template.

------------------------------

To get you started we need to ask a few questions, this should only take a minute.

If this is your first time we recommend running through with the guide:
 - http://guides.cocoapods.org/making/using-pod-lib-create.html
 ( hold cmd and click links to open in a browser. )


What language do you want to use?? [ Swift / ObjC ]
 > Swift

Would you like to include a demo application with your library? [ Yes / No ]
 > Yes

Which testing frameworks will you use? [ Quick / None ]
 > None

Would you like to do view based testing? [ Yes / No ]
 > No

Running pod install on your new library.

上述所有的步驟你只需要按照提示信息完成即可径玖,創(chuàng)建成功后將會(huì)自動(dòng)打開項(xiàng)目痴脾,最后你看到的將會(huì)是:


image

然后我們將其與Github關(guān)聯(lián)起來,你需要在github上創(chuàng)建一個(gè)新的Repo - Verify-SwiftOC3rd

$ git remote add origin git@github.com:ApterKingRepo/Verify-SwiftOC3rd.git

接下來將.podspec 稍加修改:將其中的homepage挺狰,source等信息配置一下明郭,最后驗(yàn)證修改是否正確,然后提交代碼:

$ pod lib lint --swift-version=3.0

 -> Verify-SwiftOC3rd (0.1.0)

Verify-SwiftOC3rd passed validation.

$ git add .
$ git commit -m "Initial"
$ git push

至此準(zhǔn)備工作完成丰泊!

Swift依賴第三方Objective-C Framework薯定、Library創(chuàng)建Pod

在制作我自己私有Pod時(shí),我們往往需要用到第三方提供的工具包瞳购,比如說網(wǎng)絡(luò)請(qǐng)求Moya话侄,數(shù)據(jù)解析SwiftyJSON,響應(yīng)式編程(RP) RxSwfit等学赛,對(duì)于這些框架的使用我們?cè)谥谱鲃?chuàng)建我們Pod的時(shí)候年堆,往往只需要在我們的.podspec中dependency既可以了,如我在SwiftyJSON基礎(chǔ)之上創(chuàng)建的SwiftyJSONMappable(用于JSON與Model互相轉(zhuǎn)換盏浇,并且提供了與Moya的配合使用)這個(gè)Pod变丧,我只需要在我的Pod中使用dependency 即可:

Pod::Spec.new do |s|
  ...
  // 此處省略
  ...  
  s.requires_arc = true
  s.default_subspec = "Mappable"

  s.subspec "Mappable" do |ss|
    ss.source_files = "Pod/Classes/JSONMappable.swift"  
    ss.dependency "SwiftyJSON", "~>3.1.4"
    ss.frameworks = "Foundation"
  end
  ...
end

當(dāng)在創(chuàng)建我們自己的Pod時(shí),Pod會(huì)自己檢測(cè)并且install我所引用到的第三方倉(cāng)庫(kù)绢掰,一切順利痒蓬。但是也許你會(huì)使用到像百度地圖高德地圖滴劲、ShareSDK分享等使用Framework以及l(fā)ibrary方式集成的第三方庫(kù)攻晒,它們其中有些是提供了你使用Pod方式導(dǎo)入的,可能你會(huì)想到直接dependency一下班挖,這里我們就來以百度地圖為例做一個(gè)驗(yàn)證:

Pod::Spec.new do |s|

   ...

  s.requires_arc = true
  s.dependency "BaiduMapKit"   // 主要看這里就好

end

現(xiàn)在你想到的應(yīng)該是執(zhí)行pod lib lint就可以了吧鲁捏,ok我們來執(zhí)行以下

$ pod lib lint Verify-SwiftOC3rd.podspec

 -> Verify-SwiftOC3rd (0.0.1)
    - ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include static binaries: (/private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/thirdlibs/libcrypto.a, /private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/thirdlibs/libssl.a, /private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework, /private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework, /private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework, /private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework, /private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework, /private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework, and /private/var/folders/pq/1jkyxxs52bd9c4jykqvgfqbw0000gn/T/CocoaPods/Lint/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework)) during validation.

[!] Verify-SwiftOC3rd did not pass validation, due to 1 error.
You can use the `--no-clean` option to inspect any issue.

結(jié)果是驗(yàn)證不通過!O糗健给梅!為什么呢?那是因?yàn)樵赑od中你是使用了動(dòng)靜態(tài)庫(kù).framework双揪、.a动羽,這個(gè)是在制作Pod時(shí)需要指明的,你需要使用到(官方文檔可查):

vendored_frameworks = "xxx.framework"
vendored_libraries = "xxx.a"

他們需要的是一個(gè)路徑盟榴,相對(duì)路徑曹质,也就是說如果你在制作Pod時(shí),如果第三方工具包使用的是動(dòng)態(tài)庫(kù).framework或者靜態(tài)庫(kù).a,那么你就不能簡(jiǎn)單的通過dependency方式來引入它了羽德,不管它是Objective-C還是Swift Language几莽,你現(xiàn)在要做的是下載到他們的framewor或者library耸成,然后通過上面的一種或者兩種方式來引入進(jìn)來跑筝,對(duì)于這個(gè)問題,我想就使用百度地圖來說明一下解決情況吧:

  • 首先你需要根據(jù)自己的需求去官網(wǎng)下載百度地圖SDK(這里我只下載基礎(chǔ)地圖包)
  • 將其放置于你需要制作Pod項(xiàng)目的一個(gè)子目錄下

處理完成之后項(xiàng)目目錄結(jié)構(gòu)大致是:

image
  • 修改.podspec文件

我這里把百度地圖制作成為一個(gè)subspec蜻懦,當(dāng)然你也可以不用這樣姨夹,我這樣做的原因是:因?yàn)槲疫€有我與業(yè)務(wù)相關(guān)的source_files纤垂,我把百度地圖作為一個(gè)subspec更好區(qū)分一點(diǎn)而已


Pod::Spec.new do |s|

  s.name         = "Verify-SwiftOC3rd"
  s.version      = "0.0.1"
  s.summary      = "驗(yàn)證私有組件中使用Swift結(jié)合OC第三方.framewor、.library庫(kù)及OC文件組合打包構(gòu)建私有Pod"
  ...

  s.requires_arc = true

  s.subspec 'BaiduMapKit' do |ss|   
    ss.source_files = ''Verify-SwiftOC3rd/Vendors/*.framework/Headers/**.h'
    ss.public_header_files = ''Verify-SwiftOC3rd/Vendors/*.framework/Headers/**.h'

    ss.frameworks   =  'CoreLocation', 'QuartzCore', 'OpenGLES', 'SystemConfiguration', 'CoreGraphics', 'Security', 'CoreTelephony'
    ss.libraries    = 'sqlite3.0', 'stdc++.6.0.9'

    ss.vendored_frameworks =  'Verify-SwiftOC3rd/Vendors/*.framework'
    ss.vendored_libraries = 'Verify-SwiftOC3rd/Vendors/thirdlibs/*.a'

    ss.preserve_paths = 'Verify-SwiftOC3rd/Vendors/*.framework', 'Verify-SwiftOC3rd/Vendors/thirdlibs/*.a'
    ss.pod_target_xcconfig = { 'LD_RUNPATH_SEARCH_PATHS' => '$(PODS_ROOT)/Verify-SwiftOC3rd/Vendors/' }
  end

end

好了現(xiàn)在讓我們來驗(yàn)證一下是否可以成功:

$  pod lib lint

 -> Verify-SwiftOC3rd (0.1.0)
    - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
    - NOTE  | xcodebuild:  <module-includes>:1:9: note: in file included from <module-includes>:1:
    - NOTE  | xcodebuild:  /Users/wangcong/Library/Developer/Xcode/DerivedData/App-bqxcyvfrcjeqxqbqkrseipvvyrla/Build/Products/Release-iphonesimulator/Verify-SwiftOC3rd/Verify_SwiftOC3rd.framework/Headers/Verify-SwiftOC3rd-umbrella.h:22:9: note: in file included from /Users/wangcong/Library/Developer/Xcode/DerivedData/App-bqxcyvfrcjeqxqbqkrseipvvyrla/Build/Products/Release-iphonesimulator/Verify-SwiftOC3rd/Verify_SwiftOC3rd.framework/Headers/Verify-SwiftOC3rd-umbrella.h:22:
    - NOTE  | xcodebuild:  /Users/wangcong/Library/Developer/Xcode/DerivedData/App-bqxcyvfrcjeqxqbqkrseipvvyrla/Build/Products/Release-iphonesimulator/Verify-SwiftOC3rd/Verify_SwiftOC3rd.framework/Headers/BMKArcline.h:9:9: note: in file included from /Users/wangcong/Library/Developer/Xcode/DerivedData/App-bqxcyvfrcjeqxqbqkrseipvvyrla/Build/Products/Release-iphonesimulator/Verify-SwiftOC3rd/Verify_SwiftOC3rd.framework/Headers/BMKArcline.h:9:
    - ERROR | [iOS] xcodebuild:  /Users/wangcong/Library/Developer/Xcode/DerivedData/App-bqxcyvfrcjeqxqbqkrseipvvyrla/Build/Products/Release-iphonesimulator/Verify-SwiftOC3rd/Verify_SwiftOC3rd.framework/Headers/BMKMultiPoint.h:10:9: error: include of non-modular header inside framework module 'Verify_SwiftOC3rd.BMKMultiPoint': '../../../../../../../../../Users/wangcong/Development/iOS/Verify/Verify-SwiftOC3rd/Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Headers/BMKTypes.h'

完美的出現(xiàn)了兩個(gè)錯(cuò)誤

  • include of non-modular header inside framework module 'xxx.framework'
  • error: redefinition of enumerator 'BMK_COORDTYPE_GPS'

要解決這兩個(gè)錯(cuò)誤很簡(jiǎn)單磷账,你只需要去掉你BaiduMapKit中的兩個(gè)參數(shù)ss.source_files以及ss.public_header_files

Pod::Spec.new do |s|

  s.name         = "Verify-SwiftOC3rd"
  s.version      = "0.0.1"
  s.summary      = "驗(yàn)證私有組件中使用Swift結(jié)合OC第三方.framewor峭沦、.library庫(kù)及OC文件組合打包構(gòu)建私有Pod"
  ...

  s.requires_arc = true

  s.subspec 'BaiduMapKit' do |ss|   
    ss.frameworks   =  'CoreLocation', 'QuartzCore', 'OpenGLES', 'SystemConfiguration', 'CoreGraphics', 'Security', 'CoreTelephony'
    ss.libraries    = 'sqlite3.0', 'stdc++.6.0.9'

    ss.vendored_frameworks =  'Verify-SwiftOC3rd/Vendors/*.framework'
    ss.vendored_libraries = 'Verify-SwiftOC3rd/Vendors/thirdlibs/*.a'

    ss.preserve_paths = 'Verify-SwiftOC3rd/Vendors/*.framework', 'Verify-SwiftOC3rd/Vendors/thirdlibs/*.a'
    ss.pod_target_xcconfig = { 'LD_RUNPATH_SEARCH_PATHS' => '$(PODS_ROOT)/Verify-SwiftOC3rd/Vendors/' }
  end

end

是什么原因呢?在創(chuàng)建Pod時(shí)候逃糟,我們并不需要?jiǎng)?chuàng)建xxx-Bridge-Header吼鱼, 這個(gè)工作交由xxx-umbrella.h完成,這個(gè)文件的作用是:混合你的Swift以及OC绰咽,并且向外界暴露你的APIs菇肃,當(dāng)你再次通過ss.source_files以及ss.public_header_files時(shí)會(huì)重復(fù)定義,現(xiàn)在我們?nèi)サ糁髞碓囋囀欠衲軌虺晒Γ?/p>

$ pod lib lint

 -> Verify-SwiftOC3rd (0.1.0)

Verify-SwiftOC3rd passed validation.

OK , 成功取募!接下來將你的代碼push到名叫Verify的specs中

$ git add .
$ git commit -m "提交百度.framework琐谤、.a 并且完成subspec BaiduMapKit"
$ git push    // 這里會(huì)等上一會(huì)
$ git tag 0.1.0
$ git push --tags
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:ApterKingRepo/Verify-SwiftOC3rd.git
 * [new tag]         0.1.0 -> 0.1.0

$ pod repo push Verify Verify-SwiftOC3rd.podspec
  • 現(xiàn)在你我們來驗(yàn)證是否可以使用了:
image

編譯運(yùn)行,一切OK玩敏!到這里已經(jīng)算是可以使用了斗忌。這里我們來進(jìn)行稍微的優(yōu)化一下,你可能會(huì)想到如果你的項(xiàng)目是采用Swift來完成的聊品,那么你就必須需要?jiǎng)?chuàng)建xxx-Bridge-Heder.h飞蹂,有沒有一種方式是可以不需要Bridge-Header的呢几苍?這里我么使用創(chuàng)建一個(gè).modulemap來解決進(jìn)行優(yōu)化:

  • 修改.podspec翻屈,為你所引用到的framework創(chuàng)建Module,這里我把.podsepc全部提出來妻坝,為了使你了解的更明白:

注意:
如果我們手動(dòng)創(chuàng)建一個(gè)module文件伸眶,直接移進(jìn)去。這樣會(huì)導(dǎo)致 pod install 時(shí)可能丟失該文件刽宪,那么該怎么辦呢厘贼?我們需要使用的是prepare_command,來幫助我們自動(dòng)創(chuàng)建



Pod::Spec.new do |s|
  s.name             = 'Verify-SwiftOC3rd'
  s.version          = '0.1.4'
  s.summary          = '驗(yàn)證私有組件中使用Swift結(jié)合OC第三方.framework圣拄、.library庫(kù)及OC文件組合打包構(gòu)建私有Pod'

  s.homepage         = 'https://github.com/ApterKingRepo/Verify-SwiftOC3rd'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'ApterKing' => 'wangcccong@outlook.com' }
  s.source           = { :git => 'https://github.com/ApterKingRepo/Verify-SwiftOC3rd.git', :tag => s.version.to_s }

  s.ios.deployment_target = '8.0'

  s.source_files = 'Verify-SwiftOC3rd/Vendors/*.framework/Headers/**.h'
  s.public_header_files = 'Verify-SwiftOC3rd/Vendors/*.framework/Headers/**.h'
  s.resources = 'Verify-SwiftOC3rd/Vendors/*.framework/Resources/mapapi.bundle'
  
  s.frameworks   =  'CoreLocation', 'QuartzCore', 'OpenGLES', 'SystemConfiguration', 'CoreGraphics', 'Security', 'CoreTelephony'
  s.libraries    = 'sqlite3.0', 'stdc++.6.0.9'

  s.vendored_frameworks =  'Verify-SwiftOC3rd/Vendors/*.framework'
  s.vendored_libraries = 'Verify-SwiftOC3rd/Vendors/thirdlibs/*.a'

  s.prepare_command = <<-EOF
    # 創(chuàng)建Base Module
    rm -rf Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Modules
    mkdir Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Modules
    touch Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Modules/module.modulemap
    cat <<-EOF > Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Modules/module.modulemap
    framework module BaiduMapAPI_Base {
      umbrella header "BMKBaseComponent.h"
      export *
      link "sqlite3.0"
      link "stdc++.6.0.9"
    }
    \EOF

    # 創(chuàng)建Map Module
    rm -rf Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Modules
    mkdir Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Modules
    touch Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Modules/module.modulemap
    cat <<-EOF > Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Modules/module.modulemap
    framework module BaiduMapAPI_Map {
      umbrella header "BMKMapComponent.h"
      export *
      link "sqlite3.0"
      link "stdc++.6.0.9"
    }
    \EOF

  EOF

end
  • pod install嘴秸,測(cè)試是否可以使用
image

Swift與Objective-C代碼混合創(chuàng)建Pod

接下來我們還需要來解決文章開頭提到的第二個(gè)問題,那就是如何將Swfit于OC代碼混合打包(我們這一步只驗(yàn)證Swift與OC混合打包),在這里就直接使用上述所創(chuàng)建的工程岳掐,不過我們需要的先將上述與百度地圖有關(guān)的信息刪除凭疮,然后修改Pod文件:

  • 刪除Vendors文件夾
  • 修改.podspec

Pod::Spec.new do |s|
  s.name             = 'Verify-SwiftOC3rd'
  s.version          = '0.1.1'
  s.summary          = '驗(yàn)證私有組件中使用Swift結(jié)合OC第三方.framework、.library庫(kù)及OC文件組合打包構(gòu)建私有Pod'

  s.homepage         = 'https://github.com/ApterKingRepo/Verify-SwiftOC3rd'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'ApterKing' => 'wangcccong@outlook.com' }
  s.source           = { :git => 'https://github.com/ApterKingRepo/Verify-SwiftOC3rd.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'
  s.source_files = 'Verify-SwiftOC3rd/Classes/**/*'
  # s.public_header_files = 'Pod/Classes/**/*.h'

end

注:
可以不用通過pod repo push 之后再來驗(yàn)證創(chuàng)建的Pod添加的代碼是否正確串述,在你通過pod lib create POD_NAME 中是可以直接修改本地.podspec执解,然后在Example目錄下直接pod install,這個(gè)驗(yàn)證比較方便纲酗,快捷衰腌,不用依賴網(wǎng)絡(luò)

  • 接下來創(chuàng)建一個(gè)PersonProtocol、Kid觅赊,使Kid實(shí)現(xiàn)PersonProtocol協(xié)議
  • 完成上述步驟后右蕊,你當(dāng)然是希望外部也能夠訪問到我的文件,那該如何處理呢吮螺?現(xiàn)在只需要將他們的.h文件設(shè)置為public尤泽,如下圖:
image
  • 這個(gè)時(shí)候你執(zhí)行pod install,然后打開你的xxx-unbrella.h规脸,你會(huì)發(fā)現(xiàn)上述兩個(gè)文件的頭文件已經(jīng)被引入進(jìn)來了坯约,你可以把xxx-unbrella.h看成是你的項(xiàng)目頭文件或者在Swift項(xiàng)目中他充當(dāng)一個(gè)xxx-Bridge-Header.h文件
image
  • 接下來實(shí)現(xiàn)Swift對(duì)OC的引用,如果是Swift代碼我們是不需要像OC一樣設(shè)置其為public的只需要定義其訪問權(quán)限即可莫鸭,但是需要勾選其Target Membership闹丐。我在這里創(chuàng)建一個(gè)Woman,使其有一個(gè)小孩Kid并且實(shí)現(xiàn)PersonProtocol被因,然后喂養(yǎng)這個(gè)小孩吃飯:
image

編譯發(fā)現(xiàn)會(huì)出現(xiàn)以下錯(cuò)誤:


image

只需要按照提示創(chuàng)建一個(gè)即可


image
  • 實(shí)現(xiàn)Objective-C調(diào)用Swift卿拴,為了湊成一個(gè)家庭,我還創(chuàng)建了一個(gè)Father.swift類梨与, Family使用OC Language堕花,它包含了Kid、Mother粥鞋、Father這三個(gè)類缘挽,最后結(jié)構(gòu)如下:
image

編譯運(yùn)行,你會(huì)發(fā)現(xiàn)上述錯(cuò)誤呻粹,找不到你的ProjectName-Swift.h。原因有兩點(diǎn):一是在你的ProjectName-Swift.h中是引用了Family.h的等浊,如果你這時(shí)候在定義Family.h中又引用ProjectName-Swift.h造成了有點(diǎn)像循環(huán)引用的概念腮郊;


Swift與OC互相調(diào)用流程
image

二是Swift只支持動(dòng)態(tài)庫(kù)(并非完全意義的動(dòng)態(tài)庫(kù))衅鹿,而我們代碼在Pod之后實(shí)際上是一個(gè)動(dòng)態(tài)的Framework,Swift是有命名空間的一個(gè)概念援奢,這時(shí)候你需要做的是在引用時(shí)需要寫明命名空間具篇。基于上述兩點(diǎn)伏恐,我們只能在OC的.m文件中引用并且加上命名空間:

image
  • 最后我們?cè)贓xample目錄下 Pod install胳蛮,在項(xiàng)目中引用Family斗幼,然后來驗(yàn)證我們這個(gè)Pod是否創(chuàng)建成功
image

Swift與OC 代碼渠羞、 Framework、Library混合創(chuàng)建Pod

上述兩個(gè)分別講解了Swift與OC代碼混合創(chuàng)建Pod,Swift與OC Framework、Library混合創(chuàng)建Pod,現(xiàn)在我們來將三者混合創(chuàng)建煮寡,這里也就是我們解決了三種:

  • Swift引用第三方Framework、Library
  • Swift與Objective-C 在Pod相互調(diào)用
  • Swift與Objective-C 在項(xiàng)目貌矿、Pod相互調(diào)用Framework尽楔、Library阔馋、代碼

依照上述兩個(gè)章節(jié)所講,我的.podspec如下:


Pod::Spec.new do |s|
  s.name             = 'Verify-SwiftOC3rd'
  s.version          = '0.1.4'
  s.summary          = '驗(yàn)證私有組件中使用Swift結(jié)合OC第三方.framework、.library庫(kù)及OC文件組合打包構(gòu)建私有Pod'

  s.homepage         = 'https://github.com/ApterKingRepo/Verify-SwiftOC3rd'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'ApterKing' => 'wangcccong@outlook.com' }
  s.source           = { :git => 'https://github.com/ApterKingRepo/Verify-SwiftOC3rd.git', :tag => s.version.to_s }

  s.ios.deployment_target = '8.0'

  s.source_files = 'Verify-SwiftOC3rd/Classes/**/*', 'Verify-SwiftOC3rd/Vendors/*.framework/Headers/**.h'
  s.public_header_files = 'Verify-SwiftOC3rd/Classes/**/*.h', 'Verify-SwiftOC3rd/Vendors/BadiduMapAPI_Base.framework/Headers/BMKBaseComponent.h', 'Verify-SwiftOC3rd/Vendors/BadiduMapAPI_Map.framework/Headers/BMKMapComponent.h'
  s.resources = 'Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Resources/mapapi.bundle'
#s.module_name = 'BaiduMapKit'

  s.frameworks   =  'CoreLocation', 'QuartzCore', 'OpenGLES', 'SystemConfiguration', 'CoreGraphics', 'Security', 'CoreTelephony'
  s.libraries    = 'sqlite3.0', 'stdc++.6.0.9'

  s.vendored_frameworks =  'Verify-SwiftOC3rd/Vendors/*.framework'
  s.vendored_libraries = 'Verify-SwiftOC3rd/Vendors/thirdlibs/*.a'

  s.preserve_paths = 'Verify-SwiftOC3rd/Vendors/*.framework', 'Verify-SwiftOC3rd/Vendors/thirdlibs/*.a'
  s.pod_target_xcconfig = {
#'FRAMEWORK_SEARCH_PATHS' => '${PODS_ROOT}/Verify-SwiftOC3rd/Vendors',
            'HEADER_SEARCH_PATHS' => '$(PODS_ROOT)/Verify-SwiftOC3rd/Vendors/*.framework/Headers',
            'LD_RUNPATH_SEARCH_PATHS' => '$(PODS_ROOT)/Verify-SwiftOC3rd/Vendors/',
            'OTHER_LDFLAGS' => '-ObjC'
  }

  s.prepare_command = <<-EOF

    # 業(yè)務(wù)Module
    rm -rf Verify-SwiftOC3rd/Classes/Modules
    mkdir Verify-SwiftOC3rd/Classes/Modules
    touch Verify-SwiftOC3rd/Classes/Modules/module.modulemap
    cat <<-EOF > Verify-SwiftOC3rd/Classes/Modules/module.modulemap
    framework module Verify {
      umbrella header "Verify_SwiftOC3rd.h"
      export *
      link "sqlite3.0"
      link "stdc++.6.0.9"
    }
    \EOF


    # 創(chuàng)建Base Module
    rm -rf Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Modules
    mkdir Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Modules
    touch Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Modules/module.modulemap
    cat <<-EOF > Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Base.framework/Modules/module.modulemap
    framework module BaiduMapAPI_Base {
      umbrella header "BMKBaseComponent.h"
      export *
      link "sqlite3.0"
      link "stdc++.6.0.9"
    }
    \EOF

    # 創(chuàng)建Map Module
    rm -rf Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Modules
    mkdir Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Modules
    touch Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Modules/module.modulemap
    cat <<-EOF > Verify-SwiftOC3rd/Vendors/BaiduMapAPI_Map.framework/Modules/module.modulemap
    framework module BaiduMapAPI_Map {
      umbrella header "BMKMapComponent.h"
      export *
      link "sqlite3.0"
      link "stdc++.6.0.9"
    }
    \EOF

  EOF

end

運(yùn)行結(jié)果如下:

image

我將代碼上傳到了Verify-SwiftOC3rd娩井,歡迎指正

更多詳情可以參考我寫的一個(gè)框架屋彪,里面就包含了上述介紹的應(yīng)用:SwiftX 針對(duì)微信畜挥,微博华糖,JPush,網(wǎng)絡(luò)病线,緩存纺裁,常用view区赵,常用Extension,Json數(shù)據(jù)解析的封裝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖猪勇,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件设褐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泣刹,警方通過查閱死者的電腦和手機(jī)助析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椅您,“玉大人貌笨,你說我怎么就攤上這事〗缶冢” “怎么了锥惋?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)开伏。 經(jīng)常有香客問我膀跌,道長(zhǎng),這世上最難降的妖魔是什么固灵? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任捅伤,我火速辦了婚禮,結(jié)果婚禮上巫玻,老公的妹妹穿的比我還像新娘丛忆。我一直安慰自己祠汇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布熄诡。 她就那樣靜靜地躺著可很,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凰浮。 梳的紋絲不亂的頭發(fā)上我抠,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音袜茧,去河邊找鬼菜拓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛笛厦,可吹牛的內(nèi)容都是我干的纳鼎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼裳凸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贱鄙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起登舞,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤贰逾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后菠秒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疙剑,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年践叠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了言缤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡禁灼,死狀恐怖管挟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弄捕,我是刑警寧澤僻孝,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站守谓,受9級(jí)特大地震影響穿铆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斋荞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一荞雏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦凤优、人聲如沸悦陋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俺驶。三九已至,卻和暖如春挖垛,著一層夾襖步出監(jiān)牢的瞬間痒钝,已是汗流浹背秉颗。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工痢毒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚕甥。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓哪替,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親菇怀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凭舶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容