用 Xcode 編譯 Cocoapods 靜態庫
在開發中用 Cocoapods 託管開放給第三方的 SDK 框架是很方便的,但是在實際應用中卻發現,cocoapods 的 lint 檢驗過於嚴格,在建立 framework 時經常因為各種無法描述的問題導致 xcodebuild 編譯失敗或者校驗無法通過。
對於一些複雜專案而言(尤其是一些和其他語言混編的專案),要通過編寫 podspec 配置來成功編譯非常不易。甚至筆者遇到一個專案,無論如何修改 podspec 都無法通過 cocoapods lint,經過漫長的 google 後發現此問題基本無解,但用 Xcode 編譯沒有任何問題。因此先用 Xcode 編譯出 .framework 檔案,將 .framework 放到 pod 中,在上傳至遠端索引庫。
用 Xcode 編譯 framework
這個過程不再贅述。值得注意的是,framework 必須是 universal 的,因為 cocoapods 的 lint 非常嚴格,如果 framework 中缺少 slice 是無論如何也不能 lint 的(此問題基本無解,網上說的設定 s.xcconfig archs 或者 OTHER_LDFLAGS[arch=i386] 的方法不工作)。也就是說必須在真機下編譯一次,再在模擬器下編譯一次,然後將兩個編譯出來的 .a 檔案合併為一個 .a 檔案(用 lipo -create)。然後將 .framework 中的原檔案替換。
建立 pod 元件庫
建立 git 庫後,check out 到本地,將 .framework 放到專案目錄,然後 push。唯一需要注意的是 push 之後別忘了為元件庫打上 tag。
建立 podspec
pod spec create <xxxframework>
這裡的 是你的 pod 庫名稱。
然後編寫 podspec(假設庫名為 YLYIndoorNavigation):
Pod::Spec.new do |s|
s.name = "YLYIndoorNavigation"
s.version = "0.0.1"
s.summary = "元力雲室內定位 SDK"
s.description = "廣州元力雲網絡 - 室內定位 SDK"
s.homepage = "https://gitee.com/kmyhy/YLYIndoorNavigationSDK"
s.license = { :type => "MIT", :file => "LICENSE" }
s.authors = { "kmyhy" => " [email protected]" }
s.source = { :git => 'https://gitee.com/kmyhy/YLYIndoorNavigationSDK.git', :tag =>s.version }
s.platform = :ios, '9.0'
s.vendored_frameworks = 'YLYIndoorNavigation.framework'
s.frameworks = 'UIKit','Foundation'
s.libraries = 'stdc++'
s.dependency 'CocoaAsyncSocket'
s.dependency 'Protobuf'
s.dependency 'MSWeakTimer'
s.dependency 'AFNetworking'
s.dependency 'FDFullscreenPopGesture', '~> 1.1'
end
- s.version 即 tag 版本號。
- s.verdored_frameworks 指定了這個 pod 庫中包含的第三方 framework,也就是我們用 xcode 編譯出來的那個 framework,如果還用到其它 framwork,可以繼續新增到這裡,用逗號分隔。
- s.libraries 是這個庫依賴的系統 .a 庫。比如 libstdc++.tbd,如果 c++ 混編程式碼,缺少這個會報一個 ___gxx_personality_v0 錯誤。
- s.dependency,依賴的 pod 庫。
- 這個庫除了 .framework 檔案之外,沒有任何原始檔,不用指定 s. source_files。
上傳 pod
如果沒註冊,先註冊:
pod trunk register [email protected] “xxx”
注:郵箱和名字必須和 .podspec 中的一致。註冊成功後去郵箱點連結。
然後 pod trunk push 上傳 Pod。
上傳完成後,先 pod setup 更新一下本地索引檔案,然後再 pod search,即可看到上傳的 pod。
如果還是搜尋不到,刪除~/Library/Caches/CocoaPods目錄下的search_index.json檔案。