mobile v1.0.3:登录卡死定位增强(B-58)
- SDK 初始化与登录拆成两步分别超时,提示语区分卡在哪一步 - 登录失败时读取并展示 OpenIM SDK 日志文件结尾(去 ANSI 颜色码),用户拍照即可回传诊断信息 - 模拟器实测(Android 15 x86_64):initSDK+login 对 192.168.200.11 全流程正常,排除服务端与代码逻辑问题 - libgojni arm64 已验证 16KB 页对齐,排除新机型兼容性问题
This commit is contained in:
@@ -39,6 +39,41 @@ class IMService extends ChangeNotifier {
|
||||
/// 最近一次连接失败的原始错误(诊断展示用)
|
||||
String? lastConnectError;
|
||||
|
||||
/// SDK 数据/日志目录(_doInit 时记录)
|
||||
String? _dataDir;
|
||||
|
||||
/// 读 SDK 日志文件的结尾部分(定位「SDK 卡在哪」用)。读不到返回空串。
|
||||
Future<String> sdkLogTail() async {
|
||||
try {
|
||||
final dataDir = _dataDir ?? '${(await getApplicationDocumentsDirectory()).path}/openim';
|
||||
final dir = Directory(dataDir);
|
||||
if (!dir.existsSync()) return '';
|
||||
final files = dir
|
||||
.listSync(recursive: true)
|
||||
.whereType<File>()
|
||||
.where((f) => f.path.endsWith('.log'))
|
||||
.toList()
|
||||
..sort((a, b) => b.lastModifiedSync().compareTo(a.lastModifiedSync()));
|
||||
if (files.isEmpty) return '';
|
||||
final file = files.first;
|
||||
final len = file.lengthSync();
|
||||
final start = len > 2048 ? len - 2048 : 0;
|
||||
final raf = file.openSync();
|
||||
try {
|
||||
raf.setPositionSync(start);
|
||||
final bytes = raf.readSync(len - start);
|
||||
// 去掉日志里的 ANSI 颜色码,免得截图里出现乱码
|
||||
return String.fromCharCodes(bytes)
|
||||
.replaceAll(RegExp(r'\x1B\[[0-9;]*m'), '')
|
||||
.trim();
|
||||
} finally {
|
||||
raf.closeSync();
|
||||
}
|
||||
} catch (_) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
/// 是否已登录
|
||||
bool loggedIn = false;
|
||||
|
||||
@@ -98,6 +133,7 @@ class IMService extends ChangeNotifier {
|
||||
Future<void> _doInit() async {
|
||||
final dir = await getApplicationDocumentsDirectory();
|
||||
final dataDir = '${dir.path}/openim';
|
||||
_dataDir = dataDir;
|
||||
await Directory(dataDir).create(recursive: true);
|
||||
final ok = await OpenIM.iMManager.initSDK(
|
||||
platformID: platformID,
|
||||
|
||||
Reference in New Issue
Block a user