如何在Flutter的TDLib Telegram库中持久化会话/保存用户认证状态
TDLib Dart 用户会话持久化实现方案
TDLib 原生自带会话持久化能力,你使用的 Dart 封装库是对原生 TDLib 接口的桥接,无需自行实现会话信息的加密存储逻辑,按以下步骤配置即可实现免重复登录:
配置步骤
- 初始化 TDLib 客户端时,在
TdlibParameters参数中正确配置databaseDirectory和filesDirectory两个参数,指定TDLib存储会话数据、本地缓存的本地路径,只要路径不会被应用常规清理逻辑删除,会话就会永久保留 - 初始化时不要开启
useTestDc后每次启动重置数据库目录,否则会清空原有会话信息 - 登录流程仅在 TDLib 抛出
updateAuthorizationState更新、且状态为authorizationStateWaitPhoneNumber时触发,其余状态下如果返回authorizationStateReady直接进入应用主界面即可,不需要重复调用登录接口
示例代码
import 'package:tdlib/tdlib.dart'; import 'package:path_provider/path_provider.dart'; Future<void> initTdlibClient() async { // 获取应用合法本地存储目录 final appDocDir = await getApplicationDocumentsDirectory(); final tdLibStorageDir = '${appDocDir.path}/tdlib_data'; final tdParams = TdlibParameters( apiId: 你申请的Telegram API_ID, apiHash: "你申请的Telegram API_HASH", databaseDirectory: tdLibStorageDir, filesDirectory: '$tdLibStorageDir/files', useFileDatabase: true, useChatInfoDatabase: true, useMessageDatabase: true, useSecretChats: true, enableStorageOptimizer: true, systemLanguageCode: "zh", deviceModel: "你的设备型号", systemVersion: "设备系统版本", applicationVersion: "你的应用版本号", ); await TdClient.instance.send(SetTdlibParameters(parameters: tdParams)); }
常见问题排查
- 热重载后需要重新登录的问题,90% 以上是两种原因:一是每次热重载都重新初始化TDLib客户端且没有复用原有存储目录,二是授权状态监听逻辑异常,每次启动都强制走手机号输入流程
- iOS端需要确认你指定的存储目录在应用沙盒内,拥有读写权限,否则TDLib无法写入会话数据会导致登录状态丢失
- 不需要自行保存手机号、验证码等敏感信息,TDLib会自动将授权会话加密存储到你指定的目录下,下次启动直接读取即可完成自动登录
内容的提问来源于stack exchange,提问作者ARTester403
相关产品推荐
相关产品推荐

