在企業(yè)開(kāi)發(fā)中蚜点,一些核心技術(shù)或者常用框架荆虱,出于安全性和穩(wěn)定性的考慮,不想被外界知道纸颜,所以會(huì)把核心代碼打包成靜態(tài)庫(kù)兽泣,只暴露頭文件給程序員使用(比如:支付寶的支付sdk以及WeChat sdk)
我們知道集成第三方支付需要做相對(duì)多的配置,當(dāng)一個(gè)項(xiàng)目集成之后胁孙,在另外一個(gè)項(xiàng)目再集成有需要做很多的配置唠倦,此時(shí)我們可以把第三方支付統(tǒng)一配置成靜態(tài)庫(kù)的包,然后在不同的項(xiàng)目中實(shí)現(xiàn)快速導(dǎo)入和集成浊洞,本篇重點(diǎn)介紹在微信支付以及支付寶支付的快速集成牵敷。
簡(jiǎn)介
談到靜態(tài)庫(kù),不得不說(shuō)動(dòng)態(tài)庫(kù)法希,以及他們兩個(gè)的區(qū)別
- 存在形式
- 靜態(tài)庫(kù):.a 和 .framework
- 動(dòng)態(tài)庫(kù):.dylib 和 .framework
- 區(qū)別
- 靜態(tài)庫(kù):鏈接時(shí),靜態(tài)庫(kù)會(huì)被完整地復(fù)制到可執(zhí)行文件中靶瘸,被多次使用就有多份冗余拷貝
- 動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制苫亦,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用怨咪,系統(tǒng)只加載一次屋剑,多個(gè)程序共用,節(jié)省內(nèi)存
這里我們選擇采用.a的方式進(jìn)行封裝[其實(shí)試過(guò)Framework貌似不太好用??]
制作靜態(tài)庫(kù)
-
新建項(xiàng)目诗眨,選擇 Cocoa Touch Static Library
step1 - 選擇項(xiàng)目名稱 "MyPingXX"
-
我們把包含支付寶sdk和微信sdk以及自我封裝的文件拷貝至靜態(tài)庫(kù)項(xiàng)目中
step3
Demo中對(duì)支付寶支付和微信支付進(jìn)行的簡(jiǎn)單的API暴露唉匾,此時(shí)項(xiàng)目目錄結(jié)構(gòu)是這樣子的
- 在 MyPingXX 類(lèi)里面加入相關(guān)代碼:
MyPingXX.h
@interface MyPingXX : NSObject
- (instancetype)initMyPingXXWithAlikey:(NSString*)key1 weChatKey:(NSString*)key2;
- (void)goPay;
@end
MyPingXX.m
#import "MyPingXX.h"
#import "MyAliPay.h"
#import "MyWeChatPay.h"
@interface MyPingXX ()
@property (nonatomic,strong) MyAliPay *aliPay;
@property (nonatomic,strong) MyWeChatPay *wechatPay;
@end
@implementation MyPingXX
- (instancetype)initMyPingXXWithAlikey:(NSString*)key1 weChatKey:(NSString*)key2
{
self = [super init];
if (self) {
self.aliPay = [[MyAliPay alloc] initAliPayWithAppkey:key1];
self.wechatPay = [[MyWeChatPay alloc] initWeChatPayWithAppkey:key2];
}
return self;
}
- (void)goPay
{
NSLog(@"趕緊支付去??");
}
@end
-
此時(shí) Build 項(xiàng)目,已經(jīng)成功匠楚,說(shuō)明已經(jīng)集成完畢巍膘。我們看下此時(shí)的 Build Phases目錄下的結(jié)構(gòu)
phases
- 1部分:為代碼的.m文件,一般不用處理
- 2部分:為依賴庫(kù)文件:此時(shí)我們需要把
libWeChatSDK.a
文件刪除芋簿! - 3部分:為對(duì)外展示的頭文件打包的時(shí)候會(huì)在 include 文件夾里展示峡懈,可以點(diǎn)擊左下角增加其他的頭文件
這里重點(diǎn)介紹下為什么要?jiǎng)h除 libWeChatSDK.a這個(gè)類(lèi),因?yàn)殪o態(tài)庫(kù)中引用靜態(tài)庫(kù)与斤,打包的時(shí)候就是包含該靜態(tài)庫(kù)肪康,但是導(dǎo)入到真正的項(xiàng)目就會(huì)存在重復(fù)導(dǎo)入的情況,故一定要移除撩穿。
- 開(kāi)始打包[可以選擇Scheme的Debug模式和Release模式磷支,分別會(huì)打出對(duì)應(yīng)的包],這里我們打出用于模擬器和真機(jī)通用的包
- 切換至模擬器狀態(tài)進(jìn)行Build程序
- 切換至 Generic iOS Device 進(jìn)行Build程序
- 進(jìn)入DerivedData 文件夾下 找到項(xiàng)目文件夾 cd /Users/用戶名/Library/Developer/Xcode/DerivedData/MyPingXX-borelbgfhilpdgfheqvpixwosrmw/Build/Products
- 可以看到該目錄下有兩個(gè)文件夾 Debug-iphonesimulator 和 Debug-iphoneos食寡,分別代表模擬器和真機(jī)的Debug庫(kù)文件雾狈。合并兩者
lipo -create Debug-iphoneos/libMyPingXX.a Debug-iphonesimulator/libMyPingXX.a -output libMyPingXX.a
至此靜態(tài)庫(kù)的打包已經(jīng)完成,目前打包的成果為:libMyPingXX.a 和MyPingXX.h 分別是包文件和庫(kù)文件
此時(shí)加上微信支付的靜態(tài)庫(kù)和阿里支付的靜態(tài)庫(kù)就構(gòu)成了我們自己的pingxx庫(kù)冻河,導(dǎo)入到demo工程里面看下目錄結(jié)構(gòu):
補(bǔ)充
- 集成了自制庫(kù)之后箍邮,也需要添加支付寶/微信等所需要的依賴的系統(tǒng)庫(kù)茉帅,微信支付需要注意, 添加 Other Linker Flags:在 Build Settings 搜索 Other Linker Flags 锭弊,添加
-ObjC
堪澎。 - 如果需要集成一些資源文件,比如說(shuō)圖片味滞,txt等之類(lèi)的文件樱蛤,可以制作成bundle,和自制的庫(kù)一塊打包進(jìn)demo工程剑鞍,但是引用的地方需要修改一下:
//bundle前 UIImage * titleImage = [UIImage imageNamed:@"mytitle"]; //bundle后 UIImage * titleImage = [UIImage imageNamed:@"MyPingXX.bundle/mytitle"]; //bundle前 NSString * resourcePath = [[NSBundle mainBundle] pathForResource:@"nameList" ofType:@"pdf"]; //bundle后 NSString * bundlePath = [[ NSBundle mainBundle] pathForResource: @"MyPingXX" ofType :@"bundle"]; NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath]; NSString * resourcePath = [[NSBundle bundleWithPath:bundlePath] pathForResource:@"nameList" ofType:@"pdf"];
最后附上demo地址:https://github.com/albertjson/MyPingXX