制作 Swift 和 Objective-C Mixed 的 Pod

原文地址:http://www.itdecent.cn/p/c7623c31d77b


知識(shí)背景

What is CocoaPods

What did CocoaPods do?

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

sing Swift with Cocoa and Objective-C (Swift 3.0.1)

CocoaPods

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文地址:http://ios.jobbole.com/92658/ 知識(shí)背景 What is CocoaPods...
    默默_David閱讀 1,458評(píng)論 0 0
  • 知識(shí)背景What is CocoaPodsWhat did CocoaPods do?In Xcode, with...
    南梔傾寒閱讀 7,363評(píng)論 5 15
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,408評(píng)論 4 61
  • 今天上半堂課老師繼續(xù)講了昨天圖形繪制的剩余部分,比較簡(jiǎn)單,課上跟著練習(xí)就已經(jīng)掌握 ,但是下半堂課講的網(wǎng)絡(luò)程序設(shè)計(jì)比...
    劉博zero閱讀 130評(píng)論 0 1
  • 01 從小爸媽離異,我跟著爸爸,爸爸是個(gè)浪子,有點(diǎn)像許嵩那樣的,喜愛(ài)游蕩,喜愛(ài)自由?;蛟S因?yàn)檫@樣不羈的性格,我媽媽...
    麻花妹妹兒閱讀 725評(píng)論 2 10

友情鏈接更多精彩內(nèi)容