今天將手上的SDK加入了通過CocoaPod整合,但是沒有上到pod的官方庫,是公司內部的私有庫,現在元件化很火,相信很多公司稍微大一些的專案都會有這個需求,現在我們就來講講怎麼加入pod的整合方式,這裡我就把github當做我的私有倉庫了
pod環境我就不講怎麼整合了,如果還沒整合的同學,請移步
pod lib create
這裡我們通過pod官方提供的模板來建立,我目前也是這樣建立的,當然xcode也提供了建立靜態庫的方式,這個我就不講了,感興趣的同學可以Google一下
首先進入到我們想要存放工程的地方 通過命令:
pod lib create PPSPrivateStaticLibrary複製程式碼
這裡我將我的靜態庫取名為PPSPrivateStaticLibrary
這裡開始建立的時候我們會填幾個問題:
What language do you want to use?? [ Swift / ObjC ] //選擇你要建立的靜態庫的語言
Would you like to include a demo application with your library? [ Yes / No ] //是否需要建立一個demo用來測試你的靜態庫
Which testing frameworks will you use? [ Specta / Kiwi / None ] //使用哪種測試框架來進行測試
Would you like to do view based testing? [ Yes / No ] //是否要做基礎的檢視測試
What is your class prefix? //檔案字首
下面是我選擇的
建立完成過後,我們的工程會自動開啟,建立完成後,工程的目錄如下
接下來我們主要編輯的是podspec檔案,首先我們來看一下,我編寫的SDK中的測試檔案結構
我想要公開上面檔案中的PPSPublic1和PPSPublic2的標頭檔案,其他的全部不公開出來,那我們怎樣編寫podspec檔案呢
Pod::Spec.new do |s|
s.name = 'PPSPrivateStaticLibrary'
s.version = '0.1.0'
#這裡加上你的工程簡介
s.summary = 'This is ppsheep‘s test'
#這裡加上你的工程簡介
s.description = <<-DESC
這是我的一個測試工程,用來演示怎樣建立一個原始碼不公開的靜態庫
DESC
#專案主頁,這裡可以放上你的靜態庫的介紹網頁
s.homepage = 'https://github.com/yangqian111/PPSPrivateStaticLibrary'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'ppsheep' => 'ppsheep.qian@gmail.com' }
s.source = { :git => '/Users/yangqian/Desktop/demo/PPSPrivateStaticLibrary', :tag => s.version.to_s }
#最低iOS系統要求
s.ios.deployment_target = '8.0'
#是否需要專案支援ARC
s.requires_arc = true
#這個地方注意下,你在工程中要用到的framework,都需要在這裡宣告,我只是這裡列舉了幾個
s.frameworks = 'SystemConfiguration', 'MobileCoreServices', 'CoreGraphics', 'Security', 'CoreTelephony'
#在專案中我們還會用到一些library,也需要在這裡宣告,比如sqllite等tbd結尾的
s.libraries = 'resolv'
#這裡宣告的存放原始檔的地址,就是我們實際寫的程式碼
s.source_files = 'PPSPrivateStaticLibrary/Classes/**/*'
#這裡可以用來存放你的資原始檔,圖片,證照等等
# s.resource_bundles = {
# 'PPSPrivateStaticLibrary' => ['PPSPrivateStaticLibrary/Assets/*.png']
# }
#這裡宣告你需要公開的檔案, 有幾種宣告方式,萬用字元也支援的,在這裡我可以使用萬用字元PPSPrivateStaticLibrary/Classes/Public/*.h
s.public_header_files = 'PPSPrivateStaticLibrary/Classes/Public/*.h'
#也可以一個一個寫出來[]
#s.public_header_files = ['PPSPrivateStaticLibrary/Classes/Public/PPSPublic1.h',
# 'PPSPrivateStaticLibrary/Classes/Public/PPSPublic2.h']
#這裡可以宣告你的靜態庫依賴的其他靜態庫
# s.dependency 'AFNetworking', '~> 2.3'
end複製程式碼
上面的都寫好了,接下來,我們測試一下,首先進入到剛才目錄中建立的example資料夾install一下工程
然後,我們就可以在例子中引入兩個公開的檔案
#import "PPSAppDelegate.h"
#import <PPSPrivateStaticLibrary/PPSPublic1.h>
#import <PPSPrivateStaticLibrary/PPSPublic2.h>
@implementation PPSAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
PPSPublic1 *p1 = [[PPSPublic1 alloc] init];
[p1 public1];
PPSPublic2 *p2 = [[PPSPublic2 alloc] init];
[p2 public2];
return YES;
}複製程式碼
能夠正常呼叫,我們的例子程式已經能夠正常呼叫SDK,然後我們還需要檢查一下我們的pod庫是否符合pod規則,也是通過命令列來檢測,進入到我們的工程目錄,使用命令:
pod lib lint複製程式碼
可能會遇到這個問題
[!] The validator for Swift projects uses Swift 3.0 by default, if you are using a different version of swift you can use a `.swift-version` file to set the version for your Pod. For example to use Swift 2.3, run:
`echo "2.3" > .swift-version`.
You can use the `--no-clean` option to inspect any issue.複製程式碼
因為我之前已經全域性設定過了,所以這次沒遇到這個問題,如果遇到了這個問題,在命令列執行以下
echo "3.0" > .swift-version複製程式碼
就可以解決了
其中可能還會遇到其他問題,這個就要具體情況具體分析了
驗證我們通過了,接下來,就需要打包了,pod可以打成兩種形式的包,一種framework,還有一種是.a的library,這裡我使用的是framework
也是通過命令列來執行
pod package PPSPrivateStaticLibrary.podspec --force複製程式碼
這裡,遇到了問題,因為我們還未將原始碼提交到git本地倉庫,tag也未打,所以報錯了
git add .
git commit -a -m '0.1.0'
git tag -a 0.1.0 -m '0.1.0'複製程式碼
再次執行
已經成功執行了
我們到工程目錄下去找
好了已經有了我們想要的framework,如果不放心framework是否支援所有的架構,我們可以檢測一下
lipo -info複製程式碼
注意這裡不是將framework資料夾拿來檢查,而是資料夾下面的二進位制檔案
可以看到,包含了所有的架構
上傳到私有倉庫
在我們生成的資料夾中,我們需要用到的兩個檔案,一個是framework,還有一個就是PPSPrivateStaticLibrary.podspec檔案
在上傳之前,我們還需要修改一下podspec檔案其中的一個地方
//將 s.source修改成我們的私有倉庫的地址
s.source = { :git => 'https://github.com/yangqian111/PPSPrivateStaticLibrary.git', :tag => s.version.to_s}
//將s.ios.vendored_framework前的ios資料夾去掉
s.ios.vendored_framework = 'PPSPrivateStaticLibrary.framework'複製程式碼
然後將framework和PPSPrivateStaticLibrary全部上傳到我們的私有倉庫
接下來我們就可以整合我們的pod庫了
新建一個工程,在Podfile中
workspace ‘Test.xcworkspace'
project ‘Test.xcodeproj'
platform :ios, '8.0'
target 'Test' do
pod 'PPSPrivateStaticLibrary',:git=>'https://github.com/yangqian111/PPSPrivateStaticLibrary.git'
end複製程式碼
其中地址,寫我們的私有倉庫地址
這樣就能順利整合
#import <PPSPrivateStaticLibrary/PPSPublic1.h>
#import <PPSPrivateStaticLibrary/PPSPublic2.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
PPSPublic1 *p1 = [[PPSPublic1 alloc] init];
[p1 public1];
PPSPublic2 *p2 = [[PPSPublic2 alloc] init];
[p2 public2];
return YES;
}複製程式碼
這隻能算是一個初步整合,還有很多能做,比如我還想要整合其他的第三方公開庫,或者我還要整合其他的第三方私有庫,這些,我在後面如果會用到,都會分享出來
原始碼這些我都放在了github上
歡迎關注微博:ppsheep_Qian
歡迎關注公眾號