SDK与项目使用同样的三方依赖库如何解决符号冲突问题

  1. 使用公共依赖,项目和SDK都依赖同一个库,这样就需要沟通和协调,一旦需要升级改动,也许会牵一发而动全身,就是都得跟着改的意思
  2. 各自维护,谁挖的坑谁填,这样的好处就不会相互牵连,职责相对明确清晰,坏处就是少了复用性,增加冗余

具体实施:

  1. 做成公共组件,由项目宿主(壳工程)依赖,各SDK能够读取到符号即可
  2. sdk全局修改库的类前缀,方法名前缀,方法函数限定作用域范围

以下是一个案例

SDK里依赖其他三方库的一种解法,通过全局宏定义替换类名符号,不过这个只针对OC库(因为是宏定义),如果是.a静态库似乎并不管用,不用手动全局替换类名,这样似乎也是解决依赖冲突的一种思路,更粗暴的方式是直接改库的类名和方法名,c函数加static等, 宏替换这种思路比较灵活,无需改变调用代码,相对来说对原代码改动小点

// 原理是 ## 前后拼接字符串的宏魔法
// Namespaced Header
#ifndef __NS_SYMBOL
// We need to have multiple levels of macros here so that __NAMESPACE_PREFIX_ is
// properly replaced by the time we concatenate the namespace prefix.
#define __NS_REWRITE(ns, symbol) ns ## _ ## symbol
#define __NS_BRIDGE(ns, symbol) __NS_REWRITE(ns, symbol)
#define __NS_SYMBOL(symbol) __NS_BRIDGE(APMSDK, symbol)
#endif

//比如存在这样一个类 可能接入方也有这个类 SDK的话只能加前缀或者提出来作为公共依赖
// 这里就是`PPDNSMappingManager`这个类 在这个sdk里 加了`APMSDK`这个类前缀也就是所谓的命名空间,这样处理之后,尽管是同一个库,编译的时候也不会出现符号冲突报错了
// 实际上的类名应该被修改为: APMSDK_PPDNSMappingManager 但是并不影响使用 调用的时候仍然使用`PPDNSMappingManager`去调用 只是代码颜色变成了宏定义的摸样

// Classes 
#ifndef PPDNSMappingManager
#define PPDNSMappingManager __NS_SYMBOL(PPDNSMappingManager)
#endif

本质是替换符号,Category也是替换括号内的那个名字, 本类是系统类肯定不能改的

比如 #import "NSMutableAttributedString+MutableAttributedStringHook.h"

#ifndef MutableAttributedStringHook
#define MutableAttributedStringHook __NS_SYMBOL(MutableAttributedStringHook)
#endif

//其中`MutableAttributedStringHook`是宏定义字符串,实际上是加上`APMSDK_`前缀了
@implementation NSMutableAttributedString (MutableAttributedStringHook)

posted @ 2024-12-16 21:00  CoderWGB  阅读(5)  评论(0编辑  收藏  举报