原創(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ì)是:
然后我們將其與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)大致是:
- 修改.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)證是否可以使用了:
編譯運(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è)試是否可以使用
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尤泽,如下圖:
- 這個(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文件
- 接下來實(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è)小孩吃飯:
編譯發(fā)現(xiàn)會(huì)出現(xiàn)以下錯(cuò)誤:
只需要按照提示創(chuàng)建一個(gè)即可
- 實(shí)現(xiàn)Objective-C調(diào)用Swift卿拴,為了湊成一個(gè)家庭,我還創(chuàng)建了一個(gè)Father.swift類梨与, Family使用OC Language堕花,它包含了Kid、Mother粥鞋、Father這三個(gè)類缘挽,最后結(jié)構(gòu)如下:
編譯運(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只支持動(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文件中引用并且加上命名空間:
- 最后我們?cè)贓xample目錄下
Pod install
胳蛮,在項(xiàng)目中引用Family斗幼,然后來驗(yàn)證我們這個(gè)Pod是否創(chuàng)建成功
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é)果如下:
我將代碼上傳到了Verify-SwiftOC3rd娩井,歡迎指正
更多詳情可以參考我寫的一個(gè)框架屋彪,里面就包含了上述介紹的應(yīng)用:SwiftX 針對(duì)微信畜挥,微博华糖,JPush,網(wǎng)絡(luò)病线,緩存纺裁,常用view区赵,常用Extension,Json數(shù)據(jù)解析的封裝