119 lines
3.4 KiB
Dart
119 lines
3.4 KiB
Dart
// ignore_for_file: constant_identifier_names, deprecated_member_use
|
||
|
||
import 'dart:io';
|
||
|
||
import 'package:dio/dio.dart';
|
||
import 'package:dio/io.dart';
|
||
import 'package:hgdj/tools_base/debug_log.dart';
|
||
import 'package:hgdj/tools_base/net/http_manager.dart';
|
||
|
||
import '../../config/address.dart';
|
||
import '../../hj_utils/light_model.dart';
|
||
import '../../hj_utils/store_keys.dart';
|
||
import '../../hj_utils/text_util.dart';
|
||
// import 'client_api.dart';
|
||
import '../../track_event_manager/device_service.dart';
|
||
|
||
/// 连接超时15秒
|
||
const int CONNECT_TIME_OUT = 15 * 1000;
|
||
|
||
final netManager = NetManager();
|
||
|
||
class NetManager {
|
||
static bool _inited = false;
|
||
|
||
init(String baseUrl) {
|
||
httpManager.init(baseUrl);
|
||
_inited = true;
|
||
}
|
||
|
||
reset() {
|
||
netManager.init(Address.baseApiPath ?? "");
|
||
}
|
||
|
||
static bool get isInited => _inited;
|
||
|
||
Future<String> getToken() async {
|
||
// 优先读内存(每次启动自动登录后 setToken 已写入),
|
||
// 兜底再读 lightKV:iOS release 包若 MMKV 异常,至少内存 token 能保证可用
|
||
var token = Address.token ?? '';
|
||
if (token.isEmpty) {
|
||
token = (await lightKV.getString(StoreKeys.NET_TOKEN)) ?? '';
|
||
if (token.isNotEmpty) {
|
||
Address.token = token;
|
||
}
|
||
}
|
||
return token;
|
||
}
|
||
|
||
Future setToken(String? token) async {
|
||
// 该key不共享,不放全局变量
|
||
Address.token = token;
|
||
return lightKV.setString(StoreKeys.NET_TOKEN, token);
|
||
}
|
||
|
||
/// 获取 UA:优先命中 KV 缓存。
|
||
Future<String> userAgent() => DeviceInfoService.getCachedUserAgent();
|
||
|
||
/// 强制重新生成并写回缓存(扫码登录、设备切换等场景)。
|
||
Future<String> refreshUserAgent() => DeviceInfoService.getCachedUserAgent(
|
||
deviceId: DeviceInfoService.deviceId);
|
||
|
||
/// 清除ua
|
||
Future clearUserAgent() => DeviceInfoService.clearCachedUserAgent();
|
||
|
||
/// 服务器时间
|
||
DateTime? _serverTime;
|
||
|
||
/// 服务器时间和本地时间的差值
|
||
int _diffTimeInSeconds = 0;
|
||
|
||
/// 获取上一次服务器返回的时间
|
||
DateTime? getServerTime() {
|
||
if (null != _serverTime) {
|
||
return _serverTime;
|
||
} else {
|
||
return DateTime.now();
|
||
}
|
||
}
|
||
|
||
/// 设置服务器时间
|
||
void setServerTime(String? serverTimeS) {
|
||
if (TextUtil.isNotEmpty(serverTimeS)) {
|
||
_serverTime = DateTime.parse(serverTimeS!);
|
||
_diffTimeInSeconds = DateTime.now().difference(_serverTime!).inSeconds;
|
||
debugLog(
|
||
"============>server diff from local in seconds:$_diffTimeInSeconds");
|
||
}
|
||
}
|
||
|
||
/// 获取修复后的本地时间,应该是和服务器时间是同步的
|
||
DateTime getFixedCurTime() {
|
||
return DateTime.now().add(Duration(seconds: -_diffTimeInSeconds));
|
||
}
|
||
}
|
||
|
||
Dio createDio({BaseOptions? options}) {
|
||
final defaultOptions = BaseOptions(
|
||
connectTimeout: const Duration(seconds: 15),
|
||
receiveTimeout: const Duration(seconds: 15),
|
||
// dio 原生会加上 request header:accept-encoding gzip,导致部分请求失败
|
||
// headers: {HttpHeaders.acceptEncodingHeader: "*"},
|
||
validateStatus: (int? status) => (status ?? 600) < 600,
|
||
);
|
||
options ??= defaultOptions;
|
||
options.headers[HttpHeaders.acceptEncodingHeader] = "*";
|
||
var dio = Dio(options);
|
||
|
||
var adapter = DefaultHttpClientAdapter();
|
||
// var adapter = DefaultHttpClientAdapter();
|
||
adapter.onHttpClientCreate = (client) {
|
||
client.badCertificateCallback =
|
||
(X509Certificate cert, String host, int port) => true;
|
||
return client;
|
||
};
|
||
dio.httpClientAdapter = adapter;
|
||
|
||
return dio;
|
||
}
|