iOS静态库开发中引入的第三方库可能与宿主APP中冲突的解决方案

本文介绍了在iOS SDK开发中,如何处理静态库引入的第三方库与宿主APP中相同库冲突的问题。通过创建宏定义文件重命名冲突符号,利用nm命令分析库文件,以及编写Python脚本来自动化处理,有效避免手动修改源码的低效和错误。文章提供了详细步骤和解决方案。
摘要由CSDN通过智能技术生成

SDK开发中我们可能希望使用已有的第三方开源库,比如在发送请求的功能上我们更希望用AFNetworking而非直接使用NSURLSession,又如在实现socket连接时我们更希望用SocketRocket而非自己从零实现。但如果我们直接把AFNetworking的源文件拖到静态库SDK里,而宿主APP也引入了AFNetworking,这时运行代码就会报符号冲突(duplicate symbols)的错误。

符号冲突报错

这时大部分人的解决方案都是手动修改引入到SDK里的开源库代码,包括类名、分类名、全局常量名、协议名等会导致冲突的符号。其实对于像AFNetworking(v3.2.1)这种源码量较少的第三方库来说,需要修改的地方都要多达47个,可想而知这是一项多么低效和易错的解决方案,而且如果下次需要升级SDK中的该第三方库,你需要再重新手动改一遍……下边我们来一步步深入解决这件麻烦事。
首先我们考虑下怎样避免每次都要修改第三方库源码,如果有一个单独的文件来存原符号和重命名符号的对应关系就好了,我们自然而然地会想到用宏定义。创建一个头文件,比如叫XNGNamespace.h

// XNGNamespace.h

#define AFURLSessionManager XNGURLSessionManager
#define AFNetworkingReachabilityDidChangeNotification XNGNetworkingReachabilityDidChangeNotification
#define AFImageResponseSerializer XNGImageResponseSerializer
...

然后在你的SDK工程中,如果你已经有一个预编译头文件(一般为xxx.pch),在最上一行引入XNGNamespace.h,否则在Build Settings -> Prefix Header配置该文件的路径(即把这个文件作为预编译头文件)。这时你可以在Xcode中看到原本的比如AFURLSessionManager类名颜色变成和宏一样的颜色,准确地说,这个类现在其实叫XNGURLSessionManager了。

类名颜色

现在有了这个文件后,即使要升级SDK中的第三方库,我们也只需要在这个文件里做少量增删了。
但到目前为止最麻烦的这部分事还没解决,毕竟现在还是要靠肉眼找出那些符号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值