关键词: 原生iOS接入腾讯云-实时音视频-语音聊天室 pod冲突 duplicate symbols 符号冲突 TXSoundtouch.xcframework TXFFmpeg.xcframework.
背景: 最近接手一个社交项目,里面已经做了IM即时通讯,用的是腾讯云,现在新需求是做一个语音聊天室,继续用腾讯云的SDK,按照腾讯的文档做的时候,第一步就卡住了.... 在按照文档添加了TUIVoiceRoom后
pod 'TXAppBasic', :path => "TX/TUIVoiceRoom/TXAppBasic/" # path 为TXAppBasic.podspec相对于Podfile文件的相对路径
pod 'TUIVoiceRoom', :path => "TX/TUIVoiceRoom/", :subspecs => ["TRTC"] # path 为TUIVoiceRoom.podspec相对于Podfile文件的相对路径
pod install,然后报错
[!] The 'Pods-你的项目target' target has frameworks with conflicting names: txsoundtouch.xcframework and txffmpeg.xcframework.
分析处理报错
在搜索引擎上搜报错(无论国内外)大概就是两个结果:
1.同时接入网易云信NIMSDK和NERtGSRK时类似的两个库冲突报错
2.报错相同,也是腾讯云的两个SDK冲突,但是是Flutter版本
个人先尝试参考2的Flutter版本去解决,但是无果.
接着尝试参考1的方法,在Xcode中搜索这两个库
如图:
同理,如果show in Finder,如图:
库确实没有冲突了,不过TUIVoiceRoom还有点问题.解决方法cocopods也写明了两种:
- podfile中增加use_frameworks!
- 在podfile中,在
MJRefresh
,MJExtension
,TUICore
这三个库后面增加,:modular_headers => true
经过实测,对于我手头的这个纯OC项目,方法1会带来衍生问题,方法2修改后pod install正常完成.
然而这一切并没有结束,打开xcode后run项目,继续报错:
这个报错的原因就是duplicate symbols(符号冲突),也就是引入的第三方库有冲突,感觉瞬间回到了问题开头....
经过腾讯云人工技术支持,工单和腾讯云售后服务群工作人员轮番交流和尝试(然而大部分回复都是把文档列出的问题粘给你,并非专门解决)
我在pods文件层级里发现了一个情况:
冲突的是TXLiteAVSDK_Professional和TXLiteAVSDK_TRTC库,他们中都包含TXFFmpeg.xcframework和TXSoundTouch.xcframework,其实他们两本来也都是同一个功能的专业版和简略版.问题是,我在podfile中既没有引用TXLiteAVSDK_Professional也没有引用TXLiteAVSDK_TRTC,那为什么pods中会有这两个库呢?其实是因为,有其他库用到了这两个库.
查看podfile:
- 其中在pod库后增加了
:subspecs => ["Professional"]
就是它引用了TXLiteAVSDK_Professional库. - 而在pod库后增加了
:subspecs => ["TRTC"]
就是它引用了TXLiteAVSDK_TRTC库.
而只有我刚从腾讯文档复制过来TUIVoiceRoom的引入有:subspecs => ["TRTC"]
,也正是这个引入造成了冲突,那么既然TXLiteAVSDK库功能都是相同的,我也可尝试让TUIVoiceRoom去引用Professional库而非文档的TRTC库.
pod 'TUIVoiceRoom', :path => "TX/TUIVoiceRoom/", :subspecs => ["Professional"] # path 为TUIVoiceRoom.podspec相对于Podfile文件的相对路径
pod install成功,run成功,调用TUIVoiceRoom初始化方法
[[TRTCVoiceRoom sharedInstance] login:LIVE_IM_APPID userId:user.id userSig:[GenerateUserSig genTestUserSig:user.id] callback:^(int code, NSString * _Nonnull message) {
if (code == 0) {
NSLog(@"聊天室初始化成功");
}
}];
初始化成功,如图
注意
如果你pods文件夹中TXLiteAVSDK_Professional内如果不含有TXFFmpeg.xcframework和TXSoundTouch.xcframework,那么你run是不成功的,因为少库.所以,你应该在尝试删除冲突库之前,即开始接入的时候,用上面pod语句,而非腾讯云官方文档的pod语句,才会成功.
除此之外
其实打开TUIVoiceRoom.podspec,可以看到他是包含了3个版本的引用,意味着其实你是可以使用Professional或者Enterprise,并非一定用TRTC.个人总结
- 平时写podfile的时候要注意语句的意思,写完看一遍,这次就是不知道
:subspecs => []
的意思,只顾着复制粘贴才卡住自己的.而解决问题同样是因为手闲查了下:subspecs => []
的意思才启发了灵感. -
尽信书则不如无书
,引入库要参照着库文档来做,但是也要有自己的判断,文档给出的是通解,但现实情况往往很负责,这个时候要勇敢的试试不按照文档去做,去试试特解 - 如果引入的库出了问题,去看库本身,去看xxx.podspec文件,多比较前后差异,就有激发处理的灵感.
最后
- 若有错误,恳请斧正。