场景描述:公司使用聚合SDK(动态库.framework)内置自己的账户系统、角色系统、支付系统,提供给研发对接拿到ipa包,然后在不需要重新和研发对接前提下(先是我们自己聚合SDK初始化,自己初始化成功后再外部SDK初始化),接入外部第三方SDK(可动态库也可静态库),我们的聚合SDK一个对应调试demo,没有add外部SDK到target情况下,自己的初始化返回正常,add外部SDK到target后调试自己初始化返回签名错误?
What?仅仅添加外部SDK到工程咋还会影响自己接口请求参数?
然后我就对着找问题,我确信SDK没有问题,hook也研究了(以为是hook调用了字符转转码方法),然后和后台大佬核对请求参数,结果对比发现签名参数中有个字段(那个字段值是中文),没有add情况下后台拿到的数据那个字段能够正常解析,add情况下不能够解析
对比分析结果是:编码格式问题。add外部sdk后影响了那个中文字段编码方式,然后就找啊找,找到字符转进行转码的一个方法,NSString的分类中一方法,将其改名解决了问题
总结:我们的SDK中创建的NSString的分类扩展的字符串转码方法名和外部渠道SDK中NSString的分类扩展的字符串转码方法名同名了;add外部SDK到target中后,把我们SDK中分类转码那个方法给覆盖了,程序执行的时候执行到他们SDK字符串分类转码方法了,而他们转码方式和我们方式不一致,导致结果上传的参数有问题
objc的方法是一个链表,对于分类添加了同一个方法,谁的方法在前面,就执行谁的。
网友评论