-
知識(shí)背景
In Xcode, with references directly from the ruby source, it:
- Creates or updates a workspace.
- Adds your project to the workspace if needed.
- Adds the CocoaPods static library project to the workspace if needed.
- Adds libPods.a to: targets => build phases => link with libraries.
- Adds the CocoaPods Xcode configuration file to your app's project.
- Changes your app's target configurations to be based on CocoaPods's.
- Adds a build phase to copy resources from any pods you installed to your app bundle. i.e. a 'Script build phase' after all other build phases with the following:
- Shell: /bin/sh
- Script: ${SRCROOT}/Pods/PodsResources.sh
大意是,CocoaPods是一個(gè)依賴(lài)管理工具凤价,使用CocoaPods可以自動(dòng)的去分析依賴(lài)鸽斟,然后通過(guò)腳本去將第三方依賴(lài)復(fù)制編譯為靜態(tài)庫(kù)然后鏈接進(jìn)項(xiàng)目。~~~等利诺。
- 制作Pod
有時(shí)候我們有把代碼做成一個(gè)輪子給別人用情況富蓄,我們需要按照官方的教程Making CocoaPods去制作。
教程分為2類(lèi) :
- 發(fā)布公共Pod給所有開(kāi)發(fā)者使用慢逾。
- 制作私有Pod立倍。 方法較為簡(jiǎn)單。自行查閱資料即可侣滩。這里不再贅述口注。
- Swift和Objective-C Mixed
參考官方的文檔(文末指出),混編里面包含有2種調(diào)用情況:
Question1. Swift調(diào)用Objective-C
Question2. Objective-C調(diào)用Swift
這里我新建一個(gè)項(xiàng)目 命名為Mixed(Single View Application)胜卤, 創(chuàng)建一個(gè)文件夾Classes用于存放源代碼
創(chuàng)建一個(gè)Objective-C Class O 繼承自NSObject 創(chuàng)建一個(gè)Swift Class S 繼承自NSObject
- Answer1: 為Swift源代碼添加一個(gè) XXX.h頭文件這里為Mixed-Bridging-Header 在這個(gè)文件中導(dǎo)入需要訪問(wèn)的Objective-C 源代碼的頭文件疆导。
有時(shí)候Xcode反應(yīng)會(huì)稍微延遲一點(diǎn)。手動(dòng)編譯一下即可。做完這個(gè)配置澈段,Swift即可訪問(wèn)Objective-C 源代碼悠菜。
代碼如圖:
-
Answer2: Objective-C 訪問(wèn)Swift源代碼 需要導(dǎo)入系統(tǒng)為項(xiàng)目生成的頭文件,默認(rèn)為Module+Swift.h 當(dāng)然自己也是可以修改的败富, 導(dǎo)入之后悔醋,編譯一下(Xcode有時(shí)候有緩存,沒(méi)事就應(yīng)該編譯一下??)
具體代碼配置如圖
至此混編項(xiàng)目測(cè)試完成兽叮。
- 制作Pod 創(chuàng)建Mixed.podspec文件 鍵入如下內(nèi)容
Pod::Spec.new do |s|
s.name = "Mixed"
s.version = "0.0.1"
s.summary = "鏈家網(wǎng)混編組件"
s.description = "鏈家網(wǎng)混編組件混編測(cè)試"
s.license = {:type => 'MIT', :file => 'LICENSE'}
s.homepage = 'http://XXXDomain/XXX.privateGit/Mixed.html'
s.author = { "男神寒" => "519224747@qq.com" }
s.source = { :git => "http://http://XXXDomain/XXX.privateGit/Mixed.git", :commit => "bb1e3eb2d55468252f68fb4c1881ecc68517757a" }
s.platform = :ios, '8.0'
s.ios.deployment_target = '8.0'
s.public_header_files = 'Mixed/Classes/*.h'
s.source_files = 'Mixed/Classes/*.{h,m,swift}'
s.requires_arc = true
s.pod_target_xcconfig = { 'SWIFT_VERSION' => '2.3' }
end
接下來(lái)可使用Cocoapods提高的命令行工具 pod spec lint Mixed.podspec 去校驗(yàn)芬骄,但是這個(gè)方法需要完整的去編譯所有項(xiàng)目去檢測(cè),在我的電腦需要編譯很久鹦聪,我一般都習(xí)慣直接安裝測(cè)試账阻。
按照如下文件夾格式存放 并提交到私有倉(cāng)庫(kù)
接下來(lái)新建一個(gè)測(cè)試工程MixedTest 在Podfile里面輸入
source 'http://http://http://XXXDomain/XXX.privateGit/privatePodPodSpec.git' #我們自己的私有spec倉(cāng)庫(kù)的地址
source 'https://github.com/CocoaPods/Specs.git' #官方倉(cāng)庫(kù)的地址
use_frameworks! #一定要加上 Swift只支持動(dòng)態(tài)庫(kù)的形式
platform :ios, '8.0'
inhibit_all_warnings!
target 'MixedTest' do
pod 'Mixed'
end
然后進(jìn)行pod install,完成之后編譯然后不出意外的編譯出錯(cuò)(????????) 接下來(lái)進(jìn)行分析錯(cuò)誤泽本,由于Swift只支持動(dòng)態(tài)庫(kù)(并非完全意義的動(dòng)態(tài)庫(kù))淘太,所以我們的代碼在Pod之后實(shí)際上是一個(gè)動(dòng)態(tài)的Framework,在這個(gè)名為Mixed的FrameWork里面规丽,Objectice-C源代碼是存放在Mixed的命名空間蒲牧,所以不需要Mixed-Bridging-Header.h也是可以的。而且也能正常的訪問(wèn)赌莺。所以問(wèn)題出現(xiàn)在Objective-C調(diào)用Swift的部分冰抢。 由于Swift是有命名空間的概念的。制作之后的Mixed-Bridging-Header位于Mixed的命名空間內(nèi)艘狭。由于CocoaPods對(duì)源代碼做的操作只是簡(jiǎn)單的復(fù)制挎扰。并不能修改源代碼。我們就需要在源頭做手腳巢音。 修改源工程的設(shè)置
編譯通過(guò)鼓鲁,然后更新Mixed.podspec文件然后重新提交 重新安裝 這時(shí)候編譯MixedTest項(xiàng)目,發(fā)現(xiàn)雖然文件找到了但是還報(bào)錯(cuò)港谊。
進(jìn)入Mixed-Swift.h文件后發(fā)現(xiàn)除了一些系統(tǒng)的定義骇吭,并沒(méi)有找到我們定義的Swift代碼。 經(jīng)查詢(xún)資料得知歧寺,Swift的默認(rèn)訪問(wèn)權(quán)限是internal燥狰,這個(gè)訪問(wèn)權(quán)限是無(wú)法被外部訪問(wèn)的,所以需要修改被Objective-C訪問(wèn)到的Swift源代碼相關(guān)的訪問(wèn)權(quán)限為Public(Swift2.3) 或者open/public(Swift3.x)斜筐。 至此提交龙致,安裝,編譯通過(guò)顷链。
- References