最近我公司有個(gè)需求, 希望寫一個(gè)公司的SDK , 里面要包含微信支付/支付寶/蘋果支付等方式.最好利用cocoapods 的方式輕松集成. 比如最終使用:
pod 'SDK名稱/alipay', ~> '0.0.1'
pod 'SDK名稱/wechat', ~> '0.0.1'
pod 'SDK名稱/other', ~> '0.0.1'
這樣就可以集成了想要的支付功能, 如果兩者都有, 就可以包含兩者功能.
分析
- 首先我們要知道,如果想要利用cocoapods的subspec功能,一般需要寫一個(gè)core,pod.default_subspec = 'Core',其他的subspec再依懶core.
- 如果要做到這樣的方式,需要分開控制,core/alipay/wechat/applePay...所有的支付方式都由core 發(fā)出,定義支付delegate,delegate實(shí)現(xiàn)相應(yīng)的支付方法支付.
- 這樣的形式,就可能做到利用subspec集成的方式調(diào)起相應(yīng)的支付,而如果不用支付功能,只需要集成core,那我們把default_subspec = 'Core',所以只需要Pod SDK名稱 或者 pod 'SDK名稱/Core', ~> '0.0.1' ,就可以.
遇到的難題
- 我公司要求用swift寫,swift 中怎么調(diào)用OC寫的alipay/wechatPay?
最后我采用的方法是: 將swift 與alipay打包成動(dòng)態(tài)framework,因?yàn)槲覝y(cè)試過, swift 打包成動(dòng)態(tài)庫(kù)code中用到的資源才能正確加載.而在iOS8之后, 蘋果是允許我們打包動(dòng)態(tài)庫(kù)了.而打包的動(dòng)態(tài)庫(kù)中,swift是可以調(diào)用到OC的方法,而又不用寫在橋接文件中,如果想了解這一部的朋友請(qǐng)看我的另一篇文章:關(guān)于打包 swift 與OC 兼容的framework , 主要 swift 語(yǔ)言主導(dǎo)
- 如果都打包成framework,swift中是怎么在一個(gè)framework中創(chuàng)建另一個(gè)framework中的類.
導(dǎo)入是不現(xiàn)實(shí)了, 因?yàn)樵赾ore中不能依懶subspec中的framework,只能subspec依懶core.我們又不確定人家是否集成了subspec
最后我利用的是swift的: NSClassFromString(),拿到framework中的類對(duì)象.但這樣寫還不太能正確的拿framework中的類.
怎么拿到framework中的類
- 在swift中是可以利用NSClassFromString方法,但傳入的參數(shù)是: framework名+類名的情況, 還有一個(gè)條件,framework中的類必須實(shí)現(xiàn)public required override init(){}方法.
/// core中的方法,設(shè)置支付的Delegate
var wechat = WechatPayService();
if let delegate = NSClassFromString(ORDER_PLACE_WECHATPAY_SDK + "WechatExecutor") as? NSObject.Type {
wechat = WechatPayService(delegate.init() as? WeChatPayDelegate)
}
/// WechatExecutor class
public class WechatExecutor: NSObject {
public required override init() {
super.init()
}
}
// 當(dāng)然如果是繼承UIViewController , 可以不用實(shí)現(xiàn) public required override init(){}方法.
if let delegate = NSClassFromString(ORDER_PLACE_WECHATPAY_SDK + "WechatExecutor") as? UIViewController.Type {
wechat = WechatPayService(delegate.init() as? WeChatPayDelegate)
}
class WechatExecutor: UIViewController {
}
- 以上的寫法,可以優(yōu)雅解決不用導(dǎo)入framework,就可以獲取到framework中的類的方法.
最后
- 因?yàn)楣疽蟠a不公開,所以不能上傳相關(guān)的code,也有此需求的朋友可以留言討論.
- 如果想看cocoapods怎么寫subspec,請(qǐng)看我的另一篇文章:關(guān)于 cocoapods 制作 Podspec 及使用
- 我的podspec主要部分.
s.default_subspec = 'Core'
s.subspec "Core" do |core|
core.ios.vendored_frameworks = 'Classess/frameworks/xxxxx.framework'
end
s.subspec "Alipay" do |ali|
ali.resources = ['Classess/Assets/AlipaySDK.bundle']
ali.ios.vendored_frameworks = 'Classess/frameworks/AlipaySDK.framework', 'Classess/frameworks/OrderPlaceAlipaySDK.framework'
ali.frameworks = 'SystemConfiguration', 'CoreTelephony', 'QuartzCore', 'CoreText', 'CoreGraphics', 'CFNetwork', 'CoreMotion'
ali.libraries = 'z', 'c++'
ali.dependency '你的pod名/Core'
end
s.subspec "Wechat" do |wechat|
wechat.ios.vendored_frameworks = 'Classess/frameworks/OrderPlaceWechatPaySDK.framework'
wechat.ios.vendored_library = 'Classess/frameworks/libWeChatSDK.a'
wechat.frameworks = 'SystemConfiguration', 'Security', 'CoreTelephony', 'CFNetwork'
wechat.libraries = 'z', 'c++', 'sqlite3.0'
wechat.dependency '你的pod名/Core'
end
- 最后還有一個(gè)小小的問題, 如果是swift打包的動(dòng)態(tài)庫(kù),那可能需要打包兩份,uat/prd,pod也需要兩個(gè),這是因?yàn)榘M機(jī)架構(gòu)的動(dòng)態(tài)庫(kù)不能上傳app store.
- uat:支持模擬機(jī)/真機(jī).
- prd: 只支持真機(jī).
-- 如果對(duì)你有幫助的話, 請(qǐng)留個(gè) "喜歡"