前面几篇文章讲过了腾讯云的视频直播,既然有直播肯定也得需要聊天模块了,在我的项目需求中需要的有群聊和私聊,目前没有要求推送。虽然推送已经做过很多次了,但是由于项目紧张,就只写无推送功能的聊天内容了。
之前用过的推送有极光、友盟的第三方,也二次封装过网上的XMPP的demo。总的来说,推送这个东西对ios只有一套就是下载并安装推送证书,有了这个东西一切推送就跟非推送的聊天类似了。好了,今天就先开始讲述没有推送的聊天,第一次用腾讯的云IM所以也就从头好好讲一遍。
1.当然还是去腾讯云注册账号申请appid等东西了。所有运用的第三方都是这样,例如友盟分享、推送、统计,极光推送、包括微信分享、支付,支付宝支付、以及高德、百度的地图等,都是类似的一般。
2.需要用腾讯云IM就要先看看它的demo和官方sdk的介绍。下载IMSDK并集成到项目中去。集成的方案很通用的,无非就是导入腾讯云的sdk和其他辅助类库以及项目支持的类库,这些通用性太大直接上官方查看文档即可。
集成腾讯云IM方法
3.集成完毕以后就该初始化对象了,在需要聊天的模块初始化也可以,登录项目的时候初始化也可以。这就需要看你的项目需求了。如果是直播,聊天类的社交性项目就需要登录的时候直接初始化了。初始化的对象是TIMManager。在使用的模块引入头文件并使用IM的聊天代理。
//引入登录IM聊天相关头文件
#import
#import
//使用代理
TIMMessageListener,TIMRefreshListener
self.messageImManager = [TIMManager sharedInstance];
[_messageImManager setMessageListener:self];
[_messageImManager setRefreshListener:self];
//代理回调方法
//获取当前用户的聊天消息
-(void)onNewMessage:(NSArray *)msgs
{
for (NSInteger i =0; i.count; i++) {
TIMMessage *lastMsg =msgs[i];
self.senderModule = [[MSMessageSendersModule alloc]initWithConversation:lastMsg];
NSInteger unNum = [_senderModule.unreadNum integerValue];
_senderModule.unreadNum = [NSString stringWithFormat:@"%ld",++unNum];
[_messageSendersArray addObject:_senderModule];
}
[_messageSendersTableView reloadData];
}
//当未读消息或者新联系人发送消息时触发回调
-(int) setRefreshListener: (id)listener
{
NSLog(@"当未读消息或者新联系人发送消息时触发回调");
return 2;
}
//刷新聊天内容
- (void) onRefresh
{
NSLog(@"刷新聊天内容");
}
4.然后是登录,登录导入头文件
#import
#import
//设置代理
self.messageImManager = [TIMManager sharedInstance];
[_messageImManager setEnv:0];
[_messageImManager initSdk:[tecentSDKAppid intValue]];
[_messageImManager setConnListener:self];
[_messageImManager setUserStatusListener:self];
5.之前在直播模块也写到过这个登录,因为直播的账户和聊天账户都是同一个数据库,同一个服务器,所以登录也可以参考前面的文章
腾讯云在线直播二
6.在3里面写的方法其实都是该代理的回调,真正请求聊天,获取聊天列表的方法如下:
//开启子线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//获取当前用户消息数目
NSInteger conversationNum = [_messageImManager ConversationCount];
for (int i = 0; i < conversationNum; i++) {
TIMConversation *conversation = [[TIMManager sharedInstance] getConversationByIndex:i];
[conversation getMessage:1 last:nil succ:^(NSArray *msgs) {
//获取当前用户最新一条消息
TIMMessage *lastMsg = msgs[0];
self.senderModule = [[MSMessageSendersModule alloc]initWithConversation:lastMsg];
_senderModule.unreadNum = [NSString stringWithFormat:@"%d",[conversation getUnReadMessageNum]];
[_messageSendersArray addObject:_senderModule];
if (conversationNum == i+1) {
dispatch_async(dispatch_get_main_queue(), ^{
[SVProgressHUD showSuccessWithStatus:NSLocalizedStringFromTable(@"更新完毕", @"InfoPlist", nil)];
[_messageSendersTableView reloadData];
});
}
} fail:^(int code, NSString *msg) {
}];
}
});
7.聊天的发送消息可以使用demo里面的特定消息体例如(文本消息:TIMTextElem,图片消息:TIMImageElem,文件消息:TIMFileElem,语音消息:TIMSoundElem,群Tips:TIMGroupTipsElem,地理位置:TIMLocationElem,表情消息类型:TIMFaceElem,群系统消息:TIMGroupSystemElem,关系链变更消息:TIMSNSSystemElem,资料变更系统消息:TIMProfileSystemElem,微视频消息:TIMVideoElem),也可以用sdk提供的另一个自定义消息体(自定义消息类型:TIMCustomElem)。一般情况下,需求肯定是多变的。这里我就是使用的自定义消息体。代码如下:
//发送消息自己的唯一标示、自己的头像、自己的昵称、发送对象的唯一标示、消息内容、类型
NSDictionary *sendDic = [NSDictionary dictionaryWithObjectsAndKeys:[HSUserInfo getUserId],@"senderId",[HSUserInfo getHeadIcon],@"senderIcon",[HSUserInfo getUserName],@"senderNick",_senderModule.senderIdentefier,@"receiveId",msg,@"messageContent",@"TIM_C2C",@"TIMConversationType", nil];
//NSDictionary转换为Data
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:sendDic options:NSJSONWritingPrettyPrinted error:nil];
TIMCustomElem* userElem = [[TIMCustomElem alloc] init];
userElem.data = jsonData;
TIMMessage* timMsg = [[TIMMessage alloc] init];
[timMsg addElem:userElem];
[_friendConversation sendMessage:timMsg succ:^(){
NSLog(@"发送私聊信息成功");
} fail:^(int code, NSString* err) {
NSLog(@"发送私聊信息失败");
}];
在此聊天收发就完成了。如果需要推送功能的可以自己再看腾讯云官方的文档,地址在这