swift:利用cocoapods的subspec, 優(yōu)雅包裝微信支付與支付寶等支付方式

最近我公司有個(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è) "喜歡"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容