From e00754847df78975c2dddfac81021c169847073b Mon Sep 17 00:00:00 2001 From: speakeloudest Date: Sun, 25 Jan 2026 20:07:19 -0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=9D=83=E9=99=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner.xcodeproj/project.pbxproj | 42 ++++-------- .../controllers/hi_anti_lost_controller.dart | 9 ++- .../hi_user_info/views/hi_user_info_view.dart | 12 +--- .../controllers/kr_chatwoot_controller.dart | 24 ++----- .../kr_chatwoot/views/kr_chatwoot_view.dart | 66 ++++++------------- 5 files changed, 46 insertions(+), 107 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index ea138b8..1198af1 100755 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -762,11 +762,9 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = PacketTunnel/HiddifyPacketTunnel.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NJRRF427XB; + DEVELOPMENT_TEAM = NJRRF427XB; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -792,7 +790,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).PacketTunnel"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "HiFastVPN-iOS-Pord-PacketTunnel"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -818,11 +815,9 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = PacketTunnel/PacketTunnelRelease.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NJRRF427XB; + DEVELOPMENT_TEAM = NJRRF427XB; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -848,7 +843,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).PacketTunnel"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "HiFastVPN-iOS-Pord-PacketTunnel"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -872,11 +866,9 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = PacketTunnel/HiddifyPacketTunnel.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NJRRF427XB; + DEVELOPMENT_TEAM = NJRRF427XB; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -902,7 +894,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).PacketTunnel"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "HiFastVPN-iOS-Pord-PacketTunnel"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -980,11 +971,9 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NJRRF427XB; + DEVELOPMENT_TEAM = NJRRF427XB; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphoneos*]" = armv7; INFOPLIST_FILE = Runner/Info.plist; @@ -1016,7 +1005,6 @@ "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.taw.hifastvpn; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "HiFastVPN-iOS-Pord"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -1212,11 +1200,9 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NJRRF427XB; + DEVELOPMENT_TEAM = NJRRF427XB; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphoneos*]" = armv7; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; @@ -1248,7 +1234,6 @@ "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.taw.hifastvpn; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "HiFastVPN-iOS-Pord"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -1270,11 +1255,9 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NJRRF427XB; + DEVELOPMENT_TEAM = NJRRF427XB; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphoneos*]" = armv7; INFOPLIST_FILE = Runner/Info.plist; @@ -1306,7 +1289,6 @@ "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.taw.hifastvpn; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "HiFastVPN-iOS-Pord"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; diff --git a/lib/app/modules/hi_anti_lost/controllers/hi_anti_lost_controller.dart b/lib/app/modules/hi_anti_lost/controllers/hi_anti_lost_controller.dart index 622286c..9e213d6 100644 --- a/lib/app/modules/hi_anti_lost/controllers/hi_anti_lost_controller.dart +++ b/lib/app/modules/hi_anti_lost/controllers/hi_anti_lost_controller.dart @@ -38,8 +38,7 @@ class HIAntiLostController extends GetxController { } else { // Mobile: Use Gal to save to gallery // Check permission - final hasAccess = await Gal.hasAccess(); - if (!hasAccess) { + if (!await Gal.hasAccess()) { await Gal.requestAccess(); } @@ -51,7 +50,11 @@ class HIAntiLostController extends GetxController { } catch (e) { debugPrint("Save image error: $e"); if (e is GalException) { - KRCommonUtil.kr_showToast("保存失败: No Permission"); + if (e.type == GalExceptionType.accessDenied) { + await Gal.requestAccess(); + } else { + KRCommonUtil.kr_showToast("保存失败: ${e.type.name}"); + } } else { KRCommonUtil.kr_showToast("保存失败: $e"); } diff --git a/lib/app/modules/hi_user_info/views/hi_user_info_view.dart b/lib/app/modules/hi_user_info/views/hi_user_info_view.dart index 045a703..2ab67a2 100755 --- a/lib/app/modules/hi_user_info/views/hi_user_info_view.dart +++ b/lib/app/modules/hi_user_info/views/hi_user_info_view.dart @@ -74,15 +74,9 @@ class HIUserInfoView extends GetView { mainAxisAlignment: MainAxisAlignment.center, children: [ Obx(() { - final account = KRAppRunData.getInstance() - .kr_account - .value; - final isDeviceLogin = account != null && - account.startsWith('9000'); - final accountText = (account == null || - isDeviceLogin) - ? '待绑定' - : '${KRAppRunData.getInstance().kr_account.value.toString()}'; + final authType = KRAppRunData.getInstance().kr_authType.value; + final accountText = authType == 'email' ? '${KRAppRunData.getInstance().kr_account.value.toString()}' : '待绑定'; + return Text( accountText, style: TextStyle( diff --git a/lib/app/modules/kr_chatwoot/controllers/kr_chatwoot_controller.dart b/lib/app/modules/kr_chatwoot/controllers/kr_chatwoot_controller.dart index b683fc8..a255c00 100644 --- a/lib/app/modules/kr_chatwoot/controllers/kr_chatwoot_controller.dart +++ b/lib/app/modules/kr_chatwoot/controllers/kr_chatwoot_controller.dart @@ -11,37 +11,25 @@ class KRChatwootController { final String baseUrl = 'https://app.chatwoot.com'; final String inboxIdentifier = 'YXQmh16ymNYW1SVybhnoQQ9w'; - KRChatwootController() { - KRSecureStorage().kr_readData(key: 'USER_INFO').then((value) { - print('KRSecureStorage_keyUserInfo: $value'); - }); - } - /// 获取当前用户信息 /// 建议从你的全局 UserState 或本地存储中动态获取 ChatwootUser get chatUser { final appRunData = KRAppRunData.getInstance(); - final userId = appRunData.kr_userId.value?.toString(); final deviceId = appRunData.deviceId; + final authType = appRunData.kr_authType; final account = appRunData.kr_account.value; - // 优先使用 userId 作为唯一标识,如果没有则使用 deviceId - final identifier = userId ?? deviceId ?? 'unknown_user'; - - // 名字使用账号,如果没有则显示 Guest - final name = account ?? 'Guest'; - // 邮箱如果是邮箱格式则使用,否则构造一个唯一的虚拟邮箱以满足格式要求 String email = ''; - if (account != null && account.contains('@')) { - email = account; + if (authType == 'device') { + email = account.toString(); } else { - email = '$identifier@hifastvpn.com'; + email = '待绑定$deviceId'; } return ChatwootUser( - identifier: identifier, // 必填:用于关联历史聊天记录 - name: name, + identifier: account, // 必填:用于关联历史聊天记录 + name: deviceId, email: email, ); } diff --git a/lib/app/modules/kr_chatwoot/views/kr_chatwoot_view.dart b/lib/app/modules/kr_chatwoot/views/kr_chatwoot_view.dart index 01d8d4b..f6edcd5 100644 --- a/lib/app/modules/kr_chatwoot/views/kr_chatwoot_view.dart +++ b/lib/app/modules/kr_chatwoot/views/kr_chatwoot_view.dart @@ -14,56 +14,28 @@ class _KRChatwootViewState extends State { // 实例化控制器 final KRChatwootController _controller = KRChatwootController(); - // 控制加载遮罩状态 - bool _isPageLoading = true; - @override Widget build(BuildContext context) { - return Scaffold( - // 设置背景色为白色,确保顶部 20px 区域不漏出底色 - backgroundColor: Colors.white, - body: Padding( - // 在这里设置顶部 20px 的间距 - padding: const EdgeInsets.only(top: 20.0), - child: Stack( - children: [ - ChatwootWidget( - baseUrl: _controller.baseUrl, - websiteToken: _controller.inboxIdentifier, - user: _controller.chatUser, - locale: "zh_CN", - onAttachFile: _controller.onFilePicker, - onLoadStarted: () { - debugPrint("KRChatwoot: 开始加载 SDK"); - }, - closeWidget: () { - print('返回'); - Get.back(); - }, - onLoadCompleted: () { - debugPrint("KRChatwoot: SDK 加载完毕"); - if (mounted) { - setState(() => _isPageLoading = false); - } - }, - ), + // 获取系统状态栏高度 + final double statusBarHeight = MediaQuery.of(context).padding.top; - // 加载中的占位图 - if (_isPageLoading) - Container( - color: Colors.white, - child: const Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CircularProgressIndicator(strokeWidth: 2), - const SizedBox(height: 16), - Text("正在连接客服...", style: TextStyle(color: Colors.grey)), - ], - ), - ), - ), - ], + return Scaffold( + backgroundColor: const Color(0xFFF9F9FB), + body: SafeArea( + top: false, // 依然保持禁用自动顶部保护 + child: Padding( + // 在状态栏高度的基础上减去 10 像素,实现向上移动 + padding: EdgeInsets.only(top: statusBarHeight - 10), + child: ChatwootWidget( + baseUrl: _controller.baseUrl, + websiteToken: _controller.inboxIdentifier, + user: _controller.chatUser, + locale: "zh_CN", + onAttachFile: _controller.onFilePicker, + onLoadStarted: () => debugPrint("KRChatwoot: 开始加载 SDK"), + closeWidget: () => Get.back(), + onLoadCompleted: () => debugPrint("KRChatwoot: SDK 加载完毕"), + ), ), ), );