前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用腾讯云通信做聊天功能遇到的问题

用腾讯云通信做聊天功能遇到的问题

作者头像
honey缘木鱼
发布2019-08-12 15:42:51
3.8K0
发布2019-08-12 15:42:51
举报
文章被收录于专栏:娱乐心理测试
一.登录问题

用户登录腾讯后台服务器后才能正常收发消息,登录需要用户提供 UserID、UserSig。

代码语言:javascript
复制
TIMLoginParam *param = [[TIMLoginParam alloc] init];
    param.identifier = tencentAccount;
    param.userSig = userSig;
    [[TIMManager sharedInstance] login:param succ:^{
        NSLog(@"腾讯云登录成功"); 
 } fail:^(int code, NSString *msg) {
        [WHToast showMessage:msg duration:2.0f finishHandler:nil];
    }];

tencentAccount和userSig分别代表腾讯云账号和签名,是服务端返回的字段。当用户票据过期或此用户在其他终端被踢,登录将会失败,前端就需要重新登录。在启动APP时添加观察者监听用户登录状态。

代码语言:javascript
复制
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onUserStatus:) name:TUIKitNotification_TIMUserStatusListener object:nil];//监听用户登录状态

- (void)onUserStatus:(NSNotification *)notification
{
    TUIUserStatus status = [notification.object integerValue];
    __weak typeof(self) ws = self;
    if(status==TUser_Status_ForceOffline||status==TUser_Status_SigExpired){
        UIAlertController *alert = [IHUtility createAlertWithTitle:







@"下线通知" message:@"您的帐号于另一台手机上登录。" confirmAction:@"重新登录"  preferred:UIAlertControllerStyleAlert confirmHandler:^(UIAlertAction *confirmAction) {
            [ws gotoLogin];//跳到登录页,重新登录
        } cancleHandler:^(UIAlertAction *cancleAction) {
        }];
        [self presentViewController:alert animated:YES completion:nil];
    }else {
         [WHToast showMessage:@"网络异常" duration:2.0f finishHandler:nil];
    }
}
二.登录退出,清空聊天记录。

在退出切换账号时,需要调取腾讯云的logout方法,这样才会清楚当前登录用户的聊天列表。

代码语言:javascript
复制
[[TIMManager sharedInstance] logout:^() {
    NSLog(@"logout succ");
} fail:^(int code, NSString * err) {
    NSLog(@"logout fail: code=%d err=%@", code, err);
}];

需要 logout 回调成功或者失败后才能再次 login,否则 login 可能会失败。

三.用户置顶

需求:易脚官方消息通过管理员发消息的方式推送,需要置顶。

设置:在会话列表中根据不同的用户ID设置需要置顶的用户。

代码语言:javascript
复制
 _viewModel.listFilter = ^BOOL(TUIConversationCellData * _Nonnull data) {
            if([data.convId isEqualToString:@"storeAdmin"]||[data.convId isEqualToString:@"admin"]){
                //置顶
                [[TUILocalStorage sharedInstance] addTopConversation:@"storeAdmin"];
                [[TUILocalStorage sharedInstance] addTopConversation:@"admin"];
        }

3.添加自定义信息(工号,手机号)

需求:聊天时需要显示技师工号,及点头像需要传入手机号码,就需要自定义字段。 设置:在腾讯云控制台加入相对应的字段。

关键代码:

代码语言:javascript
复制
//获取指定用户资料
  [[TIMFriendshipManager sharedInstance] getUsersProfile:@[_conversationData.convId] forceUpdate:NO succ:^(NSArray * arr) {
        for (TIMUserProfile * profile in arr) {
              [weakSelf setTitle:[IHUtility hexStringFromString:profile.customInfo[@"jobNum"]] color:titleColor];
            _chat.customInfo = profile.customInfo;
        }
    }fail:^(int code, NSString * err) {
        NSLog(@"GetFriendsProfile fail: code=%d err=%@", code, err);
    }];

+ (NSString *)hexStringFromString:(NSData *)data{
    NSString *hexStr=[[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];
    return hexStr;
}

因为自定义字段集合,key 是 NSString 类型,value 是 NSData 类型或者 NSNumber 类型,所以需要转码。

四.聊天时获取用户头像

腾讯云通信比较坑的一点,在聊天时没有设置用户头像,需要开发者自己设置,因为目前项目中只涉及到单聊,所以设置比较简单,想着好友头像从聊天列表页面传值给聊天页面,自己头像直接从登录后缓存中取出。

代码语言:javascript
复制
   data.userAvatarUrl = [NSURL URLWithString:USERMODEL.headImg];
   data.friendAvatarUrl = self.friendHeader;

//UI 赋值
 if (self.messageData.direction == MsgDirectionIncoming) {
        //接收方
          [self.avatarView sd_setImageWithURL:data.friendAvatarUrl      placeholderImage:self.messageData.avatarImage];
    }else
    {
        //发送方
         [self.avatarView sd_setImageWithURL:data.userAvatarUrl placeholderImage:self.messageData.avatarImage];
    }
五.点击聊天(聊天发送消息时,自己头像的改变)

虽然聊天页面有用户头像,但是当发送消息时,又会显示默认头像,所以在发送消息时,设置自己的头像。

在发送信息时,实现TUIInputController的代理方法的地方重新赋值。

代码语言:javascript
复制
- (void)inputController:(TUIInputController *)inputController didSendMessage:(TUIMessageCellData *)msg

- (void)changeMsg:(TUIMessageCellData *)msg status:(TMsgStatus)status
{
    msg.status = status;
    NSInteger index = [_uiMsgs indexOfObject:msg];
    TUIMessageCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0]];
    msg.userAvatarUrl =[NSURL URLWithString: USERMODEL.headImg];
    [cell fillWithData:msg];
}

六.自定义消息

需求:在用户聊天界面点击+号,弹出相册,视频类的快捷发送消息。

设置: (1).打开TUIInputMoreCellData文件,在.h文件添加

代码语言:javascript
复制
@property (class, nonatomic, assign) TUIInputMoreCellData *shopData;
@property (class, nonatomic, assign) TUIInputMoreCellData *buyData;
@property (class, nonatomic, assign) TUIInputMoreCellData *couponData;

在.m文件添加

代码语言:javascript
复制
+ (void)setVideoData:(TUIInputMoreCellData *)videoData
{
    TUI_Video_MoreCell = videoData;
}

+ (TUIInputMoreCellData *)shopData
{
    if (!TUI_File_ShopCell) {
        TUI_File_ShopCell = [[TUIInputMoreCellData alloc] init];
        TUI_File_ShopCell.title = @"商城";
        TUI_File_ShopCell.image = [UIImage imageNamed:@"shop"];
    }
    return TUI_File_ShopCell;
}

+ (void)setShopData:(TUIInputMoreCellData *)shopData
{
    TUI_File_ShopCell = shopData;
}

+ (TUIInputMoreCellData *)buyData
{
    if (!TUI_File_BuyCell) {
        TUI_File_BuyCell = [[TUIInputMoreCellData alloc] init];
        TUI_File_BuyCell.title = @"内购";
        TUI_File_BuyCell.image = [UIImage imageNamed:@"order"];
    }
    return TUI_File_BuyCell;
}

+ (void)setBuyData:(TUIInputMoreCellData *)buyData
{
    TUI_File_BuyCell = buyData;
}

+ (TUIInputMoreCellData *)couponData
{
    if (!TUI_File_CouponCell) {
        TUI_File_CouponCell = [[TUIInputMoreCellData alloc] init];
        TUI_File_CouponCell.title = @"优惠券";
        TUI_File_CouponCell.image = [UIImage imageNamed:@"coupon"];
    }
    return TUI_File_CouponCell;
}

+ (void)setCouponData:(TUIInputMoreCellData *)couponData
{
    TUI_File_CouponCell = couponData;
}

(2).打开TUIChatController.m文件,把商城,内购,优惠券对象放进数组中。

代码语言:javascript
复制
 NSMutableArray *moreMenus = [NSMutableArray array];
        [moreMenus addObject:[TUIInputMoreCellData photoData]];
        [moreMenus addObject:[TUIInputMoreCellData pictureData]];
        [moreMenus addObject:[TUIInputMoreCellData videoData]];
        [moreMenus addObject:[TUIInputMoreCellData shopData]];
        [moreMenus addObject:[TUIInputMoreCellData buyData]];
         [moreMenus addObject:[TUIInputMoreCellData couponData]];
        _moreMenus = moreMenus;

在didSelectMoreCell方法中,实现相对应的点击事件。

代码语言:javascript
复制
//点击事件
- (void)inputController:(TUIInputController *)inputController didSelectMoreCell:(TUIInputMoreCell *)cell

(3)打开文件TUIMoreView,设置需要的格式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.08.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.登录问题
  • 二.登录退出,清空聊天记录。
  • 三.用户置顶
  • 四.聊天时获取用户头像
  • 五.点击聊天(聊天发送消息时,自己头像的改变)
  • 六.自定义消息
相关产品与服务
即时通信 IM
即时通信 IM(Instant Messaging)基于腾讯二十余年的 IM 技术积累,支持 Android、iOS、Mac、Windows、Web、H5、小程序平台且跨终端互通,低代码 UI 组件助您30分钟集成单聊、群聊、好友与资料、消息漫游、群组管理、会话管理、直播弹幕、内容审核和推送等能力。适用于直播互动、电商带货、客服咨询、社交沟通、企业办公、互动游戏、医疗健康等场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档