天天看點

內建雲信遇到的那些問題

一、內建方式,采用pods庫引入NIMSDK,采用直接引入的方式引入雲信相關UI及消息處理類

  1、pods代碼如下:

#雲信添加的第三方

pod 'NIMSDK'

pod 'CocoaLumberjack', '>= 3.2.0'

pod 'SDWebImage', '4.0.0'

pod 'Reachability', '>= 3.2'

pod 'SSZipArchive', '>= 1.8.1'

pod 'Toast', '~> 3.0'

pod 'SVProgressHUD', '~> 2.0.3'

pod 'M80AttributedLabel', '~> 1.6.3'

pod 'TZImagePickerController', '~> 1.7.7'

2、直接引入的有:

NIMDemoClass,主要包括雲信demo中以NTES為字首的類

NIMKit,主要包括以NIM為字首的類

二、為了不影響原來工程中的導航欄和控制器維持正常的樣式與功能删除一些不必要的分類檔案,主要包括

NIMDemoClasses/Classes/Common/Addons/:

UINavigationBar+Swizzling

UINavigationController+Swizzling

UINavigationItem+Swizzling

UIViewController+Swizzling

三、SDK的初始化配置工作:

1、通過類NIMSDKOption配置key和apnsCername,并由類NIMSDK的單例注冊這個option,通過NIMSDK的apnsManager的registerBadgeCountHandler方法來控制appIcon的badge

2、通過類NTESNotificationCenter的單例打開消息監控,并注冊雲信推送設定

3、通過登入傳回存在NSUserDefault中的雲信id和密碼規則登入雲信

4、通過讓AppDelegate服從NIMLoginManagerDelegate協定,實作onKick代理方法進而實作裝置互踢功能

四、對雲信的類的通用修改

  類NTESNotificationCenter中代理方法 onReceiveCustomSystemNotification中生成dict變量就是自定義通知裡附帶的内容

五、輔教端對雲信的類所做的修改

1、類NTESSessionListViewController中emptyTipLabel棄用,采用我們自己的NilView

方法ViewDidLoad第71行注釋掉

方法titleView第256行修改titleLabel顔色

2、類NIMSessionListViewController .h檔案中第23行recentSessions屬性(最近會話集合)由隻讀的修改為可讀可寫

  tableView的heightForRow代理方法修改

  tableView的cellForRow代理方法修改,主要是修改頭像

3、因為聊天頁面增加了我們自己的圖檔浏覽并編輯功能,是以在類NTESSessionViewController中showImage方法做了修改:

如果是檢視雲端消息記錄,即目前控制器是NTESSessionRemoteHistoryViewController類(目前類子類),那麼依舊跳轉雲信自己的NTESGalleryViewController類檢視圖檔;

如果是目前類,即聊天頁面,那麼就通過便利自定義類ZKTNimImgMsgManager類的imageMsgs數組找到目前點選的圖檔消息擷取其索引,傳給我們自己定義的圖檔浏覽器。

4、由于聊天頁面點選圖檔跳轉自定義圖檔編輯浏覽器的原因,是以在撤回消息方法中也做了修改:

類NTESSessionViewController中revokeMessage方法中把類型是NIMMessageTypeImage的消息從ZKTNimImgMsgManager的imageMsgs中移除

5、聊天頁面中,點選導航欄右上角的按鈕隻允許跳轉雲消息記錄控制器,類NTESSessionViewController中enterHistory方法做了修改:隻把跳轉雲消息記錄的代碼抽出來,之前雲信的actionsheet代碼全部注釋掉

6、類NTESSessionViewController中setUpNav方法中第947、962方法中修改rightBarButtonItems

7、去除轉發功能,類NTESSessionViewController中menusItems方法注釋掉轉發代碼

六、遇到的問題

    1. 錄音時,收到雲信提示音會導緻錄音檔案出問題,修複方式

NTESNotificationCenter類中// ZKTEditDotVC/ZKTRecordVC  加入作業錄音控制器  答疑編輯控制器 判斷不播放提示音

        if ([vc isKindOfClass:[NIMSessionViewController class]] ||  [vc isKindOfClass:[NTESLiveViewController class]] || [vc isKindOfClass:[NTESNetChatViewController class]] || [vc isKindOfClass:[ZKTEditDotVC class]] || [vc isKindOfClass:[ZKTRecordVC class]]) 這個if判斷中添加控制器

- (void)playMessageAudioTip

{

//    UINavigationController *nav = [NTESMainTabController instance].selectedViewController;

    UITabBarController *tabbarVC = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;

    UINavigationController *nav = tabbarVC.selectedViewController;

    BOOL needPlay = YES;

    for (UIViewController *vc in nav.viewControllers) {

        // ZKTEditDotVC/ZKTRecordVC  加入作業錄音控制器  答疑編輯控制器 判斷不播放提示音

        if ([vc isKindOfClass:[NIMSessionViewController class]] ||  [vc isKindOfClass:[NTESLiveViewController class]] || [vc isKindOfClass:[NTESNetChatViewController class]] || [vc isKindOfClass:[ZKTEditDotVC class]] || [vc isKindOfClass:[ZKTRecordVC class]])

        {

            needPlay = NO;

            break;

        }

    }

    if (needPlay) {

        [self.player stop];

        // AVAudioSessionCategoryAmbient

        // 2017-11-13  錄音的同時 收到雲信消息提示音 AVAudioSessionCategoryAmbient會導緻錄音本中斷  AVAudioSessionCategoryPlayAndRecord 可以保證錄音不中斷

        [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error:nil];

        [self.player play];

    }

}

開發注意事項

雲信切換注意事項

1、SDK倒入,有兩個版本NIMSDK(完整版)、NIMSDK_LITE(精簡版)

2、在 SDK 3.0.0 以前版本 (包括 3.0.0) ,c++ 庫請使用 libstdc++6.0.9.tbd , 之後的版本統一替換成 libc++.tbd 。

3、之前環信消息是否保留,如果不保留,需要做清楚工作,編寫相應的類和方法,找到相對資源路徑進行清理

4、避免消息混亂,在伺服器删除相應環信賬号(或者在學生端登入時退出環信)

5、輔教端需要在接受消息的方法中作出判斷,是來自雲信還是環信

注釋:替換雲信時,先引入雲信SDK,看是否與其他類庫産生沖突,然後按照文檔逐漸進行,再依次替換環信的方法

6、雲信互踢是管理平台控制的,如:賬号A已經登入,在另一裝置第一次登入A,則兩端會話清單相同,如果不是第一次登入,則已該裝置自己的會話為準。

7、雲信不能連續(以秒計算)調用登入接口,否則會直接傳回逾時。