diff --git a/ios/Podfile b/ios/Podfile index 41d32f019..de6128257 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -40,6 +40,31 @@ target 'Runner' do end post_install do |installer| + # ---- Auto patch: bridge symlink for swift_sdk_local ---- + # local_plugins/chat_api/ios/chat_api/Package.swift 用 path 引用 + # `../../../swift_sdk_local`。Flutter 会把 chat_api 软链进 + # ios/Flutter/ephemeral/Packages/.packages/chat_api,SwiftPM 解析这条相对路径时 + # 用的是软链路径,会去 ios/Flutter/ephemeral/swift_sdk_local 找包。 + # 这里建一条桥接软链让它能找到 local_plugins/swift_sdk_local。 + ephemeral_dir = File.expand_path('Flutter/ephemeral', __dir__) + if Dir.exist?(ephemeral_dir) + bridge_link = File.join(ephemeral_dir, 'swift_sdk_local') + bridge_target = '../../../local_plugins/swift_sdk_local' + # 已存在且指向正确就跳过;否则重建 + needs_create = true + if File.symlink?(bridge_link) + current = File.readlink(bridge_link) + needs_create = (current != bridge_target) + File.delete(bridge_link) if needs_create + elsif File.exist?(bridge_link) + raise "[Podfile patch] #{bridge_link} 已存在但不是软链,无法替换;请手动处理" + end + if needs_create + File.symlink(bridge_target, bridge_link) + puts "[Podfile patch] Created swift_sdk_local bridge symlink: #{bridge_link} -> #{bridge_target}" + end + end + # ---- Auto patch: bump FlutterGeneratedPluginSwiftPackage iOS platform ---- # Flutter 生成的中介包总是写死 .iOS("12.0"),与 Podfile 中的 # platform :ios, '16.0' 不一致,会报 diff --git a/lib/data/models/appconfig.dart b/lib/data/models/appconfig.dart index 8ce31d29f..d24941c85 100644 --- a/lib/data/models/appconfig.dart +++ b/lib/data/models/appconfig.dart @@ -7,7 +7,7 @@ class AppConfig { // true => 首页/发现页切换为精简布局,新手引导跳过 AI 引导步骤 // false => 保持原有布局 // TODO: 后续接入 BLE PID 判断逻辑,B017 设备连接时自动置 true - static bool hideAiAssistant = false; + static bool hideAiAssistant = true; static late UserGetAppConfigResp config; diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 7855674d8..747ab4cc4 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -1000,6 +1000,19 @@ class BleManager extends GetxService { final stsProductKey = _storage.read('sts_product_key') ?? ''; // 使用当前连接设备的 SN(配对时写入),认证失败由原生层上报 credential_failed 事件 final stsDeviceNo = _storage.read('device_sts_code') ?? ''; + // 启动前自检:若上次认证下发的 deviceNo 与当前设备 SN 不一致, + // 说明用户换了设备(或在多台已绑设备间切换),清掉旧凭据强制重新认证。 + // 仅在 STS 模式且两端都有值时做比对,避免误清。 + if (agentMode == 'sts' && stsDeviceNo.isNotEmpty) { + final lastAuthNo = _storage.read('sts_device_no') ?? ''; + if (lastAuthNo.isNotEmpty && lastAuthNo != stsDeviceNo) { + _storage.remove('sts_device_id'); + _storage.remove('sts_device_secret'); + _storage.remove('sts_device_no'); + Logger.i('BleManager', + 'STS 设备 SN 变更($lastAuthNo → $stsDeviceNo),已清除旧凭据,强制重新认证'); + } + } final stsDeviceId = _storage.read('sts_device_id') ?? ''; final stsDeviceSecret = _storage.read('sts_device_secret') ?? ''; // 从 UserDevice 获取当前连接设备的 CMEI diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index e938d4ca9..43735c595 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -1312,6 +1312,7 @@ class PairingController extends GetxController with WidgetsBindingObserver { _storage.remove('device_sts_code'); _storage.remove('sts_device_id'); _storage.remove('sts_device_secret'); + _storage.remove('sts_device_no'); _storage.remove('sts_product_id'); _storage.remove('sts_product_key'); _storage.remove('sts_tui'); diff --git a/local_plugins/chat_api/ios/chat_api/Package.swift b/local_plugins/chat_api/ios/chat_api/Package.swift index 282943946..aa93bb275 100644 --- a/local_plugins/chat_api/ios/chat_api/Package.swift +++ b/local_plugins/chat_api/ios/chat_api/Package.swift @@ -17,12 +17,18 @@ let package = Package( // 改用本地副本:上游 swift-sdk 0.9.0 的 Package.swift 声明 swift-tools-version:6.0 // 会在 Xcode 16 上把 sending 警告升级为错误;且上游 0.10+ 已修改 Tool.Content // 的 case 签名,会导致 MCPClient.swift tuple 解构编译失败。本地副本锁定为 0.9.0 + 5.10。 + // + // 路径 `../../../swift_sdk_local` 是从本插件真实位置 local_plugins/chat_api/ios/chat_api/ + // 算的。Flutter 构建会把本插件软链进 ios/Flutter/ephemeral/Packages/.packages/chat_api, + // SwiftPM 解析此相对路径时基于软链位置 → 会去 ios/Flutter/ephemeral/swift_sdk_local 找。 + // 因此 ios/Podfile 的 post_install 钩子会自动建一条 + // ios/Flutter/ephemeral/swift_sdk_local → local_plugins/swift_sdk_local 的桥接软链。 .package(path: "../../../swift_sdk_local"), .package(path: "../../../location_service/ios/location_service"), .package(path: "../../../music_service/ios/music_service"), .package(path: "../../../qq_music/ios/qq_music"), - + ], targets: [ .target( diff --git a/pubspec.yaml b/pubspec.yaml index 7bad91fa4..b56eb7a96 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: voitrans description: "Voitrans - AI Voice Assistant." publish_to: "none" -version: 1.0.29+104 +version: 1.0.30+105 environment: sdk: ">=3.3.0 <4.0.0"