關(guān)鍵詞: 原生iOS接入騰訊云-實時音視頻-語音聊天室 pod沖突 duplicate symbols 符號沖突 TXSoundtouch.xcframework TXFFmpeg.xcframework.
背景: 最近接手一個社交項目,里面已經(jīng)做了IM即時通訊,用的是騰訊云,現(xiàn)在新需求是做一個語音聊天室,繼續(xù)用騰訊云的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.
分析處理報錯
在搜索引擎上搜報錯(無論國內(nèi)外)大概就是兩個結(jié)果:
1.同時接入網(wǎng)易云信NIMSDK和NERtGSRK時類似的兩個庫沖突報錯
2.報錯相同,也是騰訊云的兩個SDK沖突,但是是Flutter版本
個人先嘗試參考2的Flutter版本去解決,但是無果.
接著嘗試參考1的方法,在Xcode中搜索這兩個庫
如圖:

搜索TXSoundTouch.png

搜索TXFFmpeg.png
同理,如果show in Finder,如圖:

show in Finder.png

并沒有.png
庫確實沒有沖突了,不過TUIVoiceRoom還有點問題.解決方法cocopods也寫明了兩種:
- podfile中增加use_frameworks!
- 在podfile中,在
MJRefresh,MJExtension,TUICore這三個庫后面增加,:modular_headers => true
經(jīng)過實測,對于我手頭的這個純OC項目,方法1會帶來衍生問題,方法2修改后pod install正常完成.
pod install正常.png
然而這一切并沒有結(jié)束,打開xcode后run項目,繼續(xù)報錯:
繼續(xù)報錯.png
這個報錯的原因就是duplicate symbols(符號沖突),也就是引入的第三方庫有沖突,感覺瞬間回到了問題開頭....
經(jīng)過騰訊云人工技術(shù)支持,工單和騰訊云售后服務群工作人員輪番交流和嘗試(然而大部分回復都是把文檔列出的問題粘給你,并非專門解決)
我在pods文件層級里發(fā)現(xiàn)了一個情況:

pods文檔.png
沖突的是TXLiteAVSDK_Professional和TXLiteAVSDK_TRTC庫,他們中都包含TXFFmpeg.xcframework和TXSoundTouch.xcframework,其實他們兩本來也都是同一個功能的專業(yè)版和簡略版.問題是,我在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成功,調(diào)用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(@"聊天室初始化成功");
}
}];
初始化成功,如圖

初始化成功.png
注意
如果你pods文件夾中TXLiteAVSDK_Professional內(nèi)如果不含有TXFFmpeg.xcframework和TXSoundTouch.xcframework,那么你run是不成功的,因為少庫.所以,你應該在嘗試刪除沖突庫之前,即開始接入的時候,用上面pod語句,而非騰訊云官方文檔的pod語句,才會成功.
除此之外
其實打開TUIVoiceRoom.podspec,可以看到他是包含了3個版本的引用,意味著其實你是可以使用Professional或者Enterprise,并非一定用TRTC.
TUIVoiceRoom.podspec.png
個人總結(jié)
- 平時寫podfile的時候要注意語句的意思,寫完看一遍,這次就是不知道
:subspecs => []的意思,只顧著復制粘貼才卡住自己的.而解決問題同樣是因為手閑查了下:subspecs => []的意思才啟發(fā)了靈感. -
盡信書則不如無書,引入庫要參照著庫文檔來做,但是也要有自己的判斷,文檔給出的是通解,但現(xiàn)實情況往往很負責,這個時候要勇敢的試試不按照文檔去做,去試試特解 - 如果引入的庫出了問題,去看庫本身,去看xxx.podspec文件,多比較前后差異,就有激發(fā)處理的靈感.
最后
- 若有錯誤,懇請斧正。

