pod 'PLVLiveScenesSDK', '1.6.0'
- 常見問題
常見問題
1 設定使用者唯一識別碼的意義
使用者唯一識別碼,在多場景專案中稱為 viewerId,有時也稱為 userId(與保利威後台開發設定中的 userId 不同,後台開發設定中的 userId 指的是開發者帳戶 ID,請注意區分)。
使用者暱稱,在多場景專案中稱為 viewerName,有時也稱為 nickName。
數據統計可以帶上使用者唯一識別碼和使用者暱稱,也能用來作為聊天室的登入資訊,建議客戶設定。
設定使用者唯一識別碼,有以下這些優點:
- 有效定位使用者回報的問題。
- 大幅減少與使用者的溝通成本。
- 有效提高 SDK 這邊單方面排查問題的效率。
- 可以歸總某個使用者唯一識別碼的錯誤日誌。
2 在 iOS 9 及以上版本中執行企業版應用程式
在 iOS 9 及之後的版本中,蘋果對企業簽章的應用程式執行時,進行了更嚴格的限制。因此,在 iOS 9 中,企業簽章後的應用程式安裝好之後,是無法直接啟動的。預設情況下,在 iOS 9 中執行一款企業簽章的應用程式時,會彈出這樣的提示:

可以看到,應用程式不再是像之前的版本那樣直接啟動,而是彈出了一個安全提示。此時,如果我們確認要執行的應用程式是安全的,可以按照以下步驟來設定:
在系統中開啟 设置 - 通用 - 描述文件与设备管理(在 iOS 9.2 以後叫做:设备管理),此時,可以看到有一個和剛剛彈出的提示中文字類似的描述檔。然後,點擊對應描述檔進入後,再點擊按鈕 信任,來讓系統允許擁有這個憑證的應用程式執行。
之後,我們就可以回到桌面,重新執行剛才的應用程式,就會發現應用程式可以正常開啟了。
完整的步驟,如下圖所示:

3 CocoaPods 使用指南
CocoaPods 是 Objective-C 的一個依賴管理器,它可以自動化並簡化在專案中使用第三方函式庫的過程。
3.1 安裝 CocoaPods
你可以用 RubyGems 工具包安裝 CocoaPods,安裝指令如下:
$ sudo gem install cocoapods
但有時執行該指令會報錯:
$ ERROR: While executing gem ... (Gem::FilePermissionError) $ You don't have write permissions for the /usr/bin directory.
原因是 "/usr/bin is protected by system integrity protection and is not writeable by anybody even root." 所以要把 CocoaPods 安裝在 /usr/local/bin 路徑下,使用如下指令:
$ sudo gem install -n /usr/local/bin cocoapods
install 加上參數 -n 表示 "Directory where executables are located",參數含義可透過指令 "gem help install" 查詢。
3.2 更新索引
安裝完 CocoaPods 執行 pod setup,將所有專案的 Podspec 檔案更新到本地的 ~/.cocoapods/ 目錄下。
$ pod setup
所有專案的 Podspec 檔案都託管在 https://github.com/CocoaPods/Specs.git 上,CocoaPods 在執行 pod install 和 pod update 時,會預設先更新一次 Podspec 索引。如果更新太慢,可修改 repo 地址為國內的鏡像,如 gitcafe 的鏡像操作指令如下:
$ pod repo remove master $ pod repo add master https://gitcafe.com/akuandev/Specs.git $ pod repo update
也可修改為 oschina 的鏡像 http://git.oschina.net/akuandev/Specs.git。
如果使用者 pod 操作時沒找到我們最近的 SDK 版本,截圖如下:

這種情況就是索引太舊需要更新了,執行指令 pod repo update 即可,或者在 pod install 的時候帶上參數 –-repo-update。
3.3 pod install 和 pod update 的區別
執行 pod install 之後,CocoaPods 會生成一個名為 Podfile.lock 的檔案。Podfile.lock 會鎖定當前各依賴函式庫的版本,之後如果多次執行 pod install 不會更改版本,要 pod update 才會改 Podfile.lock。這樣多人協作的時候,可以防止第三方函式庫升級時造成大家各自的第三方函式庫版本不一致。
pod install 只會按照 Podfile 的要求來請求類別庫,如果類別庫版本號碼有變化,那麼將獲取失敗。但是 pod update 會更新所有的類別庫,獲取最新版本的類別庫。每次更改了 Podfile 檔案,你都需要重新執行一次 pod update 指令。
3.4 查詢 CocoaPods 版本
$ pod --version
3.5 Homebrew & RubyGems
Homebrew 是 Mac 平台的一個套件管理工具,提供了許多 Mac 下沒有的 Linux 工具等。官網:https://brew.sh,官網上有安裝指令:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安裝完 Homebrew,就可以用 Homebrew 的指令 brew 來安裝 RubyGems,指令安裝如下:
$ brew install ruby
RubyGems 官網為 https://rubygems.org。
4 多場景 SDK 與點播 SDK 同時整合步驟說明
4.1 同時整合多場景 SDK 1.6.0 版本與點播 SDK 2.16.3 版本
使用如下陳述式整合時:
pod 'PLVLiveScenesSDK', '1.6.0'
pod 'PolyvVodSDK', '2.16.3'
會出現如下報錯:
The 'XXXXX' target has frameworks with conflicting names: alicloudhttpdns.framework, alicloudutils.framework, and utdid.framework.
解決方案如下:
# pod 'PLVLiveScenesSDK', '1.6.0'
# pod 'PolyvVodSDK', '2.16.3'
#注释上述代码,替换为下列代码
pod 'PLVLiveScenesSDK', '1.6.0', :subspecs => ['BaseSDK','Core', 'Player']
pod 'AgoraRtcEngine_iOS', '2.9.0.107'
pod 'PLVSocketIOClientSwift', '~> 0.1.0'
# 不使用use_Farmeworks!时使用pod "PLVSocket", "~> 0.2.0" 替换pod "PLVSocketIOClientSwift"
pod "UCloudRtcSdk", "1.9.1"
pod "TXLiteAVSDK_Professional", "8.3.9884"
pod "AliyunOSSiOS", "~> 2.10.8"
pod "PLVModel", "~> 1.0.4"
pod 'PolyvVodSDK', '~> 2.16.3', :subspecs => ['Core', 'Player']
pod 'SSZipArchive', '~> 2.1.5'
pod 'WCDB', '~> 1.0.6'
pod 'PLVAliHttpDNS', '~> 1.10.0'
出現報錯的原因為多場景 SDK 與點播 SDK 同時依賴使用 alicloudhttpdns.framework 等 framework。保利威多場景 SDK 以及點播 SDK 支援 subspecs 的 pod 整合方式,可靈活整合多場景 SDK 和點播 SDK,只引入一次依賴函式庫。
若出現舊版本點播 SDK 與多場景 SDK 1.6.0 版本出現 PLVIJKPlayer 的衝突,推薦升級舊版本點播 SDK 至 2.16.3 版本。若仍無法解決,可聯繫保利威技術支援工作人員尋求協助。
5 聊天室模組升級到 1.7.0 版本變動說明
5.1 SDK
注意:若升級 SDK 後,直接升級我們 Common 層的程式碼,則無需關注 SDK 層的改動;如果只升級 SDK 而不升級 Common 層的原始碼,或者沒有使用 Common 層的原始碼,則需要針對以下改動做相應的修改。
5.1.1 PLVChatroomManager
發送文字訊息、引用訊息的 API 修改:
// 该方法被移除 - (BOOL)sendSpeakMessage:(PLVSpeakMessage *)message needIdCallback:(BOOL)needIdCallback; // 替换为以下方法 - (BOOL)sendSpeakMessage:(PLVSpeakMessage *)message callback:(void (^ _Nullable)(NSString *msgId))callback; // 以下两个方法被移除 - (BOOL)sendSpeakMessage:(PLVSpeakMessage *)message replyMsgId:(NSString * _Nullable)replyMsgId needIdCallback:(BOOL)needIdCallback; - (BOOL)sendSpeakMessage:(PLVSpeakMessage *)message replyMsgId:(NSString * _Nullable)replyMsgId needIdCallback:(BOOL)needIdCallback callback:(void (^ _Nullable)(NSString *msgId))callback; // 替换为以下两个方法 - (BOOL)sendQuoteMessage:(PLVQuoteMessage *)message; - (BOOL)sendQuoteMessage:(PLVQuoteMessage *)message callback:(void (^ _Nullable)(NSString *msgId))callback; // 该方法被移除 - (BOOL)sendImageEmotionMessage:(PLVImageEmotionMessage *)message callback:(void (^ _Nullable)(PLVImageEmotionMessage *message))callback; // 替换为以下方法 - (BOOL)sendImageEmotionMessage:(PLVImageEmotionMessage *)message;
5.1.2 PLVSocketManager
接收圖片表情訊息(emotion)訊息的回呼發生如下變動:
- (void)socketMananger_didReceiveMessage:(NSString *)subEvent json:(NSString *)jsonString jsonObject:(id)object { NSDictionary *jsonDict = (NSDictionary *)object; if (![jsonDict isKindOfClass:[NSDictionary class]]) { return; } if ([subEvent isEqualToString:@"EMOTION"]) { // someone logged in chatroom //1.7.0以前的版本接收到图片表情消息的位置 } } - (void)socketMananger_didReceiveEvent:(NSString *)event subEvent:(NSString *)subEvent json:(NSString *)jsonString jsonObject:(id)object { NSDictionary *jsonDict = PLV_SafeDictionaryForValue(object); if ([event isEqualToString:@"emotion"]) {// someone send a image emotion //1.7.0以后(含1.7.0版本)接收到图片表情消息的位置 } }
5.2 Common
若升級完 SDK 和 Common 層的原始碼,同步也升級了 Scene 層的原始碼,則無需關注以下改動;若只升級 SDK 和 Common 層的原始碼,不升級 Scene 層的原始碼,或沒有使用 Scene 層的原始碼的客戶,則需要針對以下改動做相應的修改。
5.2.1 PLVChatroomPresenter
PLVChatroomPresenterProtocol有以下兩個 delegate 方法發生變動/// 以下回调被删除 - (void)chatroomPresenter_sendImageEmotionMessageStatus:(PLVImageEmotionMessage *)message; /// 以下回调有更改 - (void)chatroomPresenter_loadImageEmotionsSuccess:(NSArray <NSDictionary *> *)dictArray; /// 改为 - (void)chatroomPresenter_loadImageEmotionsSuccess;API 的改動如下:
// 该方法被移除 - (PLVChatModel * _Nullable)chatModelWithMsgStateForSendSpeakMessage:(NSString *)content replyChatModel:(PLVChatModel * _Nullable)replyChatModel; // 可用以下方法代替 - (PLVChatModel * _Nullable)sendSpeakMessage:(NSString *)content replyChatModel:(PLVChatModel * _Nullable)replyChatModel; // 该方法被删除 - (PLVChatModel * _Nullable)sendImageEmotionId:(NSString *)imageId; // 改为以下方法 - (PLVChatModel * _Nullable)sendImageEmotionId:(NSString *)imageId imageUrl:(NSString *)imageUrl; // 该方法被删除,改为直接调用 [[PLVChatroomManager sharedManager] sendCloseRoom:close]; - (BOOL)sendCloseRoom:(BOOL)closeRoom;以下屬性改動:
@property (nonatomic, assign) BOOL specialRole; // 布尔属性 specialRole 改为对外只读,无需外部配置 @property (nonatomic, assign, readonly) BOOL specialRole; // 以下属性删除,改为直接通过 [PLVChatroomManager sharedManager].closeRoom 读取 @property (nonatomic, assign, readonly) BOOL closeRoom; // 新增以下属性,可用于获取图片表情资源数组 @property (nonatomic, strong, readonly) NSArray *imageEmotionArray;內部邏輯改動:
// Scene 层无需再调用 ViewModel 的以下方法加载图片表情资源,Common 层的 PLVChatroomPresenter 初始化时会自动调用 - (void)loadImageEmotions;
5.3 Scene
若升級了 SDK、Common 層、Scene 層 ViewModel 的原始碼後,同步升級 UI 部分的原始碼,則無需關注以下改動;若 Scene 層未升級 UI 部分的原始碼,只升級了聊天室的 ViewModel,則需要針對以下改動做相應的修改。
5.3.1 PLVLCChatroomViewModel
協定
PLVLCChatroomViewModelProtocol的 delegate 方法有以下改動:// 该方法被删除 - (void)chatroomViewModel_loadEmotionSuccess; // 改为以下方法代替 - (void)chatroomViewModel_loadImageEmotionSuccess:(NSArray<NSDictionary *> *)dictArray; // 新增以下方法,加载图片表情资源失败时触发 - (void)chatroomViewModel_loadImageEmotionFailure;
5.3.2 PLVECChatroomViewModel
協定
PLVECChatroomViewModelProtocol的 delegate 方法有以下改動:// 删除以下图片表情资源加载相关的回调,因为直播带货场景没有图片表情消息功能 - (void)chatroomViewModel_loadEmotionSuccess;
5.3.3 PLVLSChatroomViewModel
協定
PLVLSChatroomViewModelProtocol的 delegate 方法有以下改動:// 该方法被删除 - (void)chatroomViewModel_loadEmotionSuccess; // 改为以下方法代替 - (void)chatroomViewModel_loadImageEmotionSuccess:(NSArray<NSDictionary *> *)dictArray; // 新增以下方法,加载图片表情资源失败时触发 - (void)chatroomViewModel_loadImageEmotionFailure; // 新增以下方法,当发送消息包含违禁词或图片违规时触发 - (void)chatroomViewModel_didSendProhibitMessgae;
5.3.4 PLVSAChatroomViewModel
協定
PLVSAChatroomViewModelProtocol的 delegate 方法有以下改動:// 该方法被删除 - (void)chatroomViewModel_loadEmotionSuccess; // 改为以下方法代替 - (void)chatroomViewModel_loadImageEmotionSuccess:(NSArray<NSDictionary *> *)dictArray; // 新增以下方法,加载图片表情资源失败时触发 - (void)chatroomViewModel_loadImageEmotionFailure; // 新增以下方法 // 重发公聊消息后触发 - (void)chatroomViewModelDidResendMessage:(PLVSAChatroomViewModel *)viewModel; // 当发送消息包含违禁词或图片违规时触发 - (void)chatroomViewModelDidSendProhibitMessgae:(PLVSAChatroomViewModel *)viewModel;刪除以下屬性:
// 以下属性删除,改为直接通过 [PLVChatroomManager sharedManager].closeRoom 读取 @property (nonatomic, assign, readonly) BOOL closeRoom;以下 API 改動:
// 该方法被删除,改为直接调用 [[PLVChatroomManager sharedManager] sendCloseRoom:close]; - (BOOL)sendCloseRoom:(BOOL)closeRoom; // 该方法被删除 - (BOOL)resendSpeakMessage:(NSString *)content replyChatModel:(PLVChatModel * _Nullable)replyChatModel; // 改为以下方法 - (BOOL)resendSpeakMessage:(PLVChatModel *)model replyChatModel:(PLVChatModel * _Nullable)replyChatModel; // 该方法被删除 - (BOOL)resendImageMessage:(UIImage *)image imageId:(NSString *)imageId; // 改为以下方法 - (BOOL)resendImageMessage:(PLVChatModel *)model; // 该方法被删除 - (BOOL)resendImageEmotionMessage:(NSString *)imageId imageUrl:(NSString *)imageUrl; // 改为以下方法 - (BOOL)resendImageEmotionMessage:(PLVChatModel *)model;
