美文网首页iOS Developer
静态库的制作—仿写pingxx之路

静态库的制作—仿写pingxx之路

作者: 天清水蓝 | 来源:发表于2016-11-18 13:15 被阅读73次

    在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成静态库,只暴露头文件给程序员使用(比如:支付宝的支付sdk以及WeChat sdk)

    我们知道集成第三方支付需要做相对多的配置,当一个项目集成之后,在另外一个项目再集成有需要做很多的配置,此时我们可以把第三方支付统一配置成静态库的包,然后在不同的项目中实现快速导入和集成,本篇重点介绍在微信支付以及支付宝支付的快速集成。

    简介

    谈到静态库,不得不说动态库,以及他们两个的区别

    1. 存在形式
    • 静态库:.a 和 .framework
    • 动态库:.dylib 和 .framework
    1. 区别
    • 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
    • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

    这里我们选择采用.a的方式进行封装[其实试过Framework貌似不太好用😂]

    制作静态库

    1. 新建项目,选择 Cocoa Touch Static Library


      step1
    2. 选择项目名称 "MyPingXX"
    3. 我们把包含支付宝sdk和微信sdk以及自我封装的文件拷贝至静态库项目中


      step3

    Demo中对支付宝支付和微信支付进行的简单的API暴露,此时项目目录结构是这样子的

    展示结构目录
    1. 在 MyPingXX 类里面加入相关代码:
    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
    
    1. 此时 Build 项目,已经成功,说明已经集成完毕。我们看下此时的 Build Phases目录下的结构


      phases
    • 1部分:为代码的.m文件,一般不用处理
    • 2部分:为依赖库文件:此时我们需要把 libWeChatSDK.a 文件删除!
    • 3部分:为对外展示的头文件打包的时候会在 include 文件夹里展示,可以点击左下角增加其他的头文件

    这里重点介绍下为什么要删除 libWeChatSDK.a这个类,因为静态库中引用静态库,打包的时候就是包含该静态库,但是导入到真正的项目就会存在重复导入的情况,故一定要移除。

    1. 开始打包[可以选择Scheme的Debug模式和Release模式,分别会打出对应的包],这里我们打出用于模拟器和真机通用的包
      • 切换至模拟器状态进行Build程序
      • 切换至 Generic iOS Device 进行Build程序
    2. 进入DerivedData 文件夹下 找到项目文件夹 cd /Users/用户名/Library/Developer/Xcode/DerivedData/MyPingXX-borelbgfhilpdgfheqvpixwosrmw/Build/Products
    3. 可以看到该目录下有两个文件夹 Debug-iphonesimulator 和 Debug-iphoneos,分别代表模拟器和真机的Debug库文件。合并两者 lipo -create Debug-iphoneos/libMyPingXX.a Debug-iphonesimulator/libMyPingXX.a -output libMyPingXX.a

    至此静态库的打包已经完成,目前打包的成果为:libMyPingXX.a 和MyPingXX.h 分别是包文件和库文件
    此时加上微信支付的静态库和阿里支付的静态库就构成了我们自己的pingxx库,导入到demo工程里面看下目录结构:


    demo项目

    补充

    1. 集成了自制库之后,也需要添加支付宝/微信等所需要的依赖的系统库,微信支付需要注意, 添加 Other Linker Flags:在 Build Settings 搜索 Other Linker Flags ,添加 -ObjC
    2. 如果需要集成一些资源文件,比如说图片,txt等之类的文件,可以制作成bundle,和自制的库一块打包进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

    相关文章

      网友评论

        本文标题:静态库的制作—仿写pingxx之路

        本文链接:https://www.haomeiwen.com/subject/ifgjpttx.html