直播网站源码实现IM即时聊天

IM及时聊天承担着直播网站源码系统信息、用户之间私聊消息传递的重担,即时聊天可以说是直播网站源码重要的基础功能之一。IM即时聊天的实现原理是用户在发出信息后,先经过IM服务器,再传递给另一个用户,相当于在用户之间建立了一个中转站,之所需需要这个中转站是因为用户与用户之间是无法直接进行通信的,必须经过服务器。具体的实现形式,我们可以看以下代码:

一、准备阶段
CocoPods集成腾讯IM:TXIMSDK_TUIKit_iOS_Professional (5.0.7)
在腾讯云(https://cloud.tencent.com/document/product/269/44490)控制台->即时通讯IM->创建应用并生成appid

功能集成部分代码展示如下:

在AppDelegate.m中didFinishLaunchingWithOptions初始化SDK并登录(需要判断有没有uid)
[[TUIKit sharedInstance] setupWithAppId:@"appid"];

[[TUIKit sharedInstance] login:[Config getOwnID] userSig:[GenerateTestUserSig genTestUserSig:[Config getOwnID]] succ:^{
         NSLog(@"IM登录成功");
        if (self.deviceToken) {
//离线推送
            V2TIMAPNSConfig *confg = [[V2TIMAPNSConfig alloc] init];
            confg.businessID = @"businessID";
            confg.token = self.deviceToken;
            [[V2TIMManager sharedInstance] setAPNS:confg succ:^{
                 NSLog(@"-----> 设置 APNS 成功");
            } fail:^(int code, NSString *msg) {
                 NSLog(@"-----> 设置 APNS 失败");
            }];
        }
        [self getAllUnreadNum];
    } fail:^(int code, NSString *msg) {
         [MBProgressHUD showError:@"IM登录失败,请重新登录"];
        [[YBToolClass sharedInstance] quitLogin:@"ding"];
    }];

二、监听单点登录

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onUserStatus:) name:TUIKitNotification_TIMUserStatusListener object

- (void)onUserStatus:(NSNotification *)notification
{
    TUIUserStatus status = [notification.object integerValue];
    switch (status) {
        case TUser_Status_ForceOffline:
        {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"下线通知" message:@"您的帐号于另一台手机上登录。" delegate:self cancelButtonTitle:@"退出" otherButtonTitles:@"重新登录", nil];
            [alertView show];
        }
            break;
        case TUser_Status_ReConnFailed:
        {
            NSLog(@"连网失败");
        }
            break;
        case TUser_Status_SigExpired:
        {
            NSLog(@"userSig过期");
        }
            break;
        default:
            break;
    }
}
/**
 *强制下线后的响应函数委托IM登录
 */
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if(buttonIndex == 0){
        // 退出
      
        [[V2TIMManager sharedInstance] logout:^{
            NSLog(@"登出成功!");
       
        } fail:^(int code, NSString *msg) {
            NSLog(@"登出失败!==%d===%@",code,msg);
        }];
        [[YBToolClass sharedInstance] quitLogin:@"dandian"];
    }else if(buttonIndex == 1){
        // 重新登录
        [self IMLogin];
         // self.window.rootViewController =  [[UINavigationController alloc] initWithRootViewController:[[GuideViewController alloc] init]];
        
    } else {
      
    }
}
:nil];

创建群聊(以自定义群聊为例)

//创建群聊
        TIMCreateGroupInfo *groupZ = [[TIMCreateGroupInfo alloc]init];
           groupZ.group = nil;
           groupZ.groupName = @"";//群名称
        groupZ.groupType = @"Private";//私有群//@"Public";//公开群
           groupZ.setAddOpt = NO;
           groupZ.notification = @""//群名片;
        groupZ.introduction = @""//群简介;
           groupZ.faceURL = @"";//群头像
           //添加群成员
           TIMCreateGroupMemberInfo *members = [[TIMCreateGroupMemberInfo alloc]init];
           members.member = @"uid";
           members.role = TIM_GROUP_MEMBER_ROLE_MEMBER;//成员角色

           NSMutableArray *membersInfo = [[NSMutableArray alloc] init];
           [membersInfo addObject: members];

           groupZ.membersInfo = membersInfo;
           [[TIMGroupManager sharedInstance] createGroup:groupZ succ:^(NSString *groupId) {
               NSLog(@"创建成功==%@",groupId);
               
              TUIConversationCellData *conversationData = [[TUIConversationCellData alloc] init];
               conversationData.groupID = groupId;
               TChatControllV *chat = [[TChatControllV alloc] initWithConversation:conversationData];
               chat.fromwhere = @"creatGroup";
               chat.titlestr = groupZ.groupName;
               [self.navigationController pushViewController:chat animated:YES];
           } fail:^(int code, NSString *msg) {
                NSLog(@"创建失败==%@===%d",msg,code);
           }];

添加群成员

 *  @param groupId 群组Id
 *  @param members 要加入的成员列表(NSString* 类型数组)
 *  @param succ    成功回调 (TIMGroupMemberResult 列表)
 *  @param fail    失败回调
 *
 *  @return 0:成功;1:失败
 */
- (int)inviteGroupMember:(NSString*)groupId members:(NSArray<NSString *>*)members succ:(TIMGroupMemberSucc)succ fail:(TIMFail)fail

修改群资料

- (void)setGroupInfo:(V2TIMGroupInfo *)info succ:(V2TIMSucc)succ fail:(V2TIMFail)fail
注:如果是自己创建的页面,在修改完成之后需要手动调用下面代码,通知其他用户修改成功(主要解决苹果和安卓互通问题,不调用此代码苹果端不影响)
V2TIMGroupInfo *info = [[V2TIMGroupInfo alloc] init];
           info.groupID = @"群组id";
           info.groupName = @"修改了群名称";
 
//设置成功后需要发送
               [[[RACObserve(info, groupName) takeUntil:self.rac_prepareForReuseSignal] distinctUntilChanged] subscribeNext:^(NSString *x) {
                  
           }];

踢出群聊

- (int)deleteGroupMemberWithReason:(NSString*)groupId reason:(NSString*)reason members:(NSArray<NSString *>*)members succ:(TIMGroupMemberSucc)succ fail:(TIMFail)fail;

注意事项:
(1).创建群组头像字节不多于100个
(2).私有群:只有创建者可删除群组成员。不能解散群,可以退群
公开群、聊天室:只有管理员和群主可以踢人。群主可以解散群,群主不能退群
对于直播大群:不能踢人。
(3).腾讯IM这个版本中很多通知是用的ReactiveCocoa,可以参考https://www.jianshu.com/p/f068f5783d82

IM即时聊天的实现形式有四种:短轮询、长轮询、SSE、websocket,介于直播网站源码要求能达到的实时性要求较高,所以多采用短轮询和websocket这两种方式。直播网站源码需要能达到实时性的包括图片、文字、语音和视频几种,部分即时通讯系统是无法满足这么全面的信息传递种类的,所以想要从即时通讯方面节省资金的运营商还是放弃吧,IM即时聊天就是最优的选择。
声明:以上内容为云豹科技作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任

上一篇:2021-04-29


下一篇:C++ 高级程序设计第一次上机考试题