制作Swift和Objective-C Mixed的Pod

  • 知識(shí)背景

    1. What is CocoaPods
    2. What did CocoaPods do?

    In Xcode, with references directly from the ruby source, it:

    1. Creates or updates a workspace.
    2. Adds your project to the workspace if needed.
    3. Adds the CocoaPods static library project to the workspace if needed.
    4. Adds libPods.a to: targets => build phases => link with libraries.
    5. Adds the CocoaPods Xcode configuration file to your app's project.
    6. Changes your app's target configurations to be based on CocoaPods's.
    7. 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) :

  1. 發(fā)布公共Pod給所有開(kāi)發(fā)者使用慢逾。
  2. 制作私有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.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ù)


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' do
    pod '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)查詢(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
  1. sing Swift with Cocoa and Objective-C (Swift 3.0.1)
  2. CocoaPods
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末目代,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榛了,老刑警劉巖在讶,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異霜大,居然都是意外死亡构哺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)战坤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)曙强,“玉大人,你說(shuō)我怎么就攤上這事途茫〉欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵囊卜,是天一觀的道長(zhǎng)臀防。 經(jīng)常有香客問(wèn)我,道長(zhǎng)边败,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任捎废,我火速辦了婚禮笑窜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘登疗。我一直安慰自己排截,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布辐益。 她就那樣靜靜地躺著断傲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪智政。 梳的紋絲不亂的頭發(fā)上认罩,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音续捂,去河邊找鬼垦垂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牙瓢,可吹牛的內(nèi)容都是我干的劫拗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矾克,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼页慷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酒繁,失蹤者是張志新(化名)和其女友劉穎滓彰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體欲逃,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡找蜜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稳析。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洗做。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖彰居,靈堂內(nèi)的尸體忽然破棺而出诚纸,到底是詐尸還是另有隱情,我是刑警寧澤陈惰,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布畦徘,位于F島的核電站,受9級(jí)特大地震影響抬闯,放射性物質(zhì)發(fā)生泄漏井辆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一溶握、第九天 我趴在偏房一處隱蔽的房頂上張望杯缺。 院中可真熱鬧,春花似錦睡榆、人聲如沸萍肆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)塘揣。三九已至,卻和暖如春宿崭,著一層夾襖步出監(jiān)牢的瞬間亲铡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工葡兑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奴愉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓铁孵,卻偏偏與公主長(zhǎng)得像锭硼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜕劝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • 原文地址:http://ios.jobbole.com/92658/ 知識(shí)背景 What is CocoaPods...
    默默_David閱讀 1,430評(píng)論 0 0
  • 原文地址:http://www.reibang.com/p/c7623c31d77b 知識(shí)背景 What is C...
    默默_David閱讀 390評(píng)論 0 0
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)檀头、插件轰异、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評(píng)論 4 62
  • 做晚飯的時(shí)候,以前的一個(gè)小姐妹同事給我發(fā)了個(gè)視頻暑始。在看視頻之前搭独,我就有種不太好的預(yù)感。因?yàn)樗谂笥讶Πl(fā)了一張...
    飯廳閱讀 412評(píng)論 1 0
  • iOS AES加解密 hexToByte parseByteToHexString md5 AESEncrypt ...
    RainSets閱讀 1,173評(píng)論 0 1