原文地址:http://www.itdecent.cn/p/c7623c31d77b
知識(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è)依賴管理工具,使用CocoaPods可以自動(dòng)的去分析依賴,然后通過(guò)腳本去將第三方依賴復(fù)制編譯為靜態(tài)庫(kù)然后鏈接進(jìn)項(xiàng)目。~~~等。
制作Pod
有時(shí)候我們有把代碼做成一個(gè)輪子給別人用情況,我們需要按照官方的教程Making CocoaPods去制作。
教程分為2類 :
發(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 源代碼的頭文件。

headerConfig
有時(shí)候Xcode反應(yīng)會(huì)稍微延遲一點(diǎn)。手動(dòng)編譯一下即可。做完這個(gè)配置,Swift即可訪問(wèn)Objective-C 源代碼。
代碼如圖:

swiftAccessObjc
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)該編譯一下??)
具體代碼配置如圖

ObjcAccessSwift
至此混編項(xiàng)目測(cè)試完成。
制作Pod 創(chuàng)建Mixed.podspec文件 鍵入如下內(nèi)容
Pod::Spec.newdo|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 =trues.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ù)

podSpecSource
接下來(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'dopod'Mixed'end
然后進(jìn)行pod install,完成之后編譯然后不出意外的編譯出錯(cuò)(????????)

compile Error
接下來(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è)置

newSetting
編譯通過(guò),然后更新Mixed.podspec文件然后重新提交 重新安裝 這時(shí)候編譯MixedTest項(xiàng)目,發(fā)現(xiàn)雖然文件找到了但是還報(bào)錯(cuò)。

undefineIdtntify
進(jìn)入Mixed-Swift.h文件后發(fā)現(xiàn)除了一些系統(tǒng)的定義,并沒(méi)有找到我們定義的Swift代碼。 經(jīng)查詢資料得知,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