iOS腾讯IM集成

公司最近项目从JMessage到Tencent IM,使用到的腾讯IM。本篇文章会介绍下集成步骤和注意事项。

1.SDK集成

SDK集成我没有使用CocoaPods,因为每次pod install的时候总是失败,索性自己下载手动添加。
由于项目没有使用Tencent IM 的聊天UI,只添加ImSDK就可以了。这里我用的聊天的UI:aurora-imui,由于这个IMUI是swift写的,所以我聊天部分的代码全部swift的来写,将聊天模块独立出来,包括Tencent IM 用于消息接收的单例。不熟悉swift的小伙伴慎用。

2.实现

AppDelegate.m 代码

TIMSdkConfig *config = [[TIMSdkConfig alloc] init];
    config.sdkAppId = TencentIMAppId;
    config.accountType = TencentIMAccountType;
    config.disableLogPrint = true;
    [[TIMManager sharedInstance] setEnv:0];
    [[TIMManager sharedInstance] initSdk:config];
    __weak typeof(self) ws = self;
    if (Userdefault(EmakeCityUserId) != nil && Userdefault(EmakeCityUserTencentSign) != nil) {
        TIMLoginParam *param = [[TIMLoginParam alloc] init];
        param.userSig = Userdefault(EmakeCityUserTencentSign);
        param.identifier = Userdefault(EmakeCityUserId);
        [[TIMManager sharedInstance] login:param succ:^{
            if (ws.deviceToken != nil) {
                TIMTokenParam *param = [[TIMTokenParam alloc] init];
                param.busiId = TencentIMCerID;
                [param setToken:ws.deviceToken];
                [[TIMManager sharedInstance] setToken:param succ:^{
                    NSLog(@"-----> 上传 token 成功 ");
                } fail:^(int code, NSString *msg) {
                    NSLog(@"-----> 上传 token 失败 ");
                }];
            }
        } fail:^(int code, NSString *msg) {
            NSLog(@"登录失败!");
        }];
    }
    //初始化
    [[TencentIMClient shared] initJMessageClient];

这里说下userSig获取,登录成功后通过UserId调用接口获取
LoginViewController.m 代码

if (userId != nil) {
            AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
            NSData *deviceToken = delegate.deviceToken;
            [delegate upDateMessageCount];
            TIMLoginParam *param = [[TIMLoginParam alloc] init];
            param.userSig = userSign;
            param.identifier = userId;
            [[TIMManager sharedInstance] login:param succ:^{
                //登录成功
                if (deviceToken) {
                    TIMTokenParam *param = [[TIMTokenParam alloc] init];
                    param.busiId = TencentIMCerID;
                    [param setToken:deviceToken];
                    NSLog(@"login-deviceToken---%@",deviceToken);
                    [[TIMManager sharedInstance] setToken:param succ:^{
                        NSLog(@"-----> 上传 token 成功 ");
                    } fail:^(int code, NSString *msg) {
                        NSLog(@"-----> 上传 token 失败 ");
                    }];
                }
            } fail:^(int code, NSString *msg) {
                //登录失败
                NSLog(@"code-%d,msg-%@",code,msg);
            }];
        }
        这里说下TencentIMCerID,分别对应开发环境,和生产环境的的推送证书。
        #define TencentIMCerIDDebug     13643
        #define TencentIMCerID          13130

3.消息接收
class TencentIMClient: NSObject {
    
    weak var delegate : TencentIMClientDelegate?
    @objc var allMessageCount : NSNumber? = 0
    private static var _sharedInstance : TencentIMClient?
    //单例
    @objc class func shared() -> TencentIMClient{
        guard let instance = _sharedInstance else {
            _sharedInstance = TencentIMClient()
            return _sharedInstance!
        }
        return instance
    }
    
    @objc public func initJMessageClient() {
        //添加消息监听
        TIMManager.sharedInstance()?.add(TencentIMClient.shared())
        if UserDefaults.standard.object(forKey: EmakeCityAllMessageCount) != nil{
            let messageCount = UserDefaults.standard.object(forKey: EmakeCityAllMessageCount) as! String
            self.allMessageCount = NSNumber.init(value: (Int(messageCount) ?? 0))
        }else{
            self.allMessageCount = 0
        }
    }
}

extension TencentIMClient : TIMMessageListener {    
    func onNewMessage(_ msgs: [Any]!) {
        if msgs.count > 0 {
            let msg = msgs.first as! TIMMessage
            for i in 0..<msg.elemCount() {
                if let elem = msg.getElem(i) as? TIMCustomElem {
                    do {
                        let json:[String:Any]? = try JSONSerialization.jsonObject(with: elem.data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String:Any]
                        print("消息----%@",json ??  [:])
                     }catch{
                     }
               }
         }
    }
4.测试上线

注意打包测试消息的时候环境和证书环境一致,生产环境的消息测试在TestFlight测试无误后上线。直接打包上线会报错90080,90087,90209,90125。
打包上线请参考:# ios上架报错90080,90087,90209,90125 解决办法

MarkDown的书写语法真的好用!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。