irpas技术客

flutter 集成 腾讯 im_一抹离愁

irpas 3502

flutter 集成腾讯im比较简单

注意点UserSig的生成? ?登陆的时候调用

开发者后台生成 在开发者后台,实际上调用云通信IM生成UserSig的库,把以下三个重要信息进行对称加密(非对称的方式已经停用),生成UserSig SdkAppid:云通信IM应用的唯一ID SecretKey:云通信IM应用的唯一密钥 ExpireTime:密码过期时间,开发者指定 GenerateTestUserSig UserSig的生成 /** * * @class name: * @class describe *@class name: * @author XUIELIANG * @time 2021/11/20 0020 15:55 * @change * @chang time * @class describe */ library generate_test_im_usersig; import 'package:crypto/crypto.dart'; import 'package:flutter/material.dart'; import 'dart:convert'; import 'dart:io'; ///生成腾讯云即时通信测试用userSig /// class GenerateTestUserSig { GenerateTestUserSig({required this.sdkappid, required this.key}); int sdkappid; String key; ///生成UserSig String genSig({ required String identifier, required int expire, List<int>? userBuf, }) { int currTime = _getCurrentTime(); String sig = ''; Map<String, dynamic> sigDoc = new Map<String, dynamic>(); sigDoc.addAll({ "TLS.ver": "2.0", "TLS.identifier": identifier, "TLS.sdkappid": this.sdkappid, "TLS.expire": expire, "TLS.time": currTime, }); sig = _hmacsha256( identifier: identifier, currTime: currTime, expire: expire, ); sigDoc['TLS.sig'] = sig; String jsonStr = json.encode(sigDoc); List<int> compress = zlib.encode(utf8.encode(jsonStr)); return _escape(content: base64.encode(compress)); } int _getCurrentTime() { return (new DateTime.now().millisecondsSinceEpoch / 1000).floor(); } String _hmacsha256({ required String identifier, required int currTime, required int expire, }) { int sdkappid = this.sdkappid; String contentToBeSigned = "TLS.identifier:$identifier\nTLS.sdkappid:$sdkappid\nTLS.time:$currTime\nTLS.expire:$expire\n"; Hmac hmacSha256 = new Hmac(sha256, utf8.encode(this.key)); Digest hmacSha256Digest = hmacSha256.convert(utf8.encode(contentToBeSigned)); return base64.encode(hmacSha256Digest.bytes); } String _escape({ required String content, }) { return content .replaceAll('\+', '*') .replaceAll('\/', '-') .replaceAll('=', '_'); } }

1?https://pub.dev/packages/tencent_im_sdk_plugin

这将在包的 pubspec.yaml 中添加这样的一行(并运行一个隐式flutter pub get):

dependencies: tencent_im_sdk_plugin: ^3.5.3

现在在您的 Dart 代码中,您可以使用:

import 'package:tencent_im_sdk_plugin/tencent_im_sdk_plugin.dart';

class _MyAppState extends State<MyApp> { late V2TIMManager timManager; @override void initState() { // TODO: implement initState super.initState(); //获取腾讯即时通信IM manager; timManager = TencentImSDKPlugin.v2TIMManager; inits(); } int expire = 60 * 60 * 27 * 7; //开发者自定过期时间,比如7天 //初始化SDK V2TimValueCallback<bool> initRes = await timManager.initSDK( sdkAppID: 1400600479, //填入在控制台上申请的sdkappid loglevel: LogLevel.V2TIM_LOG_DEBUG, listener: V2TimSDKListener(onConnectFailed: (int code, String error) { print("================注册失败${code}====${error}"); }, onConnectSuccess: () { print("================成功"); })); int code = initRes.code; String desc = initRes.desc; bool? data = initRes.data; //为V2TimValueCallback实例化时接收的泛型。 if (initRes.code == 0) { //初始化成功 //以下监听可按需设置,为防止遗漏消息,请在登录前设置监听。 //简单监听 timManager.addSimpleMsgListener( listener: V2TimSimpleMsgListener(), ); //会话监听 timManager.getConversationManager().setConversationListener( listener: V2TimConversationListener(), ); //高级消息监听 timManager.getMessageManager().addAdvancedMsgListener( listener: V2TimAdvancedMsgListener(), ); //设置信令相关监听 timManager.getSignalingManager().addSignalingListener( listener: V2TimSignalingListener(), ); // 不时生产环境走,自己测试即不需要手机验证即可登陆 GenerateTestUserSig usersig = new GenerateTestUserSig( sdkappid: Config.sdkappid, key: Config.key, ); String pwdStr = usersig.genSig(identifier: "xueliang", expire: expire); TencentImSDKPlugin.v2TIMManager .login( userID: "xueliang", userSig: pwdStr, ) .then((value) { print("=============${value}"); }); } }

登陆测试

void login() async { int expire = 60 * 60 * 27 * 7; //开发者自定过期时间,比如7天 // 不时生产环境走,自己测试即不需要手机验证即可登陆 GenerateTestUserSig usersig = new GenerateTestUserSig( sdkappid: Config.sdkappid, key: Config.key, ); String pwdStr = usersig.genSig(identifier: "liang", expire: expire); var data = await TencentImSDKPlugin.v2TIMManager.login( userID: "liang", userSig: pwdStr, ); if (data.code != 0) { // Utils.toast("登录失败${data.desc}"); print("===============登录失败=${data.code}==${data.desc}="); return; } V2TimValueCallback<List<V2TimUserFullInfo>> infos = await TencentImSDKPlugin.v2TIMManager.getUsersInfo( userIDList: ["liang"], ); List<V2TimUserFullInfo>? data2 = infos.data; if (infos.code == 0) { data2?.forEach((item) { print("======成功==${item.nickName}==="); }); // print("===============chenggong=${infos.toString()}==="); timManager.sendC2CTextMessage( text: "sdjhjshdshdsads 你好湿哒哒的呀的撒对手泰迪狗赛度过三岁德国世家的你丫的", userID: "liang", ); } }

config 类

class Config { static const int sdkappid = int.fromEnvironment('1400600479', defaultValue: 1400600479); static const String key = String.fromEnvironment('981f785bb12240035787e87a791bcacbf8ac524846e39b9b5320c57408228052', defaultValue: "981f785bb12240035787e87a791bcacbf8ac524846e39b9b5320c57408228052"); static const bool productEnv = bool.fromEnvironment('ISPRODUCT_ENV', defaultValue: false); static const String smsLoginHttpBase = 'https://demos.trtc.tencent-cloud.com/prod'; static const String captchaUrl = 'https://imgcache.qq.com/operation/dianshi/other/index.e7ef9e022229b9167136a9ed48572f258fe7d528.html'; }

?


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Flutter #集成 #腾讯 #im