-
知識背景
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有時候有緩存,沒事就應該編譯一下??)
具體代碼配置如圖
ObjcAccessSwift
至此混編項目測試完成。
- 制作Pod 創建Mixed.podspec文件 鍵入如下內容
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里面輸入
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)。 至此提交,安裝,編譯通過。
- References