- 知識背景
- 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是一個依賴管理工具,使用CocoaPods可以自動的去分析依賴,然後通過指令碼去將第三方依賴複製編譯為靜態庫然後連結進專案。~~~等。
- 製作Pod
有時候我們有把程式碼做成一個輪子給別人用情況,我們需要按照官方的教程Making CocoaPods去製作。
教程分為2類 :
- 釋出公共Pod給所有開發者使用。
- 製作私有Pod。 方法較為簡單。自行查閱資料即可。這裡不再贅述。
- Swift和Objective-C Mixed
參考官方的文件(文末指出),混編裡面包含有2種呼叫情況:
Question1. Swift呼叫Objective-C
Question2. Objective-C呼叫Swift
這裡我新建一個專案 命名為Mixed(Single View Application), 建立一個資料夾Classes用於存放原始碼
建立一個Objective-C Class O 繼承自NSObject 建立一個Swift Class S 繼承自NSObject
- Answer1: 為Swift原始碼新增一個 XXX.h標頭檔案這裡為Mixed-Bridging-Header 在這個檔案中匯入需要訪問的Objective-C 原始碼的標頭檔案。
有時候Xcode反應會稍微延遲一點。手動編譯一下即可。做完這個配置,Swift即可訪問Objective-C 原始碼。
程式碼如圖:
- Answer2: Objective-C 訪問Swift原始碼 需要匯入系統為專案生成的標頭檔案,預設為Module+Swift.h 當然自己也是可以修改的, 匯入之後,編譯一下(Xcode有時候有快取,沒事就應該編譯一下?)
具體程式碼配置如圖
至此混編專案測試完成。
- 製作Pod 建立Mixed.podspec檔案 鍵入如下內容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Pod::Spec.new do |s| s.name = "Mixed" s.version = "0.0.1" s.summary = "鏈家網混編元件" s.description = "鏈家網混編元件混編測試" 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 |
接下來可使用Cocoapods提高的命令列工具 pod spec lint Mixed.podspec 去校驗,但是這個方法需要完整的去編譯所有專案去檢測,在我的電腦需要編譯很久,我一般都習慣直接安裝測試。
按照如下資料夾格式存放 並提交到私有倉庫
接下來新建一個測試工程MixedTest 在Podfile裡面輸入
1 2 3 4 5 6 7 8 9 10 11 |
source 'http://http://http://XXXDomain/XXX.privateGit/privatePodPodSpec.git' #我們自己的私有spec倉庫的地址 source 'https://github.com/CocoaPods/Specs.git' #官方倉庫的地址 use_frameworks! #一定要加上 Swift只支援動態庫的形式 platform :ios, '8.0' inhibit_all_warnings! target 'MixedTest' do pod 'Mixed' end |
然後進行pod install,完成之後編譯然後不出意外的編譯出錯(????)
接下來進行分析錯誤,由於Swift只支援動態庫(並非完全意義的動態庫),所以我們的程式碼在Pod之後實際上是一個動態的Framework,在這個名為Mixed的FrameWork裡面,Objectice-C原始碼是存放在Mixed的名稱空間,所以不需要Mixed-Bridging-Header.h也是可以的。而且也能正常的訪問。所以問題出現在Objective-C呼叫Swift的部分。 由於Swift是有名稱空間的概念的。製作之後的Mixed-Bridging-Header位於Mixed的名稱空間內。由於CocoaPods對原始碼做的操作只是簡單的複製。並不能修改原始碼。我們就需要在源頭做手腳。 修改源工程的設定
編譯通過,然後更新Mixed.podspec檔案然後重新提交 重新安裝 這時候編譯MixedTest專案,發現雖然檔案找到了但是還報錯。
進入Mixed-Swift.h檔案後發現除了一些系統的定義,並沒有找到我們定義的Swift程式碼。 經查詢資料得知,Swift的預設訪問許可權是internal,這個訪問許可權是無法被外部訪問的,所以需要修改被Objective-C訪問到的Swift原始碼相關的訪問許可權為Public(Swift2.3) 或者open/public(Swift3.x)。 至此提交,安裝,編譯通過。