172 lines
5.4 KiB
Dart
Executable File
172 lines
5.4 KiB
Dart
Executable File
import 'package:flutter/material.dart';
|
|
|
|
import 'package:connectivity_plus/connectivity_plus.dart';
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
import '../widgets/dialogs/kr_dialog.dart';
|
|
import '../localization/app_translations.dart';
|
|
import 'dart:io' show Platform;
|
|
import 'dart:io' show InternetAddress;
|
|
|
|
/// 网络检查工具类
|
|
class KRNetworkCheck {
|
|
/// 初始化网络检查
|
|
static Future<bool> kr_initialize(BuildContext context, {VoidCallback? onPermissionGranted}) async {
|
|
try {
|
|
if (Platform.isIOS) {
|
|
// iOS 平台特殊处理
|
|
final hasPermission = await kr_checkNetworkPermission();
|
|
if (!hasPermission) {
|
|
// 显示网络设置提示对话框
|
|
final bool? result = await kr_showNetworkDialog();
|
|
if (result == true) {
|
|
// 打开系统设置
|
|
await kr_openAppSettings();
|
|
|
|
// 等待用户返回并检查权限
|
|
bool hasPermissionAfterSettings = false;
|
|
for (int i = 0; i < 10; i++) {
|
|
await Future.delayed(const Duration(seconds: 1));
|
|
hasPermissionAfterSettings = await kr_checkNetworkPermission();
|
|
if (hasPermissionAfterSettings) {
|
|
onPermissionGranted?.call();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (!hasPermissionAfterSettings) {
|
|
await kr_showNetworkDialog();
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
} else {
|
|
// Android 平台处理
|
|
final hasPermission = await kr_checkNetworkPermission();
|
|
if (!hasPermission) {
|
|
final bool? result = await kr_showNetworkDialog();
|
|
if (result == true) {
|
|
await kr_openAppSettings();
|
|
|
|
bool hasPermissionAfterSettings = false;
|
|
for (int i = 0; i < 10; i++) {
|
|
await Future.delayed(const Duration(seconds: 1));
|
|
hasPermissionAfterSettings = await kr_checkNetworkPermission();
|
|
if (hasPermissionAfterSettings) {
|
|
onPermissionGranted?.call();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (!hasPermissionAfterSettings) {
|
|
await kr_showNetworkDialog();
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
onPermissionGranted?.call();
|
|
return true;
|
|
} catch (e) {
|
|
debugPrint('网络检查初始化错误: $e');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// 检查网络权限
|
|
static Future<bool> kr_checkNetworkPermission() async {
|
|
try {
|
|
if (Platform.isIOS) {
|
|
// iOS 平台使用更可靠的方式检查网络状态
|
|
final connectivityResult = await Connectivity().checkConnectivity();
|
|
if (connectivityResult == ConnectivityResult.none) {
|
|
return false;
|
|
}
|
|
|
|
// 尝试进行实际的网络请求测试
|
|
try {
|
|
final result = await InternetAddress.lookup('www.apple.com');
|
|
return result.isNotEmpty && result[0].rawAddress.isNotEmpty;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
} else {
|
|
// Android 平台保持原有逻辑
|
|
final connectivityResult = await Connectivity().checkConnectivity();
|
|
return connectivityResult != ConnectivityResult.none;
|
|
}
|
|
} catch (e) {
|
|
debugPrint('网络权限检查错误: $e');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// 检查网络连接状态
|
|
static Future<bool> kr_checkNetworkConnection() async {
|
|
try {
|
|
if (Platform.isIOS) {
|
|
// iOS 平台使用更可靠的方式检查网络状态
|
|
final connectivityResult = await Connectivity().checkConnectivity();
|
|
if (connectivityResult == ConnectivityResult.none) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
final result = await InternetAddress.lookup('www.apple.com');
|
|
return result.isNotEmpty && result[0].rawAddress.isNotEmpty;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
} else {
|
|
final connectivityResult = await Connectivity().checkConnectivity();
|
|
return connectivityResult != ConnectivityResult.none;
|
|
}
|
|
} catch (e) {
|
|
debugPrint('网络连接检查错误: $e');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// 监听网络状态变化
|
|
static Stream<ConnectivityResult> kr_networkStream() {
|
|
return Connectivity().onConnectivityChanged;
|
|
}
|
|
|
|
/// 打开应用设置页面
|
|
static Future<void> kr_openAppSettings() async {
|
|
if (Platform.isIOS) {
|
|
// iOS 平台打开网络设置
|
|
try {
|
|
await openAppSettings();
|
|
} catch (e) {
|
|
debugPrint('打开设置页面错误: $e');
|
|
}
|
|
} else {
|
|
await openAppSettings();
|
|
}
|
|
}
|
|
|
|
/// 显示网络权限对话框
|
|
static Future<bool> kr_showNetworkDialog() async {
|
|
bool? result;
|
|
await KRDialog.show(
|
|
title: Platform.isIOS
|
|
? AppTranslations.kr_networkPermission.title
|
|
: AppTranslations.kr_networkPermission.title,
|
|
message: Platform.isIOS
|
|
? AppTranslations.kr_networkPermission.description
|
|
: AppTranslations.kr_networkPermission.description,
|
|
confirmText: AppTranslations.kr_networkPermission.goToSettings,
|
|
cancelText: AppTranslations.kr_networkPermission.cancel,
|
|
onConfirm: () async {
|
|
result = await openAppSettings();
|
|
},
|
|
onCancel: () {
|
|
result = false;
|
|
},
|
|
);
|
|
return result ?? false;
|
|
}
|
|
} |