
坦白來說我們所使用的任何一個功能在github等一些開源網(wǎng)站上都能找到示例代碼或相關開源庫,我個人認為在使用一個開源代碼加入到自己的工程之前應該慎重:
- 有些開源項目的由于各種原因最終作者不再維護,出現(xiàn)bug了我們只能自己維護或者尋找新的替代庫;
- 我們的需求和開源庫有區(qū)別,即使使用了開源代碼也需要在其基礎上再次修改;
- iOS 系統(tǒng)升級后,一些開源庫的作者不能及時發(fā)布新的兼容版本,可能會導致出現(xiàn)兼容問題;
- 考慮到工程包的問題,雖然蘋果已將非Wi-Fi下載APP的大小升至150M,但在工程中大量引入第三方庫,必然也會導致APP包比預期要大;
在工程中部分功能,如LoadingView,網(wǎng)絡請求,JSON轉Model等,雖然有很多開源庫,但我還是建議盡量使用系統(tǒng)的方法,或者封裝一個組件并將其開源。這樣既可以避免上面的幾個問題,同時如果開發(fā)新項目了也可以更方便的集成到新項目中。
一般來說,構建一個開源庫應該做以下幾步操作:
- 編寫開源代碼
- 測試和修改
- 發(fā)布到開源平臺,如Github等
- 后期維護,包括及時升級,修改bug,處理Issues和Pull requests等
1、創(chuàng)建工程編寫代碼
1、登錄GitHub,新建一個倉庫,命名為RPBannerView-Swift,此處我選的是MIT開源協(xié)議。

2、在本地新建一個RPBannerView-Swift文件夾,并將剛創(chuàng)建的代碼clone到該文件中

3、在該文件夾中新建一個工程,命名為RPBannerView-Swift,完成后上傳代碼到GitHub上。
cd Desktop/RPBannerView-Swift/
git clone https://github.com/dengfeng520/RPBannerView-Swift.git
git add ./
git commit -a -m "上傳代碼"
git push origin master
git ll // 查看上傳記錄
4、iOS 版本兼容

打開RPBannerView-Swift工程,修改最低支持版本為iOS 11,此時build工程,會報錯。在AppDelegate和SceneDelegate做兼容處理即可。
- in AppDelegate.swift
@available(iOS 13.0, *)
extension AppDelegate {
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}
- in SceneDelegate.Swift
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
}
2、發(fā)布到Carthage
- 1、新建framework
編譯工程成功后新建一個framework,命名為RPBannerView,
- 2、完成后修改
RPBannerView.framework的最低版本為iOS 11,
選中新建的RPBannerView.framework --> Build Settings --> iOS deployment Target --> iOS 11
-
3、添加
RPBannerView.framework要編譯的文件,選中
RPBannerView.framework-->Build Phases
把需要編譯的文件導入即可。
- 4、新建Xcode schemes
選擇 Manager Schemes --> 勾選shared
- 5、編譯FrameWork
切換到RPBannerView.framework,此處要注意,不要選擇模擬器!!
在Terminal中cd到工程文件,執(zhí)行build命令,
cd Desktop/RPBannerView-Swift/
carthage build --no-skip-current
一般情況下第一次build可能會報錯,目前不知道是什么原因造成的。
Skipped building RPBannerView-Swift due to the error: Dependency "RPBannerView-Swift" has no shared framework schemes
解決報錯方法:打開Manage Schemes,取消勾選RPBannerView,點擊Close,然后再次打開重新勾選即可。
重新build成功。
Building scheme "RPBannerView" in RPBannerView-Swift.xcodeproj
編譯成功后打開工程文件可以看到多了一個Carthage文件,逐步點開:Carthage --> Build --> iOS --> RPBannerView.framework是編譯成功后的文件。
- 6、上傳
RPBannerView-FrameWork到GitHub
編譯成功后需要把代碼上傳到GitHub并開源才可以讓其他人通過Carthage來使用這個開源庫。
cd Desktop/RPBannerView-Swift/
git add ./
git commit -a -m "update code"
git push origin master
- 7、創(chuàng)建tag
在上傳到GitHub后需要創(chuàng)建一個tag,以此來確定這個庫的版本。
cd Desktop/RPBannerView-Swift/
git tag 1.0
git push --tags
- 8、驗證是否成功
新建一個工程,命名為RPBannerViewDemo,在Cartfile文件中導入上傳的庫,然后更新carthage,如果成功說明
cd RPBannerViewDemo
touch Cartfile
Vim Cartfile
github "dengfeng520/RPBannerView-Swift"
Esc -> :wq
carthage update --platform iOS --no-use-binaries
--platform iOS是指定平臺默認是全平臺架構的,--no-use-binaries是不用預編譯的二進制,用源碼重新編譯二進制,如果不指定,網(wǎng)絡不好的情況下會報錯。
如果工程中已經(jīng)使用了Carthage,只需要更新RPBannerView-Swift即可。
carthage update RPBannerView-Swift --platform iOS
更新完成后,打開工程,選擇TARGETS -->Build Phases--> Link Binary With Libries 點擊加號,選擇 Add File --> Carthage --> Build --> iOS 添加RPBannerView.FrameWork.
/usr/local/bin/Carthage copy-frameworks
接下來,點擊+,選擇New Run Script Phase,此時新建了Run Script,在執(zhí)行命令中添加:
$(SRCROOT)/Carthage/Build/iOS/RPBannerView.framework
然后就可以在工程中愉快的使用自己的開源庫了。
import RPBannerView
RPBanner.showBanner(BannerDisplay(title: "test loading..." ,backColor: UIColor.red, addView: view))
3、發(fā)布到CocoaPods
- 1、創(chuàng)建RPBannerView-Swift.podspec
cd Desktop/RPBannerView-Swift/
pod spec create RPBannerView-Swift
vim RPBannerView-Swift.podspec
- 2、編輯RPBannerView-Swift.podspec
Pod::Spec.new do |spec|
spec.name = "RPBannerView-Swift"
spec.version = "1.0"
spec.summary = "A short description of RPBannerView."
spec.description = "RPBannerView-Swift"
spec.homepage = "https://github.com/dengfeng520/RPBannerView-Swift"
spec.license = { :type => "MIT", :file => "LICENSE" }
spec.author = { "dengfeng520" => "deng_feng520@163.com" }
spec.platform = :ios
spec.ios.deployment_target = "11.0"
spec.source = { :git => "https://github.com/dengfeng520/RPBannerView-Swift", :tag => "#{spec.version}" }
spec.source_files = "RPBannerView-Swift/RPBannerView/*.swift"
spec.framework = "Foundation", "UIKit"
end
- 3、保存podspec文件,然后驗證
pod spec lint RPBannerView-Swift.podspec --allow-warnings
驗證成功提交到CocoaPods/Specs代碼庫中,讓其他人也可以通過pod install命令安裝開源庫。
驗證成功提示:
RPBannerView-Swift.podspec passed validation.
如果沒有注冊CocoaPods帳號,可以通過以下命令注冊CocoaPods帳號,
pod trunk register deng_feng520@163.com 'dengfeng520' --description='dengfeng520'
查看CocoaPods帳號信息:
pod trunk me
- 4、發(fā)布到CocoaPods
如果已經(jīng)注冊了,直接發(fā)布到CocoaPods服務器:
pod trunk push RPBannerView-Swift.podspec --allow-warnings
發(fā)布成功后更新CocoaPods本地庫:
pod setup
然后搜索
pod search RPBannerView-Swift
- 5、在項目中驗證是否可以使用
cd RPBannerViewDemo
pod init
Vim Podfile
pod 'RPBannerView-Swift', :git => 'https://github.com/dengfeng520/RPBannerView-Swift'
Esc -> :wq
pod install
pod 下載成功后,即可在項目中使用這個庫。
4、編寫README.md文件
如圖所示一般一個開源的README.md由三部分組成:

- (1)、頂部的Banner
此處借鑒其他開源項目添加一張Logo圖片和項目名稱就可以,讓圖片和文字全部居中即可。
<div align=center>
<img src="https://github.com/dengfeng520/RPBannerView-Swift/blob/master/Banner.png?raw=true" width = 314 height = 200/>
</div>
<h2 align="center">RPBannerView</h2>
-
(2)、 添加的Badge
- 關于這個庫的一些標簽
- 代碼測試覆蓋率
標簽的設置可參考博客: GitHub 項目徽章的添加和設置
代碼覆蓋率是一個開源項目代碼質(zhì)量的重要指標,對于同樣功能的開源代碼人們一般會優(yōu)先選擇覆蓋率高的代碼。此處推薦使用 codecov的在線服務生成代碼測試的覆蓋率的Badge。
- (3)、項目說明
對于說明部分,應該解決的問題讓別人在最短的時間內(nèi)選擇你的使用你的代碼,一般來說首先要快速的解決開發(fā)者的疑惑。
這是什么樣的庫?相對其他同類庫有哪些優(yōu)點?如何快速上手?
在后面我們也可以加上一些其他內(nèi)容,如版本發(fā)布歷史,項目改善計劃,詳細使用攻略等。
5、后期的維護
把自己的代碼發(fā)布到Github上之后,我們還應該經(jīng)常維護,如及時修改bug,版本更新,經(jīng)常關注Issues和Pull requests,解決未發(fā)現(xiàn)的問題和bug等。
