一、集成方式,采用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、云信不能连续(以秒计算)调用登录接口,否则会直接返回超时。