寫(xiě)在前面
最近換了新公司,又是一個(gè)巨大的挑戰(zhàn)
一是海外項(xiàng)目,二是協(xié)同方库,三是使用Swift
雖說(shuō)Swift4.0已經(jīng)很新了,但ABI的穩(wěn)定進(jìn)程還是放在了5.0障斋,加上之前幾乎沒(méi)怎么用過(guò)Swift做過(guò)什么大型項(xiàng)目纵潦,都是小打小鬧的一些東西。所以本文都是使用的Swift
由于項(xiàng)目還要與國(guó)外的小伙伴合作垃环,一些private的東西公司也不打算直接給他們邀层,這不,就讓我們做成library的形式提供給他們晴裹,對(duì)于我們來(lái)說(shuō)也就是Framework了被济。
很快這個(gè)任務(wù)就落到我頭上了,前期踩坑基本都是參照這篇比較新的文章
手把手教你高效快捷的創(chuàng)建Swift Framework 這篇已經(jīng)幾乎把該用到的內(nèi)容都講了涧团。
我這邊就主要講一講Framework的調(diào)試,包含第三方庫(kù)的集成,目前使用的還是pod经磅,
carthage就暫時(shí)不說(shuō)了泌绣,理論上比pod要更方便使用
準(zhǔn)備工作
新建一個(gè)主工程,新建一個(gè)Framework工程
正常情況下预厌,我們一般會(huì)對(duì)主工程進(jìn)行
pod install
安裝一些主工程需要的第三方庫(kù)阿迈,制作Framework的過(guò)程中發(fā)現(xiàn)有些地方其實(shí)也是需要使用這些第三方,pod已經(jīng)生成了workspace轧叽,這就需要編寫(xiě)Podfile苗沧,增加對(duì)Framework工程target的支持
打開(kāi)主工程的workspace 這時(shí)候我們的工程是這樣的
我們將Framework工程拷貝到主工程文件目錄中
編寫(xiě)Podfile
注意! 下面就要開(kāi)始編寫(xiě)Podfile文件了
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
workspace 'TestMainProject.xcworkspace' #指定workspace
inhibit_all_warnings! #忽略警告
use_frameworks!
def commpod #宏定義幾個(gè)target都要用的的pod
pod 'MJRefresh' #下拉刷新
pod 'Alamofire', '~> 4.0' #網(wǎng)絡(luò)請(qǐng)求
pod 'SnapKit', '~> 4.0.0' #autolayout
pod 'ObjectMapper', '~> 3.1' #json 轉(zhuǎn)模型
pod 'SVProgressHUD', '~> 2.0.3'
pod 'BlocksKit' #將delegate轉(zhuǎn)換為block的庫(kù)
end
target 'TestMainProject' do
project 'TestMainProject'
commpod
pod 'IQKeyboardManagerSwift' #使用iQ鍵盤(pán)
pod 'SDWebImage' #圖片離線緩存類(lèi)
pod 'AWSS3', '~> 2.6.0' #AWSS3上傳下載
pod 'IQActionSheetPickerView', '~>2.0.0' #picker選擇器
end
target 'TestMainSDK' do
project 'TestMainSDK/TestMainSDK'
commpod
end
修改好podfile后直接執(zhí)行pod install
這時(shí)候再打開(kāi)workspace文件就會(huì)看到
至此SDK已經(jīng)加入pods的管理中
測(cè)試
測(cè)試一
下面就來(lái)測(cè)試下
再framework工程中加入測(cè)試代碼
open class TestMainSDK {
//singleton
open static let shared = TestMainSDK()
open static let testParam = 999
open func testFun() {
print("from sdk testFun()")
}
}
先選擇framework的scheme 編譯一下
主工程中 import TestMainSDK
加入測(cè)試代碼
import UIKit
import TestMainSDK
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
TestMainSDK.shared.testFun()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
scheme選擇主工程炭晒,跑一下
大功告成~
測(cè)試二
我們現(xiàn)在要做的是:
- 主程序調(diào)用SDK獲得一個(gè)vc 并 present
- 該vc中有一個(gè)按鈕待逞,點(diǎn)擊事件的具體實(shí)現(xiàn)由主程序?qū)崿F(xiàn)dismiss
在SDK中創(chuàng)建一個(gè)TestViewController
引入SnapKit
BlocksKit
加入如下代碼
import UIKit
import BlocksKit
import SnapKit
public typealias ActionHandle = (_ vc : UIViewController, _ btn: UIButton)->()
open class TestViewController: UIViewController {
var testBtnActionHandel : ActionHandle?
lazy var testBtn : UIButton = {
let btn = UIButton.init()
btn.setTitle("sdkTestBtn", for: .normal)
btn.backgroundColor = UIColor.red
return btn
}()
override open func viewDidLoad() {
super.viewDidLoad()
setupStyle()
// Do any additional setup after loading the view.
}
func setupStyle() {
view.backgroundColor = UIColor.green
view.addSubview(testBtn)
testBtn.snp.makeConstraints{
$0.center.equalToSuperview()
}
testBtn.bk_addEventHandler({ [weak self] (btn) in
print("click sdk testBtn")
guard let `self` = self else { return}
if let handle = self.testBtnActionHandel {
handle(self, btn as! UIButton)
}
}, for: .touchUpInside)
}
}
接下來(lái)在SDK入口加入獲取vc的代碼
open func getSDKviewController(vcHandle: (TestViewController)->(),
actionHandle: ActionHandle?){
let vc = TestViewController()
vc.testBtnActionHandel = actionHandle
vcHandle(vc)
}
編譯一下SDK
在主程序中調(diào)用SDK
override func viewDidLoad() {
super.viewDidLoad()
TestMainSDK.shared.testFun()
let btn = UIButton.init()
btn.backgroundColor = UIColor.black
btn.setTitle("mainBtn", for: .normal)
view.addSubview(btn)
btn.snp.makeConstraints{$0.center.equalToSuperview()}
btn.bk_addEventHandler({ (b) in
TestMainSDK.shared.getSDKviewController(vcHandle: { (vc ) in
self.present(vc, animated: true, completion: nil)
}, actionHandle: { (vc , btn) in
vc.dismiss(animated: true, completion: nil)
})
}, for: .touchUpInside)
}
選擇主程序 跑一下
看下效果
后記
demo已上傳Github
跟盆友一起搞的小博客有興趣的可以看看,此文也會(huì)同步過(guò)去网严,也包含一些服務(wù)器相關(guān)的內(nèi)容识樱,