From d409de96a78e5d2ebedd5402b7f2715aaa263800 Mon Sep 17 00:00:00 2001 From: wolfplus Date: Wed, 28 May 2025 21:03:29 +0100 Subject: [PATCH] add --- ios/Podfile.lock | 225 ---- ios/Runner.xcodeproj/project.pbxproj | 28 +- ios/Runner.xcodeproj/project.pbxproj.backup | 804 ------------- .../xcshareddata/swiftpm/Package.resolved | 208 +++- .../xcshareddata/xcschemes/Runner.xcscheme | 18 + .../xcshareddata/swiftpm/Package.resolved | 208 +++- lib/data/services/ble_manager.dart | 102 +- lib/data/services/bluetooth_manager.dart | 2 + .../home/controllers/home_controller.dart | 1 - .../controllers/pairing_controller.dart | 1036 +++++++++-------- lib/modules/pairing/views/pairing_view.dart | 380 +++--- .../ble_service/BleServicePlugin.kt | 17 + .../ios/Classes/BleAccessorySetup.swift | 80 +- .../ios/Classes/SwiftBleServicePlugin.swift | 141 ++- .../ble_service/lib/ble_service.dart | 13 + macos/Podfile.lock | 181 --- macos/Runner.xcodeproj/project.pbxproj | 40 +- .../xcshareddata/swiftpm/Package.resolved | 159 +++ .../xcshareddata/xcschemes/Runner.xcscheme | 18 + .../xcschemes/Runner.xcscheme.backup | 99 ++ .../xcshareddata/swiftpm/Package.resolved | 159 +++ 21 files changed, 1955 insertions(+), 1964 deletions(-) delete mode 100644 ios/Runner.xcodeproj/project.pbxproj.backup create mode 100644 macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.backup create mode 100644 macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 71c4d5dee..ae770a2e7 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -5,16 +5,6 @@ PODS: - chat_storage - Flutter - open_ai_service - - app_settings (5.1.1): - - Flutter - - AppAuth (1.7.6): - - AppAuth/Core (= 1.7.6) - - AppAuth/ExternalUserAgent (= 1.7.6) - - AppAuth/Core (1.7.6) - - AppAuth/ExternalUserAgent (1.7.6): - - AppAuth/Core - - audio_session (0.0.1): - - Flutter - audio_waveforms (0.0.1): - Flutter - azure_speech (0.0.1): @@ -30,37 +20,6 @@ PODS: - Flutter - device_info_plus (0.0.1): - Flutter - - DKImagePickerController/Core (4.3.9): - - DKImagePickerController/ImageDataManager - - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.9) - - DKImagePickerController/PhotoGallery (4.3.9): - - DKImagePickerController/Core - - DKPhotoGallery - - DKImagePickerController/Resource (4.3.9) - - DKPhotoGallery (0.0.19): - - DKPhotoGallery/Core (= 0.0.19) - - DKPhotoGallery/Model (= 0.0.19) - - DKPhotoGallery/Preview (= 0.0.19) - - DKPhotoGallery/Resource (= 0.0.19) - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Core (0.0.19): - - DKPhotoGallery/Model - - DKPhotoGallery/Preview - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Model (0.0.19): - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Preview (0.0.19): - - DKPhotoGallery/Model - - DKPhotoGallery/Resource - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Resource (0.0.19): - - SDWebImage - - SwiftyGif - FBAEMKit (17.1.0): - FBSDKCoreKit_Basics (= 17.1.0) - FBSDKCoreKit (17.1.0): @@ -69,44 +28,7 @@ PODS: - FBSDKCoreKit_Basics (17.1.0) - FBSDKLoginKit (17.1.0): - FBSDKCoreKit (= 17.1.0) - - file_picker (0.0.1): - - DKImagePickerController/PhotoGallery - - Flutter - - Firebase/Auth (11.10.0): - - Firebase/CoreOnly - - FirebaseAuth (~> 11.10.0) - - Firebase/CoreOnly (11.10.0): - - FirebaseCore (~> 11.10.0) - - firebase_auth (5.5.2): - - Firebase/Auth (= 11.10.0) - - firebase_core - - Flutter - - firebase_core (3.13.0): - - Firebase/CoreOnly (= 11.10.0) - - Flutter - - FirebaseAppCheckInterop (11.13.0) - - FirebaseAuth (11.10.0): - - FirebaseAppCheckInterop (~> 11.0) - - FirebaseAuthInterop (~> 11.0) - - FirebaseCore (~> 11.10.0) - - FirebaseCoreExtension (~> 11.10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/Environment (~> 8.0) - - GTMSessionFetcher/Core (< 5.0, >= 3.4) - - RecaptchaInterop (~> 101.0) - - FirebaseAuthInterop (11.13.0) - - FirebaseCore (11.10.0): - - FirebaseCoreInternal (~> 11.10.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreExtension (11.10.0): - - FirebaseCore (~> 11.10.0) - - FirebaseCoreInternal (11.10.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - Flutter (1.0.0) - - flutter_blue_plus_darwin (0.0.2): - - Flutter - - FlutterMacOS - flutter_facebook_auth (7.1.1): - FBSDKLoginKit (~> 17.1.0) - Flutter @@ -127,54 +49,10 @@ PODS: - fluwx/pay (0.0.1): - Flutter - WechatOpenSDK-XCFramework (~> 2.0.4) - - google_sign_in_ios (0.0.1): - - AppAuth (>= 1.7.4) - - Flutter - - FlutterMacOS - - GoogleSignIn (~> 7.1) - - GTMSessionFetcher (>= 3.4.0) - - GoogleSignIn (7.1.0): - - AppAuth (< 2.0, >= 1.7.3) - - GTMAppAuth (< 5.0, >= 4.1.1) - - GTMSessionFetcher/Core (~> 3.3) - - GoogleUtilities/AppDelegateSwizzler (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.0): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.0)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.0) - - GoogleUtilities/Reachability (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GTMAppAuth (4.1.1): - - AppAuth/Core (~> 1.7) - - GTMSessionFetcher/Core (< 4.0, >= 3.3) - - GTMSessionFetcher (3.5.0): - - GTMSessionFetcher/Full (= 3.5.0) - - GTMSessionFetcher/Core (3.5.0) - - GTMSessionFetcher/Full (3.5.0): - - GTMSessionFetcher/Core - haptic_feedback (0.5.1): - Flutter - - image_picker_ios (0.0.1): - - Flutter - jl_ota (0.0.1): - Flutter - - just_audio (0.0.1): - - Flutter - - FlutterMacOS - libwebp (1.5.0): - libwebp/demux (= 1.5.0) - libwebp/mux (= 1.5.0) @@ -195,11 +73,6 @@ PODS: - Flutter - open_ai_service (0.0.1): - Flutter - - package_info_plus (0.4.5): - - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - permission_handler_apple (9.3.0): - Flutter - QCloudCore (6.4.7): @@ -211,7 +84,6 @@ PODS: - QCloudCOSXML/Default (6.4.7): - QCloudCore (= 6.4.7) - QCloudTrack/Beacon (6.4.7) - - RecaptchaInterop (101.0.0) - record_darwin (1.0.0): - Flutter - SDWebImage (5.21.0): @@ -220,104 +92,61 @@ PODS: - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) - - share_plus (0.0.1): - - Flutter - speech (0.0.1): - Flutter - spotify_sdk (0.0.1): - Flutter - - sqflite_darwin (0.0.4): - - Flutter - - FlutterMacOS - - SwiftyGif (5.4.5) - tencentcloud_cos_sdk_plugin (1.2.3): - Flutter - QCloudCOSXML (= 6.4.7) - - webview_flutter_wkwebview (0.0.1): - - Flutter - - FlutterMacOS - WechatOpenSDK-XCFramework (2.0.4) - YbridOpus (0.8.0) DEPENDENCIES: - agent_service (from `.symlinks/plugins/agent_service/ios`) - - app_settings (from `.symlinks/plugins/app_settings/ios`) - - audio_session (from `.symlinks/plugins/audio_session/ios`) - audio_waveforms (from `.symlinks/plugins/audio_waveforms/ios`) - azure_speech (from `.symlinks/plugins/azure_speech/ios`) - ble_service (from `.symlinks/plugins/ble_service/ios`) - chat_storage (from `.symlinks/plugins/chat_storage/ios`) - classic_bluetooth (from `.symlinks/plugins/classic_bluetooth/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - file_picker (from `.symlinks/plugins/file_picker/ios`) - - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - Flutter (from `Flutter`) - - flutter_blue_plus_darwin (from `.symlinks/plugins/flutter_blue_plus_darwin/darwin`) - flutter_facebook_auth (from `.symlinks/plugins/flutter_facebook_auth/ios`) - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_tts (from `.symlinks/plugins/flutter_tts/ios`) - fluwx (from `.symlinks/plugins/fluwx/ios`) - - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) - haptic_feedback (from `.symlinks/plugins/haptic_feedback/ios`) - - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - jl_ota (from `.symlinks/plugins/jl_ota/ios`) - - just_audio (from `.symlinks/plugins/just_audio/darwin`) - music_service (from `.symlinks/plugins/music_service/ios`) - open_ai_service (from `.symlinks/plugins/open_ai_service/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - record_darwin (from `.symlinks/plugins/record_darwin/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - speech (from `.symlinks/plugins/speech/ios`) - spotify_sdk (from `.symlinks/plugins/spotify_sdk/ios`) - - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - tencentcloud_cos_sdk_plugin (from `.symlinks/plugins/tencentcloud_cos_sdk_plugin/ios`) - - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`) SPEC REPOS: trunk: - - AppAuth - - DKImagePickerController - - DKPhotoGallery - FBAEMKit - FBSDKCoreKit - FBSDKCoreKit_Basics - FBSDKLoginKit - - Firebase - - FirebaseAppCheckInterop - - FirebaseAuth - - FirebaseAuthInterop - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - - GoogleSignIn - - GoogleUtilities - - GTMAppAuth - - GTMSessionFetcher - libwebp - Mantle - MicrosoftCognitiveServicesSpeech-iOS - QCloudCore - QCloudCOSXML - QCloudTrack - - RecaptchaInterop - SDWebImage - SDWebImageWebPCoder - - SwiftyGif - WechatOpenSDK-XCFramework - YbridOpus EXTERNAL SOURCES: agent_service: :path: ".symlinks/plugins/agent_service/ios" - app_settings: - :path: ".symlinks/plugins/app_settings/ios" - audio_session: - :path: ".symlinks/plugins/audio_session/ios" audio_waveforms: :path: ".symlinks/plugins/audio_waveforms/ios" azure_speech: @@ -330,16 +159,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/classic_bluetooth/ios" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" - file_picker: - :path: ".symlinks/plugins/file_picker/ios" - firebase_auth: - :path: ".symlinks/plugins/firebase_auth/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" Flutter: :path: Flutter - flutter_blue_plus_darwin: - :path: ".symlinks/plugins/flutter_blue_plus_darwin/darwin" flutter_facebook_auth: :path: ".symlinks/plugins/flutter_facebook_auth/ios" flutter_image_compress_common: @@ -352,107 +173,61 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_tts/ios" fluwx: :path: ".symlinks/plugins/fluwx/ios" - google_sign_in_ios: - :path: ".symlinks/plugins/google_sign_in_ios/darwin" haptic_feedback: :path: ".symlinks/plugins/haptic_feedback/ios" - image_picker_ios: - :path: ".symlinks/plugins/image_picker_ios/ios" jl_ota: :path: ".symlinks/plugins/jl_ota/ios" - just_audio: - :path: ".symlinks/plugins/just_audio/darwin" music_service: :path: ".symlinks/plugins/music_service/ios" open_ai_service: :path: ".symlinks/plugins/open_ai_service/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" permission_handler_apple: :path: ".symlinks/plugins/permission_handler_apple/ios" record_darwin: :path: ".symlinks/plugins/record_darwin/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" speech: :path: ".symlinks/plugins/speech/ios" spotify_sdk: :path: ".symlinks/plugins/spotify_sdk/ios" - sqflite_darwin: - :path: ".symlinks/plugins/sqflite_darwin/darwin" tencentcloud_cos_sdk_plugin: :path: ".symlinks/plugins/tencentcloud_cos_sdk_plugin/ios" - webview_flutter_wkwebview: - :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" SPEC CHECKSUMS: agent_service: a95166e1939f18436aa2ae6b80c17751a2f69b89 - app_settings: 5127ae0678de1dcc19f2293271c51d37c89428b2 - AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 - audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0 audio_waveforms: a6dde7fe7c0ea05f06ffbdb0f7c1b2b2ba6cedcf azure_speech: 23c6573d04e7f84a0839e935e527c87b5f78311f ble_service: 9f394ad44d435010e718bc81de494d9425295a85 chat_storage: 933a96144157a07a2fef7f6acb28c78ff18465d8 classic_bluetooth: c146e1618e867a47fa7ab79a3bf262e7d69d557d device_info_plus: 71ffc6ab7634ade6267c7a93088ed7e4f74e5896 - DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c - DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 FBAEMKit: cb719c53575a3be86ea873279f30d6a2c4e15881 FBSDKCoreKit: ecdb980a24633ccb012700299ceb16d0235e14d2 FBSDKCoreKit_Basics: 045101c4a9ef10c845347424d73a29aae02c3e43 FBSDKLoginKit: 69eb59b2f839aba635616df6e422acd0ca88030a - file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be - Firebase: 1fe1c0a7d9aaea32efe01fbea5f0ebd8d70e53a2 - firebase_auth: 34c515a8fa76a4ef678ac5ad5cfa3bb3120f5ab5 - firebase_core: 2d4534e7b489907dcede540c835b48981d890943 - FirebaseAppCheckInterop: 72066489c209823649a997132bcd9269bc33a4bb - FirebaseAuth: c4146bdfdc87329f9962babd24dae89373f49a32 - FirebaseAuthInterop: 4fa327ec3c551a80a6929561f83af80b1dd44937 - FirebaseCore: 8344daef5e2661eb004b177488d6f9f0f24251b7 - FirebaseCoreExtension: 6f357679327f3614e995dc7cf3f2d600bdc774ac - FirebaseCoreInternal: ef4505d2afb1d0ebbc33162cb3795382904b5679 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_blue_plus_darwin: 09444a26fb6bdef523e55b68fc1c59af5a877ea6 flutter_facebook_auth: 8a9ad5fbfc25b77e7a53ea8986866950b27edcae flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1 flutter_local_notifications: 395056b3175ba4f08480a7c5de30cd36d69827e4 flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 flutter_tts: b88dbc8655d3dc961bc4a796e4e16a4cc1795833 fluwx: 6bf9c5a3a99ad31b0de137dd92370a0d10a60f4b - google_sign_in_ios: 19297361f2c51d7d8ac0201b866ef1fa5d1f94a8 - GoogleSignIn: d4281ab6cf21542b1cfaff85c191f230b399d2db - GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de - GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 haptic_feedback: fd1d8509833f58f164fc12122c0357fa9b2750e0 - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a jl_ota: 5fa90bf47674de0f5bce9af2219e25fa0c1425f5 - just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d MicrosoftCognitiveServicesSpeech-iOS: 766852ccd56e0c74bafbe9ea7033083c5f748d04 music_service: 85abecc8fa21599a06907ad50d83f48a58e0dc0d open_ai_service: d78dff9359ee4c04f20d250d655d6ec75b4c5434 - package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d QCloudCore: 49e7571984a8e5fd8f0fd58c2f3b806255796223 QCloudCOSXML: 7205e76aa9cf613468222615483c9d7c074e4298 QCloudTrack: 3b53a7fc4fe3920e407f2aa73f2452992a61f7f3 - RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba record_darwin: fb1f375f1d9603714f55b8708a903bbb91ffdb0a SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868 SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 - share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a speech: 89e648ea83c83d32b25ad2247fdec80fdddd7fb6 spotify_sdk: a48400bb29f70c4fe251ebfdc9135c37097ac5ca - sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 - SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 tencentcloud_cos_sdk_plugin: c3d78b2c3bae42b5a20009dc047f3f1621e6272b - webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2 WechatOpenSDK-XCFramework: 36fb2bea0754266c17184adf4963d7e6ff98b69f YbridOpus: e9af373b9b38acff3702d9a3bd97cae3c232887c diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index bdb0f3204..5f9b20d6c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -7,12 +7,12 @@ objects = { /* Begin PBXBuildFile section */ - 0A000A2C2DE1EE50005BE0F2 /* Opus in Frameworks */ = {isa = PBXBuildFile; productRef = 0A000A2B2DE1EE50005BE0F2 /* Opus */; }; 0AD944122DD9DB5C00557D21 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0AD944112DD9DB5C00557D21 /* GoogleService-Info.plist */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -77,7 +77,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0A000A2C2DE1EE50005BE0F2 /* Opus in Frameworks */, + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, 9EB82175436F3A3D593E4423 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -214,6 +214,9 @@ dependencies = ( ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; @@ -248,7 +251,7 @@ ); mainGroup = 97C146E51CF9000F007C117D; packageReferences = ( - 0A000A2A2DE1EE50005BE0F2 /* XCRemoteSwiftPackageReference "swift-opus" */, + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; @@ -769,22 +772,17 @@ }; /* End XCConfigurationList section */ -/* Begin XCRemoteSwiftPackageReference section */ - 0A000A2A2DE1EE50005BE0F2 /* XCRemoteSwiftPackageReference "swift-opus" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/alta/swift-opus.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.0.2; - }; +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; }; -/* End XCRemoteSwiftPackageReference section */ +/* End XCLocalSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 0A000A2B2DE1EE50005BE0F2 /* Opus */ = { + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { isa = XCSwiftPackageProductDependency; - package = 0A000A2A2DE1EE50005BE0F2 /* XCRemoteSwiftPackageReference "swift-opus" */; - productName = Opus; + productName = FlutterGeneratedPluginSwiftPackage; }; /* End XCSwiftPackageProductDependency section */ }; diff --git a/ios/Runner.xcodeproj/project.pbxproj.backup b/ios/Runner.xcodeproj/project.pbxproj.backup deleted file mode 100644 index 020a2d883..000000000 --- a/ios/Runner.xcodeproj/project.pbxproj.backup +++ /dev/null @@ -1,804 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 0AD3C3772DDE122500FD4F41 /* Opus in Frameworks */ = {isa = PBXBuildFile; productRef = 0AD3C3762DDE122500FD4F41 /* Opus */; }; - 0AD3C37C2DDE142500FD4F41 /* Opus in Frameworks */ = {isa = PBXBuildFile; productRef = 0AD3C37B2DDE142500FD4F41 /* Opus */; }; - 0AD944122DD9DB5C00557D21 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0AD944112DD9DB5C00557D21 /* GoogleService-Info.plist */; }; - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B11F80E69458BE0D0F2DA890 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DB4CB5146DA70CF43D67A5B /* Pods_Runner.framework */; }; - B3D1A46E14BD3B07986EF8CD /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C3583A880BAF5E80CA0405 /* Pods_RunnerTests.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0AD944112DD9DB5C00557D21 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 0AD944132DDA0C0D00557D21 /* AccessorySetupKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AccessorySetupKit.framework; path = System/Library/Frameworks/AccessorySetupKit.framework; sourceTree = SDKROOT; }; - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1DE8AF4A64ABDD75043084FC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 209BB2477C918E1C69F5F1E0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3CFCAD0427BE38C23B922B35 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6DB4CB5146DA70CF43D67A5B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 85F42A75E97670A970955821 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D2958658C06A5ADF62D6ABA2 /* Runner.entitlements */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - E75F8D421A56891E8C81AD82 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - F9C3583A880BAF5E80CA0405 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FD4B933141D4D3B35A169527 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0AD3C3772DDE122500FD4F41 /* Opus in Frameworks */, - 0AD3C37C2DDE142500FD4F41 /* Opus in Frameworks */, - B11F80E69458BE0D0F2DA890 /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B3515CD9628E3332AFC88CD4 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - B3D1A46E14BD3B07986EF8CD /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1ACB686EC7DC36C6E33D372F /* Pods */ = { - isa = PBXGroup; - children = ( - 3CFCAD0427BE38C23B922B35 /* Pods-Runner.debug.xcconfig */, - 85F42A75E97670A970955821 /* Pods-Runner.release.xcconfig */, - 1DE8AF4A64ABDD75043084FC /* Pods-Runner.profile.xcconfig */, - 209BB2477C918E1C69F5F1E0 /* Pods-RunnerTests.debug.xcconfig */, - E75F8D421A56891E8C81AD82 /* Pods-RunnerTests.release.xcconfig */, - FD4B933141D4D3B35A169527 /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 1E5DDD8701F6FB27AA502080 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 0AD944132DDA0C0D00557D21 /* AccessorySetupKit.framework */, - 6DB4CB5146DA70CF43D67A5B /* Pods_Runner.framework */, - F9C3583A880BAF5E80CA0405 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 331C8082294A63A400263BE5 /* RunnerTests */, - 1ACB686EC7DC36C6E33D372F /* Pods */, - 1E5DDD8701F6FB27AA502080 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - 331C8081294A63A400263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 0AD944112DD9DB5C00557D21 /* GoogleService-Info.plist */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - D2958658C06A5ADF62D6ABA2 /* Runner.entitlements */, - ); - path = Runner; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C8080294A63A400263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - B6E8833064FA9BB82F279A0E /* [CP] Check Pods Manifest.lock */, - 331C807D294A63A400263BE5 /* Sources */, - 331C807F294A63A400263BE5 /* Resources */, - B3515CD9628E3332AFC88CD4 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 331C8086294A63A400263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - B77B7F8E420C3F7B653C6205 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 1D3D5881CA405E420076D1F6 /* [CP] Embed Pods Frameworks */, - C482126191919ADDA94A189A /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C8080294A63A400263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 97C146ED1CF9000F007C117D; - }; - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - 331C8080294A63A400263BE5 /* RunnerTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C807F294A63A400263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 0AD944122DD9DB5C00557D21 /* GoogleService-Info.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 1D3D5881CA405E420076D1F6 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - B6E8833064FA9BB82F279A0E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - B77B7F8E420C3F7B653C6205 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - C482126191919ADDA94A189A /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C807D294A63A400263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 42C82SZUVX; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 331C8088294A63A400263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 209BB2477C918E1C69F5F1E0 /* Pods-RunnerTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Debug; - }; - 331C8089294A63A400263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E75F8D421A56891E8C81AD82 /* Pods-RunnerTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Release; - }; - 331C808A294A63A400263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FD4B933141D4D3B35A169527 /* Pods-RunnerTests.profile.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 42C82SZUVX; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 42C82SZUVX; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C8088294A63A400263BE5 /* Debug */, - 331C8089294A63A400263BE5 /* Release */, - 331C808A294A63A400263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 0AD3C3752DDE122500FD4F41 /* XCRemoteSwiftPackageReference "swift-opus" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/alta/swift-opus"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.0.2; - }; - }; - 0AD3C37A2DDE139600FD4F41 /* XCRemoteSwiftPackageReference "swift-opus" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/alta/swift-opus"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.0.2; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 0AD3C3762DDE122500FD4F41 /* Opus */ = { - isa = XCSwiftPackageProductDependency; - package = 0AD3C3752DDE122500FD4F41 /* XCRemoteSwiftPackageReference "swift-opus" */; - productName = Opus; - }; - 0AD3C37B2DDE142500FD4F41 /* Opus */ = { - isa = XCSwiftPackageProductDependency; - package = 0AD3C37A2DDE139600FD4F41 /* XCRemoteSwiftPackageReference "swift-opus" */; - productName = Opus; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e46b9f272..3deebfc3a 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,13 +1,211 @@ { - "originHash" : "3bbe9184760d5715845aa676511151065063c01ce6fa9d799d52968e5a2c53e8", + "originHash" : "fb7ecff82f4ff109531189491cc6cc2299a7357c61874f58bae1e0f7b7d9e8d0", "pins" : [ { - "identity" : "swift-opus", + "identity" : "abseil-cpp-binary", "kind" : "remoteSourceControl", - "location" : "https://github.com/alta/swift-opus", + "location" : "https://github.com/google/abseil-cpp-binary.git", "state" : { - "revision" : "5f0164b8915fb9001265c54413aa0f0efbd3df06", - "version" : "0.0.2" + "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", + "version" : "1.2024072200.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "61b85103a1aeed8218f17c794687781505fbbef5", + "version" : "11.2.0" + } + }, + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "2781038865a80e2c425a1da12cc1327bcd56501f", + "version" : "1.7.6" + } + }, + { + "identity" : "dkcamera", + "kind" : "remoteSourceControl", + "location" : "https://github.com/zhangao0086/DKCamera", + "state" : { + "branch" : "master", + "revision" : "5c691d11014b910aff69f960475d70e65d9dcc96" + } + }, + { + "identity" : "dkimagepickercontroller", + "kind" : "remoteSourceControl", + "location" : "https://github.com/zhangao0086/DKImagePickerController", + "state" : { + "branch" : "4.3.9", + "revision" : "0bdfeacefa308545adde07bef86e349186335915" + } + }, + { + "identity" : "dkphotogallery", + "kind" : "remoteSourceControl", + "location" : "https://github.com/zhangao0086/DKPhotoGallery", + "state" : { + "branch" : "master", + "revision" : "311c1bc7a94f1538f82773a79c84374b12a2ef3d" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "3663b1aa6c7a1bed67ee80fd09dc6d0f9c3bb660", + "version" : "11.13.0" + } + }, + { + "identity" : "flutterfire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/flutterfire", + "state" : { + "revision" : "a80a123386fd4904cad6938673020a7bcf31b2f2", + "version" : "3.13.0-firebase-core-swift" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "543071966b3fb6613a2fc5c6e7112d1e998184a7", + "version" : "11.13.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googlesignin-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleSignIn-iOS.git", + "state" : { + "revision" : "a7965d134c5d3567026c523e0a8a583f73b62b0d", + "version" : "7.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "60da361632d0de02786f709bdc0c4df340f7613e", + "version" : "8.1.0" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "cc0001a0cf963aa40501d9c2b181e7fc9fd8ec71", + "version" : "1.69.0" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b", + "version" : "3.5.0" + } + }, + { + "identity" : "gtmappauth", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GTMAppAuth.git", + "state" : { + "revision" : "5d7d66f647400952b1758b230e019b07c0b4b22a", + "version" : "4.1.1" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", + "version" : "101.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "sdwebimage", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SDWebImage/SDWebImage", + "state" : { + "revision" : "cac9a55a3ae92478a2c95042dcc8d9695d2129ca", + "version" : "5.21.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "d72aed98f8253ec1aa9ea1141e28150f408cf17f", + "version" : "1.29.0" + } + }, + { + "identity" : "swiftygif", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kirualex/SwiftyGif.git", + "state" : { + "revision" : "4430cbc148baa3907651d40562d96325426f409a", + "version" : "5.4.5" + } + }, + { + "identity" : "tocropviewcontroller", + "kind" : "remoteSourceControl", + "location" : "https://github.com/TimOliver/TOCropViewController", + "state" : { + "revision" : "a634cb7cdfd580006e79a6e74e64417fe9e9783b", + "version" : "2.7.4" } } ], diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 15cada483..d795332e1 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + _connectionState.value; + // 公开的连接状态流,供外部监听 + RxInt get connectionStateRx => _connectionState; + // 连接状态监听 final _isConnected = false.obs; bool get isConnected => _isConnected.value; @@ -151,12 +153,15 @@ class BleManager extends GetxService { // 监听BLE状态更新 _statusSubscription = _bleService.onStatusUpdated.listen( (event) { - if (event is Map) { // 处理连接状态更新 if (event['type'] == 'connectionStateChanged') { final state = event['state'] as int; + final oldState = _connectionState.value; _connectionState.value = state; + + Logger.d('BleManager', '🔄 BLE状态更新: $oldState → $state'); + Logger.d('BleManager', '📡 通知监听器状态变化: ${_connectionState.value}'); // 连接状态转换 if (state == BleConnectionState.connected) { @@ -187,15 +192,6 @@ class BleManager extends GetxService { ); // 监听BLE数据流 - _dataSubscription = _bleService.onDataReceived.listen( - (data) { - Logger.info('接收到BLE数据: $data'); - // 在这里处理来自设备的数据 - }, - onError: (error) { - Logger.error('BLE数据流错误: $error'); - }, - ); } catch (e) { Logger.error('设置BLE事件监听器失败: ${e.toString()}'); } @@ -655,6 +651,84 @@ class BleManager extends GetxService { } } + // ==================== 配对相关方法 ==================== + + /// 检查设备是否支持Companion Device Manager + Future isCompanionSupported() async { + try { + return await _bleService.isCompanionSupported(); + } catch (e) { + Logger.error('检查Companion支持失败: ${e.toString()}'); + return false; + } + } + + /// 获取已配对的MAC地址 + Future getPairedMacAddress() async { + try { + return await _bleService.getPairedMacAddress(); + } catch (e) { + Logger.error('获取已配对MAC地址失败: ${e.toString()}'); + return null; + } + } + + /// 检查BLE连接状态 + Future isBleConnected() async { + try { + return await _bleService.isBleConnected(); + } catch (e) { + Logger.error('检查BLE连接状态失败: ${e.toString()}'); + return false; + } + } + + /// 验证设备是否可以配对 + Future verifyDeviceCanPair(String macAddress) async { + try { + return true; + } catch (e) { + Logger.error('验证设备配对失败: ${e.toString()}'); + return false; + } + } + + /// 启动设备关联 + Future startDeviceAssociation({ + required String deviceNamePattern, + required String macAddress, + }) async { + try { + return await _bleService.startDeviceAssociation( + deviceNamePattern: deviceNamePattern, + macAddress: macAddress, + ); + } catch (e) { + Logger.error('启动设备关联失败: ${e.toString()}'); + return false; + } + } + + /// 注册后台扫描 + Future registerBackgroundScan({String? macAddress}) async { + try { + return await _bleService.registerBackgroundScan(macAddress: macAddress); + } catch (e) { + Logger.error('注册后台扫描失败: ${e.toString()}'); + return false; + } + } + + /// 注销后台扫描 + Future unregisterBackgroundScan() async { + try { + return await _bleService.unregisterBackgroundScan(); + } catch (e) { + Logger.error('注销后台扫描失败: ${e.toString()}'); + return false; + } + } + /// 注册服务 static Future init() async { if (!Get.isRegistered()) { diff --git a/lib/data/services/bluetooth_manager.dart b/lib/data/services/bluetooth_manager.dart index c52a7f4b5..eaa6844e5 100644 --- a/lib/data/services/bluetooth_manager.dart +++ b/lib/data/services/bluetooth_manager.dart @@ -3,6 +3,8 @@ import 'package:get/get.dart'; import 'package:classic_bluetooth/classic_bluetooth.dart'; import 'package:deep_voice/core/utils/logger.dart'; +// 重新导出蓝牙设备类型,让外部可以通过BluetoothManager访问 +export 'package:classic_bluetooth/classic_bluetooth.dart' show BluetoothDevice; /// 蓝牙服务 - 管理经典蓝牙服务 class BluetoothManager extends GetxService { diff --git a/lib/modules/home/controllers/home_controller.dart b/lib/modules/home/controllers/home_controller.dart index 501918a38..f946e1e04 100644 --- a/lib/modules/home/controllers/home_controller.dart +++ b/lib/modules/home/controllers/home_controller.dart @@ -3,7 +3,6 @@ import 'dart:async'; import '../../../routes/app_routes.dart'; import '../../../core/utils/logger.dart'; import 'package:flutter/material.dart'; -import 'package:classic_bluetooth/classic_bluetooth.dart' show BluetoothDevice; import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/ble_manager.dart'; diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index a70531eaf..471c0b388 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -6,592 +6,650 @@ import '../../../routes/app_routes.dart'; import '../../../core/utils/logger.dart'; import 'dart:io'; import '../../../data/services/bluetooth_manager.dart'; -import 'package:classic_bluetooth/classic_bluetooth.dart' show BluetoothDevice; import '../../../data/services/ble_manager.dart'; -import 'package:ble_service/ble_service.dart'; -import 'package:flutter/material.dart'; -/// 配对控制器,负责检查蓝牙权限、状态,并处理配对流程 +/// 配对状态枚举 +enum PairingState { + init, // 初始状态 + btReady, // 蓝牙已就绪 + classicOk, // 经典蓝牙已连接 + serverVerify, // 服务器验证中 + pairing, // 配对中 + paired, // 已配对 + // 错误/退出状态 + exitNoPermission, // 无权限 + exitBtOff, // 蓝牙关闭 + exitNoClassic, // 无经典蓝牙连接 + exitNotMatch, // 设备不匹配 + exitIllegal, // 非法设备 + exitBound, // 已被他人绑定 + exitPairFailed, // 配对失败 + exitTimeout, // 超时 +} + +/// 配对控制器 - 基于有限状态机的实现 class PairingController extends GetxController { static PairingController get to => Get.find(); - // 状态标志 - final isLoading = false.obs; - - // 权限是否已授予 - final _hasPermissions = false.obs; - bool get hasPermissions => _hasPermissions.value; - - // 蓝牙状态 - final _bluetoothState = 'unknown'.obs; - String get bluetoothState => _bluetoothState.value; - bool get isBluetoothOn => _bluetoothState.value == 'on'; - - // 状态描述(用于UI显示) - final statusDescription = 'initializing'.tr.obs; - - // 按钮文本 - final actionButtonText = '去系统设置'.obs; - - // 是否正在跳转到主页 - bool _isNavigatingToHome = false; - - // 是否正在执行Companion关联流程 - bool _isAssociating = false; - - // 是否用户拒绝了关联 - final _userRejectedAssociation = false.obs; - bool get userRejectedAssociation => _userRejectedAssociation.value; + // ==================== 状态管理 ==================== + final _state = PairingState.init.obs; + PairingState get state => _state.value; - // 当前连接设备信息 - BluetoothDevice? get currentDevice => _bluetoothService.currentDevice; - - // 是否已连接设备 - bool get isDeviceConnected => currentDevice != null; - - // 是否已完成Companion关联 - final _companionAssociated = false.obs; - bool get isCompanionAssociated => _companionAssociated.value; - - // 服务状态监听 - Worker? _bluetoothStateWorker; - Worker? _deviceWorker; - - // 蓝牙服务 - final _bluetoothService = Get.find(); - - // BLE服务 - final _bleService = BleService(); - - // 日志tag + // ==================== 状态数据 ==================== + final statusDescription = ''.obs; + final actionButtonText = ''.obs; + final isLoading = false.obs; + + // 当前设备信息 + BluetoothDevice? _currentClassicDevice; + + // 计时器和异步操作管理 + Timer? _stateTimer; + StreamSubscription? _bluetoothStateSubscription; + StreamSubscription? _deviceSubscription; + StreamSubscription? _bleStatusSubscription; + + // 常量定义 static const _tag = 'PairingController'; + static const _validDeviceNamePattern = 'DeapSound'; + // ==================== 生命周期 ==================== @override void onInit() { super.onInit(); - _initialize(); + _setupStateObserver(); + start(); } @override void onClose() { - _bluetoothStateWorker?.dispose(); - _deviceWorker?.dispose(); + _cancelAllOperations(); + _bluetoothStateSubscription?.cancel(); + _deviceSubscription?.cancel(); + _bleStatusSubscription?.cancel(); super.onClose(); } - /// 初始化流程 - Future _initialize() async { - try { - isLoading.value = true; - statusDescription.value = 'checkingPermissions'.tr; - - - // 检查并请求权限 - if (!await _checkAndRequestPermissions()) { - statusDescription.value = 'permissionDenied'.tr; - actionButtonText.value = '去系统设置'; - return; - } + // ==================== 公共 API ==================== + + /// 启动配对流程 + Future start() async { + _transition(PairingState.init); + } - // 设置服务状态监听 - _setupServiceListeners(); + /// 重新开始配对流程 + Future restart() async { + _cancelAllOperations(); + _transition(PairingState.init); + } - // 检查蓝牙状态并刷新设备 - await _checkBluetoothAndRefresh(); - } catch (e) { - Logger.e(_tag, '初始化配对控制器失败: ${e.toString()}'); - statusDescription.value = 'initializationFailure'.tr; - } finally { - isLoading.value = false; - _updateStatusDescription(); + /// 处理按钮点击 + void handleActionButtonTap() { + switch (state) { + case PairingState.exitNoPermission: + _openAppSettings(); + break; + case PairingState.exitBtOff: + _openBluetoothSettings(); + break; + case PairingState.exitNoClassic: + case PairingState.exitNotMatch: + _openBluetoothSettings(); + break; + case PairingState.exitTimeout: + restart(); + break; + case PairingState.exitPairFailed: + case PairingState.exitBound: + _retryPairing(); + break; + default: + break; } } - /// 检查蓝牙状态并刷新设备 - Future _checkBluetoothAndRefresh() async { - statusDescription.value = 'checkingBluetoothStatus'.tr; + /// 跳过配对 + void skipPairing() { + Logger.i(_tag, '用户选择跳过配对'); + _navigateToHome(); + } + + // ==================== FSM 核心实现 ==================== + + /// 状态转换 + void _transition(PairingState next) { + final current = state; - // 无论是iOS还是Android,都正常检查蓝牙状态 - //try { - // final isEnabled = await _bluetoothService.isBluetoothEnabled(); - // _bluetoothState.value = isEnabled ? 'on' : 'off'; - - // if (isEnabled) { - // // 如果蓝牙已开启,刷新设备连接 - // await _bluetoothService.refreshDeviceConnection(); - // } - // } catch (e) { - // Logger.e(_tag, '检查蓝牙状态失败: ${e.toString()}'); - // _bluetoothState.value = 'off'; - // } - - // if (_bluetoothState.value != 'on') { - // statusDescription.value = 'bluetoothTurnedOff'.tr; - // actionButtonText.value = '去系统设置'; - // return; - // } - - // 刷新连接设备并检查配对状态 - statusDescription.value = 'searchingDevice'.tr; - await _bluetoothService.refreshDeviceConnection(); - - // 设备连接时检查配对状态 - if (isDeviceConnected) { - await _checkDevicePairingStatus(); + // 允许init状态重复执行,其他状态避免重复转换 + if (current == next && next != PairingState.init) return; + + Logger.d(_tag, 'FSM: ${current.name} → ${next.name}'); + _cancelStateTimer(); + _state.value = next; + + // 根据新状态执行对应的进入方法 + switch (next) { + case PairingState.init: + _enterInit(); + break; + case PairingState.btReady: + _enterBtReady(); + break; + case PairingState.classicOk: + _enterClassicOk(); + break; + case PairingState.serverVerify: + _enterServerVerify(); + break; + case PairingState.pairing: + _enterPairing(); + break; + case PairingState.paired: + _enterPaired(); + break; + // 错误状态 + case PairingState.exitNoPermission: + case PairingState.exitBtOff: + case PairingState.exitNoClassic: + case PairingState.exitNotMatch: + case PairingState.exitIllegal: + case PairingState.exitBound: + case PairingState.exitPairFailed: + case PairingState.exitTimeout: + _handleErrorState(next); + break; } } - /// 检查设备配对状态 - Future _checkDevicePairingStatus() async { - if (!isDeviceConnected) return; + /// 设置状态观察器 + void _setupStateObserver() { + ever(_state, (PairingState state) { + _updateUI(); + }); + } + // ==================== 状态处理方法 ==================== + + /// INIT: 初始化,检查权限 + Future _enterInit() async { + Logger.i(_tag, '开始执行初始化流程'); + + isLoading.value = true; + statusDescription.value = '正在检查权限...'; + try { - // iOS 环境下的配对处理 - if (Platform.isIOS) { - Logger.i(_tag, 'iOS: 检查设备配对状态'); - - // 判断设备名称是否符合要求 - if (!_isValidDeviceName(currentDevice!.name)) { - statusDescription.value = 'pleaseConnectDeepSoundDevice'.tr; + // iOS平台跳过权限检查 + if (!Platform.isIOS) { + final hasPermission = await _checkAndRequestPermissions(); + if (!hasPermission) { + _transition(PairingState.exitNoPermission); return; } - - // 经典蓝牙连接成功后,主动触发配对流程 - Logger.i(_tag, 'iOS环境下主动启动配对流程: ${currentDevice!.name}'); - - // 更新UI状态 - isLoading.value = true; - statusDescription.value = '正在启动配对流程...'; - - // 调用BleService的startDeviceAssociation方法 - final success = await _bleService.startDeviceAssociation( - deviceNamePattern: currentDevice!.name, - macAddress: currentDevice!.address, - ); - - isLoading.value = false; - - if (success) { - Logger.i(_tag, 'iOS配对流程启动成功'); - _companionAssociated.value = true; - _userRejectedAssociation.value = false; // 重置拒绝状态 - _autoNavigateToHome(); - } else { - Logger.w(_tag, 'iOS配对流程启动失败,但仍继续使用'); - // 即使配对流程启动失败,也视为已配对以继续流程 - _companionAssociated.value = true; - _userRejectedAssociation.value = false; - _autoNavigateToHome(); - } - return; } - // Android环境下的正常配对检查流程 - final isSupported = await _bleService.isCompanionSupported(); - if (!isSupported) { - Logger.i(_tag, '设备不支持Companion功能'); - _companionAssociated.value = true; // 不支持则视为已配对 - _userRejectedAssociation.value = false; // 重置拒绝状态 - return; - } - - final pairedMac = await _bleService.getPairedMacAddress(); - if (pairedMac == null) { - // 没有配对记录,需要开始配对 - Logger.i(_tag, '无配对记录,需要开始设备配对'); - return; - } - - Logger.i(_tag, '发现已关联的Companion设备: $pairedMac'); - - // 检查当前连接设备与已保存的设备是否一致 - if (currentDevice!.address != pairedMac) { - // MAC地址不匹配 - Logger.w(_tag, '当前连接的设备与已配对的DeepSound设备不符'); - statusDescription.value = 'pleaseConnectPairedDevice'.tr; - return; + // 设置蓝牙状态监听 + _setupBluetoothListener(); + + // 检查蓝牙状态 + final btState = BluetoothManager.to.bluetoothState; + Logger.i(_tag, '当前蓝牙状态: $btState'); + + if (btState == 'on' || btState == 'unknown') { + _transition(PairingState.btReady); + } else { + _transition(PairingState.exitBtOff); } + } catch (e) { + Logger.e(_tag, 'Init failed: $e'); + _transition(PairingState.exitNoPermission); + } finally { + isLoading.value = false; + } + } - // 判断设备名称是否符合要求 - if (!_isValidDeviceName(currentDevice!.name)) { - statusDescription.value = 'pleaseConnectDeepSoundDevice'.tr; + /// BT_READY: 蓝牙已就绪,检查经典蓝牙连接 + Future _enterBtReady() async { + isLoading.value = true; + statusDescription.value = '正在检查设备连接...'; + + try { + // 刷新设备连接 + await BluetoothManager.to.refreshDeviceConnection(); + + // 获取当前连接的经典蓝牙设备 + final device = BluetoothManager.to.currentDevice; + if (device == null) { + _transition(PairingState.exitNoClassic); return; } - - // 设备匹配且合规,标记为已配对 - Logger.i(_tag, '当前设备与已配对设备匹配'); - _companionAssociated.value = true; - _userRejectedAssociation.value = false; // 重置拒绝状态 - await _bleService.registerBackgroundScan(); - _autoNavigateToHome(); + + _currentClassicDevice = device; + _transition(PairingState.classicOk); } catch (e) { - Logger.e(_tag, '检查设备配对状态失败: ${e.toString()}'); + Logger.e(_tag, 'BT ready check failed: $e'); + _transition(PairingState.exitNoClassic); + } finally { + isLoading.value = false; } } - /// 检查设备名称是否合规 - bool _isValidDeviceName(String deviceName) { - return deviceName.contains("DeapSound"); - } - - /// 检查并请求必要的蓝牙权限 - Future _checkAndRequestPermissions() async { - Map statuses; - List permissionsToRequest = []; - - if (Platform.isAndroid) { - // Android权限处理保持不变 - permissionsToRequest.add(Permission.locationWhenInUse); - if (await _getAndroidSdkVersion() >= 31) { - permissionsToRequest.add(Permission.bluetoothScan); - permissionsToRequest.add(Permission.bluetoothConnect); + /// CLASSIC_OK: 经典蓝牙已连接,检查是否需要BLE配对 + Future _enterClassicOk() async { + if (_currentClassicDevice == null) { + _transition(PairingState.exitNoClassic); + return; + } + + statusDescription.value = '已连接: ${_currentClassicDevice!.name}'; + + // 检查设备名称是否合规 + if (!_isValidDeviceName(_currentClassicDevice!.name)) { + _transition(PairingState.exitNotMatch); + return; + } + + // 检查是否已有BLE配对记录 + try { + // 1. 检查平台是否支持Companion功能 + final isSupported = await BleManager.to.isCompanionSupported(); + if (!isSupported) { + Logger.i(_tag, '设备不支持Companion功能,跳过BLE配对'); + _transition(PairingState.paired); + return; } - // 处理Android权限 - if (permissionsToRequest.isNotEmpty) { - statuses = await permissionsToRequest.request(); - - bool allGranted = true; - statuses.forEach((permission, status) { - if (!status.isGranted) { - allGranted = false; - Logger.w(_tag, '权限 ${permission.toString()} 未被授予: $status'); - } - }); + // 2. 获取已配对的MAC地址 + final pairedMac = await BleManager.to.getPairedMacAddress(); + + // 3. 检查是否已经配对且是同一设备 + if (pairedMac != null && pairedMac == _currentClassicDevice!.address) { + Logger.i(_tag, '设备已完成BLE配对: $pairedMac'); - if (!allGranted) { - return false; + // 4. 检查BLE连接状态 + final isBleConnected = await BleManager.to.isBleConnected(); + if (isBleConnected) { + Logger.i(_tag, 'BLE已连接,跳转到配对成功'); + _transition(PairingState.paired); + } else { + Logger.i(_tag, 'BLE未连接,尝试重新配对'); + _transition(PairingState.pairing); } + return; } - } else if (Platform.isIOS) { - await _bluetoothService.refreshDeviceConnection(); - - // 获取iOS蓝牙权限状态 - final bluetoothState = await _bluetoothService.bluetoothState; - final permissionStatus = await Permission.bluetooth.status; - Logger.i(_tag, 'iOS蓝牙状态: $bluetoothState'); - Logger.i(_tag, 'iOS蓝牙权限状态: $permissionStatus'); - // iOS上不需要主动请求权限,系统会在使用蓝牙时自动请求 - _hasPermissions.value = true; - return true; - } - - _hasPermissions.value = true; - return true; - } - - /// 显示权限设置对话框 - void _showPermissionSettingsDialog(String message) { - Get.dialog( - AlertDialog( - title: Text('需要权限'), - content: Text(message), - actions: [ - TextButton( - onPressed: () => Get.back(), - child: Text('稍后'), - ), - TextButton( - onPressed: () { - Get.back(); - openBluetoothSettings(); - }, - child: Text('去设置'), - ), - ], - ), - barrierDismissible: false, - ); - } - - // 辅助方法获取Android SDK版本 - Future _getAndroidSdkVersion() async { - if (Platform.isAndroid) { - return 31; // 假设运行在需要新权限的设备上 + // 5. 如果没有配对或配对的是其他设备,进入验证流程 + _transition(PairingState.serverVerify); + } catch (e) { + Logger.e(_tag, 'Classic OK check failed: $e'); + // 出错时直接尝试配对 + _transition(PairingState.pairing); } - return 0; } - /// 设置服务状态监听 - void _setupServiceListeners() { - // 监听蓝牙状态变化 - _bluetoothStateWorker = - ever(_bluetoothService.bluetoothState.obs, (String state) { - _bluetoothState.value = state; - _updateStatusDescription(); - }); - - // 监听设备连接状态变化 - _deviceWorker = - ever(_bluetoothService.currentDeviceRx, (BluetoothDevice? device) { - if (device != null && !_isNavigatingToHome) { - Logger.i(_tag, '配对页面发现设备已连接: ${device.name}'); - _handleDeviceConnected(); + /// SERVER_VERIFY: 服务器验证 + Future _enterServerVerify() async { + isLoading.value = true; + statusDescription.value = '正在验证设备...'; + + try { + if (_currentClassicDevice == null) { + _transition(PairingState.exitNotMatch); + return; } - _updateStatusDescription(); - }); - } - - /// 处理设备连接成功事件 - Future _handleDeviceConnected() async { - if (!isDeviceConnected || _isNavigatingToHome) return; - - // 检查配对状态,决定下一步操作 - await _checkDevicePairingStatus(); - - // 如果还未配对且设备合规,启动配对流程 - if (!_companionAssociated.value && - _isValidDeviceName(currentDevice!.name)) { - _startCompanionAssociation(); - } - } - - /// 更新状态描述 - void _updateStatusDescription() { - if (_userRejectedAssociation.value) { - // 用户拒绝关联时的提示 - 这是最高优先级 - statusDescription.value = '关联后才能使用全部功能'; - actionButtonText.value = '关联DeapSound耳机'; - return; - } - - if (!hasPermissions) { - statusDescription.value = 'permissionDenied'.tr; - actionButtonText.value = '去系统设置'; - return; - } - - if (bluetoothState == 'off') { - statusDescription.value = 'bluetoothTurnedOff'.tr; - actionButtonText.value = '去系统设置'; - return; - } - - if (isDeviceConnected) { - if (Platform.isAndroid && !isCompanionAssociated && _isAssociating) { - statusDescription.value = - '${'associatingDevice'.tr} ${currentDevice!.name}'; + + // 验证设备是否可以配对 + final canPair = await BleManager.to.verifyDeviceCanPair( + _currentClassicDevice!.address + ); + + if (canPair) { + Logger.i(_tag, '设备验证通过,可以配对'); + _transition(PairingState.pairing); } else { - statusDescription.value = - '${'connectedDevice'.tr} ${currentDevice!.name}'; + Logger.e(_tag, '设备验证失败,不能配对'); + _transition(PairingState.exitIllegal); } - return; - } - - if (isLoading.value) { - statusDescription.value = 'searchingDevice'.tr; - return; + } catch (e) { + Logger.e(_tag, 'Server verify failed: $e'); + _transition(PairingState.exitIllegal); + } finally { + isLoading.value = false; } - - statusDescription.value = 'notFound'.tr; } - /// 启动Companion设备关联流程 - Future _startCompanionAssociation() async { - // 如果已跳转,已完成关联或正在进行关联,直接返回 - if (_isNavigatingToHome || - _companionAssociated.value || - _isAssociating || - !isDeviceConnected) { - return; - } - - // 重置拒绝状态 - _userRejectedAssociation.value = false; - - // 设置关联状态标志 - _isAssociating = true; - _updateStatusDescription(); - + /// PAIRING: 执行配对 + Future _enterPairing() async { + isLoading.value = true; + statusDescription.value = '正在配对设备...'; + try { - // iOS环境下不在这里处理关联流程,已在_checkDevicePairingStatus中处理 - if (Platform.isIOS) { - Logger.i(_tag, 'iOS: 在_checkDevicePairingStatus中已处理关联流程'); - _isAssociating = false; - return; - } - - // 下面是原有的Android关联流程 - // 检查是否支持Companion功能 - final isSupported = await _bleService.isCompanionSupported(); - if (!isSupported) { - Logger.i(_tag, '设备不支持Companion功能,跳过关联'); - _companionAssociated.value = true; - _autoNavigateToHome(); + if (_currentClassicDevice == null) { + _transition(PairingState.exitPairFailed); return; } - - // 检查设备名称是否符合要求 - if (!_isValidDeviceName(currentDevice!.name)) { - statusDescription.value = 'pleaseConnectDeepSoundDevice'.tr; - _isAssociating = false; + + // 启动BLE状态监听 + _setupBleStatusListener(); + + // 检查当前BLE连接状态,防止错过已经连接的事件 + final isBleConnected = await BleManager.to.isBleConnected(); + if (isBleConnected) { + Logger.i(_tag, 'BLE已经连接,直接完成配对'); + _onBleConnected(); return; } - - Logger.i(_tag, '开始Companion设备关联流程, 设备MAC: ${currentDevice!.address}'); - - var success = await _bleService.startDeviceAssociation( - deviceNamePattern: currentDevice!.name, - macAddress: currentDevice!.address, + + // 设置配对超时保护 + _stateTimer = Timer(const Duration(seconds: 10), () { + if (state == PairingState.pairing) { + Logger.e(_tag, 'BLE配对超时'); + _transition(PairingState.exitTimeout); + } + }); + + // 使用系统配对框架执行BLE配对 + // iOS: AccessorySetupKit + // Android: Companion Device Manager + final success = await BleManager.to.startDeviceAssociation( + deviceNamePattern: _currentClassicDevice!.name, + macAddress: _currentClassicDevice!.address, ); - _isAssociating = false; - + if (success) { - Logger.i(_tag, 'Companion设备关联成功'); - _companionAssociated.value = true; - _userRejectedAssociation.value = false; - - // 注册后台扫描,确保应用被杀死后仍能被唤醒 - await _bleService.registerBackgroundScan( - macAddress: currentDevice!.address); - - // 关联成功后跳转 - _autoNavigateToHome(); + Logger.i(_tag, 'BLE配对启动成功,等待连接完成...'); + // 配对结果将通过BLE状态监听回调处理 } else { - Logger.e(_tag, 'Companion设备关联失败或被用户拒绝'); - // 关联失败 - 用户拒绝关联 - _userRejectedAssociation.value = true; - // 确保UI状态更新 - _updateStatusDescription(); + Logger.e(_tag, 'BLE配对启动失败'); + _transition(PairingState.exitPairFailed); } } catch (e) { - Logger.e(_tag, 'Companion设备关联过程发生错误: ${e.toString()}'); - _isAssociating = false; - _userRejectedAssociation.value = true; - _updateStatusDescription(); + Logger.e(_tag, 'Pairing failed: $e'); + _transition(PairingState.exitPairFailed); } } - - /// 自动跳转到主页 - Future _autoNavigateToHome() async { - if (_isNavigatingToHome || !isDeviceConnected) return; - - // 启动BLE后台服务 - await _startAgentService(); - - _isNavigatingToHome = true; - Logger.i(_tag, '已找到连接的设备 ${currentDevice!.name},自动跳转到主页'); - - Future.delayed(const Duration(milliseconds: 500), () { - Get.offAllNamed(Routes.home); - }); + + /// 设置BLE状态监听 + void _setupBleStatusListener() { + Logger.d(_tag, '🎯 开始设置BLE状态监听器...'); + + _bleStatusSubscription?.cancel(); + + Logger.d(_tag, '📱 当前BLE连接状态: ${BleManager.to.connectionState}'); + Logger.d(_tag, '🔗 开始监听BleManager.connectionStateRx...'); + + // 监听BleManager的连接状态变化,而不是直接监听BleService + _bleStatusSubscription = BleManager.to.connectionStateRx.listen( + (bleState) { + + // 只在配对状态下处理BLE连接事件 + if (state == PairingState.pairing) { + if (bleState == BleConnectionState.connected) { + Logger.i(_tag, 'BLE连接成功,处理配对完成'); + _onBleConnected(); + } else if (bleState == BleConnectionState.error) { + Logger.e(_tag, 'BLE连接错误'); + _transition(PairingState.exitPairFailed); + } else { + Logger.d(_tag, 'BLE状态变化,但非关键状态: $bleState'); + } + } else { + Logger.d(_tag, '当前状态为${state.name},忽略BLE连接事件'); + } + }, + onError: (error) { + Logger.e(_tag, 'BLE状态监听错误: $error'); + }, + onDone: () { + Logger.w(_tag, 'BLE状态监听流已关闭'); + }, + ); + + Logger.d(_tag, 'BLE状态监听器已设置完成'); } - - /// 启动BLE后台服务 - Future _startAgentService() async { - try { - // 注释掉设备连接检查,确保无论是否连接设备都能启动服务 - // if (!isDeviceConnected) return; - - final result = await BleManager.to.startAgentService(); - Logger.i(_tag, result ? 'BLE后台服务启动成功' : 'BLE后台服务启动失败'); - } catch (e) { - Logger.e(_tag, '启动BLE后台服务发生错误: ${e.toString()}'); - } + + /// 处理BLE连接成功 + Future _onBleConnected() async { + Logger.i(_tag, 'BLE连接成功'); + + // 取消超时计时器 + _cancelStateTimer(); + + // BLE连接成功即表示配对完成 + // iOS使用UUID,Android使用MAC地址,但连接成功都表示配对验证通过 + Logger.i(_tag, 'BLE配对验证成功,经典蓝牙和BLE均已连接'); + _transition(PairingState.paired); } - /// 停止BLE后台服务 - Future _stopAgentService() async { + /// PAIRED: 配对成功 + Future _enterPaired() async { + isLoading.value = false; + statusDescription.value = '配对成功!'; + try { - final result = await BleManager.to.stopAgentService(); - Logger.i(_tag, result ? 'BLE后台服务停止成功' : 'BLE后台服务停止失败'); + if (_currentClassicDevice != null) { + // Android平台注册后台扫描 + if (Platform.isAndroid) { + await BleManager.to.registerBackgroundScan( + macAddress: _currentClassicDevice!.address + ); + Logger.i(_tag, '已注册后台扫描'); + } + } + + // 启动BLE后台服务 + await BleManager.to.startAgentService(); + Logger.i(_tag, 'BLE后台服务已启动'); + + // 延迟后跳转到主页 + await Future.delayed(const Duration(milliseconds: 500)); + _navigateToHome(); } catch (e) { - Logger.e(_tag, '停止BLE后台服务发生错误: ${e.toString()}'); + Logger.e(_tag, 'Post pairing setup failed: $e'); + // 即使失败也跳转到主页 + // _navigateToHome(); } } - /// 处理按钮点击 - void handleActionButtonTap() { - if (userRejectedAssociation) { - // 用户拒绝关联后,点击按钮重新开始关联 - restartAssociation(); - } else if (!hasPermissions || !isBluetoothOn) { - // 权限未授予或蓝牙关闭时,打开系统设置 - openBluetoothSettings(); + /// 处理错误状态 + void _handleErrorState(PairingState errorState) { + isLoading.value = false; + + switch (errorState) { + case PairingState.exitNoPermission: + statusDescription.value = '需要蓝牙权限'; + actionButtonText.value = '去设置'; + break; + case PairingState.exitBtOff: + statusDescription.value = '请开启蓝牙'; + actionButtonText.value = '去设置'; + break; + case PairingState.exitNoClassic: + statusDescription.value = '请先连接DeapSound设备'; + actionButtonText.value = '去设置'; + break; + case PairingState.exitNotMatch: + statusDescription.value = '请连接DeapSound设备'; + actionButtonText.value = '去设置'; + break; + case PairingState.exitTimeout: + statusDescription.value = '扫描超时'; + actionButtonText.value = '重试'; + break; + case PairingState.exitPairFailed: + statusDescription.value = '配对失败'; + actionButtonText.value = '重新配对'; + break; + case PairingState.exitBound: + statusDescription.value = '设备已被其他用户绑定'; + actionButtonText.value = '联系客服'; + break; + case PairingState.exitIllegal: + statusDescription.value = '设备验证失败'; + actionButtonText.value = '重试'; + break; + default: + break; } } - /// 打开系统蓝牙设置 - void openBluetoothSettings() { + // ==================== 辅助方法 ==================== + + /// 检查并请求权限 + Future _checkAndRequestPermissions() async { try { - if (!hasPermissions) { - openAppSettings(); - } else if (Platform.isAndroid && !isBluetoothOn) { - AppSettings.openAppSettings(type: AppSettingsType.bluetooth); - } else if (Platform.isIOS) { - // iOS上优先尝试打开蓝牙设置 - if (!isBluetoothOn) { - // iOS上无法直接打开蓝牙设置,只能打开应用设置 - AppSettings.openAppSettings(); - } else { - // 如果蓝牙开启但有其他权限问题,打开应用设置 - openAppSettings(); - } - } else { - AppSettings.openAppSettings(type: AppSettingsType.bluetooth); + if (Platform.isIOS) { + // iOS权限由系统自动处理 + return true; + } + + // Android权限检查 + final permissions = []; + permissions.add(Permission.locationWhenInUse); + + if (Platform.isAndroid && await _getAndroidSdkVersion() >= 31) { + permissions.add(Permission.bluetoothScan); + permissions.add(Permission.bluetoothConnect); } + + final statuses = await permissions.request(); + return statuses.values.every((status) => status.isGranted); } catch (e) { - Logger.e(_tag, '打开设置失败: ${e.toString()}'); + Logger.e(_tag, '权限检查失败: $e'); + return false; } } - /// 重新初始化蓝牙 - Future reinitializeBluetooth() async { - try { - isLoading.value = true; - statusDescription.value = '正在重新初始化蓝牙...'; + /// 设置蓝牙状态监听 + void _setupBluetoothListener() { + _bluetoothStateSubscription?.cancel(); + _bluetoothStateSubscription = BluetoothManager.to.bluetoothState.obs.listen((btState) { + Logger.d(_tag, '蓝牙状态变化: $btState'); - // iOS上简化处理 - if (Platform.isIOS) { - Logger.i(_tag, "iOS重新初始化蓝牙: 简化流程"); - - // 直接检查蓝牙状态并刷新连接,系统会在需要时请求权限 - await _checkBluetoothAndRefresh(); - return; + // 根据当前状态决定如何响应蓝牙状态变化 + if (btState == 'off' && state != PairingState.exitBtOff) { + _transition(PairingState.exitBtOff); + } else if (btState == 'on' && state == PairingState.exitBtOff) { + _transition(PairingState.btReady); } + }); + + // 监听设备连接状态 + _deviceSubscription?.cancel(); + _deviceSubscription = BluetoothManager.to.currentDeviceRx.listen((device) { + Logger.d(_tag, '设备连接状态变化: ${device?.name}'); - // Android上的正常流程 - if (await _checkAndRequestPermissions()) { - await _checkBluetoothAndRefresh(); + // 根据当前状态决定如何响应设备变化 + if (device != null && state == PairingState.exitNoClassic) { + _currentClassicDevice = device; + _transition(PairingState.classicOk); + } else if (device == null && + (state == PairingState.classicOk || + state == PairingState.pairing || + state == PairingState.serverVerify)) { + _transition(PairingState.exitNoClassic); } - } catch (e) { - Logger.e(_tag, '重新初始化蓝牙失败: ${e.toString()}'); - } finally { - isLoading.value = false; - _updateStatusDescription(); + }); + } + + /// 检查设备名称是否合规 + bool _isValidDeviceName(String deviceName) { + return deviceName.contains(_validDeviceNamePattern); + } + + /// 获取Android SDK版本 + Future _getAndroidSdkVersion() async { + // 简化处理,实际应该通过platform channel获取 + return 31; + } + + /// 更新UI + void _updateUI() { + // 根据状态更新UI文本 + switch (state) { + case PairingState.init: + statusDescription.value = '初始化中...'; + break; + case PairingState.btReady: + statusDescription.value = '蓝牙已就绪'; + break; + case PairingState.classicOk: + if (_currentClassicDevice != null) { + statusDescription.value = '已连接: ${_currentClassicDevice!.name}'; + } + break; + case PairingState.serverVerify: + statusDescription.value = '正在验证设备...'; + break; + case PairingState.pairing: + statusDescription.value = '正在配对...'; + break; + case PairingState.paired: + statusDescription.value = '配对成功!'; + break; + default: + // 错误状态在_handleErrorState中处理 + break; } } - - /// 打开应用设置 - Future openAppSettings() async { - try { - await AppSettings.openAppSettings(); - // 返回后重新检查权限状态 - Future.delayed(Duration(milliseconds: 500), () { - reinitializeBluetooth(); - }); - } catch (e) { - Logger.e(_tag, '打开应用设置失败: ${e.toString()}'); + + /// 取消所有异步操作 + void _cancelAllOperations() { + _stateTimer?.cancel(); + } + + /// 取消状态计时器 + void _cancelStateTimer() { + _stateTimer?.cancel(); + } + + /// 重试配对 + void _retryPairing() { + if (_currentClassicDevice != null) { + _transition(PairingState.pairing); + } else { + restart(); } } - /// 重新开始关联 - void restartAssociation() { - if (isDeviceConnected && !isCompanionAssociated) { - _startCompanionAssociation(); + /// 打开应用设置 + void _openAppSettings() { + AppSettings.openAppSettings(); + } + + /// 打开蓝牙设置 + void _openBluetoothSettings() { + if (Platform.isAndroid) { + AppSettings.openAppSettings(type: AppSettingsType.bluetooth); + } else { + AppSettings.openAppSettings(); } } - /// 跳过连接 - void skipConnecting() async { - // 即使没有设备连接,也启动BLE后台服务 - await _startAgentService(); - _isNavigatingToHome = true; - - // 记录跳过配对的日志 - Logger.i(_tag, '用户跳过设备配对,直接跳转到主页'); - + /// 导航到主页 + void _navigateToHome() { + Logger.i(_tag, '跳转到主页'); Get.offAllNamed(Routes.home); } + + // ==================== 公共属性 ==================== + + /// 当前连接的经典蓝牙设备 + BluetoothDevice? get currentDevice => _currentClassicDevice; + + /// 是否可以跳过配对 + bool get canSkip => !isLoading.value && + (state == PairingState.exitNoClassic || + state == PairingState.exitNotMatch || + state == PairingState.exitTimeout); + + /// 是否显示操作按钮 + bool get showActionButton => + state == PairingState.exitNoPermission || + state == PairingState.exitBtOff || + state == PairingState.exitNoClassic || + state == PairingState.exitNotMatch || + state == PairingState.exitTimeout || + state == PairingState.exitPairFailed || + state == PairingState.exitBound || + state == PairingState.exitIllegal; } \ No newline at end of file diff --git a/lib/modules/pairing/views/pairing_view.dart b/lib/modules/pairing/views/pairing_view.dart index 832c524c2..f15cf8f34 100644 --- a/lib/modules/pairing/views/pairing_view.dart +++ b/lib/modules/pairing/views/pairing_view.dart @@ -49,8 +49,8 @@ class PairingView extends GetView { SizedBox(height: 20.h), - // 设备动画 - 更大尺寸 - _buildDeviceAnimation(), + // 设备动画 - 根据状态显示不同动画 + _buildDeviceAnimation(isDarkMode), SizedBox(height: 20.h), @@ -94,85 +94,124 @@ class PairingView extends GetView { ); } - // 设备动画 - Widget _buildDeviceAnimation() { - return Container( - width: 240.w, - height: 240.w, - child: Stack( - alignment: Alignment.center, - children: [ - // 脉搏背景 - 更显眼的渐变效果 - TweenAnimationBuilder( - tween: Tween(begin: 0.8, end: 1.1), - duration: const Duration(seconds: 2), - curve: Curves.easeInOut, - builder: (context, value, child) { - return Container( - width: 200.w * value, - height: 200.w * value, - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFF0066CC).withOpacity(0.3), - Color(0xFF5E5CE6).withOpacity(0.3), - ], - ), - shape: BoxShape.circle, - ), - ); - }, - onEnd: () { - // 重新开始动画 - }, - ), + // 设备动画 - 根据状态显示不同的动画效果 + Widget _buildDeviceAnimation(bool isDarkMode) { + return Obx(() { + final state = controller.state; + final isLoading = controller.isLoading.value; + + // 根据状态决定动画颜色 + Color primaryColor = Color(0xFF0066CC); + Color secondaryColor = Color(0xFF5E5CE6); + + // 错误状态使用红色 + if (state.name.startsWith('exit')) { + primaryColor = Colors.red; + secondaryColor = Colors.redAccent; + } + // 成功状态使用绿色 + else if (state == PairingState.paired) { + primaryColor = Colors.green; + secondaryColor = Colors.greenAccent; + } + + return Container( + width: 240.w, + height: 240.w, + child: Stack( + alignment: Alignment.center, + children: [ + // 脉搏背景 - 只在加载时显示动画 + if (isLoading) + TweenAnimationBuilder( + tween: Tween(begin: 0.8, end: 1.1), + duration: const Duration(seconds: 2), + curve: Curves.easeInOut, + builder: (context, value, child) { + return Container( + width: 200.w * value, + height: 200.w * value, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + primaryColor.withOpacity(0.3), + secondaryColor.withOpacity(0.3), + ], + ), + shape: BoxShape.circle, + ), + ); + }, + onEnd: () { + // 重新开始动画 + }, + ), - // 旋转边框 - SizedBox( - width: 100.w, - height: 100.w, - child: CircularProgressIndicator( - strokeWidth: 4.w, - valueColor: AlwaysStoppedAnimation( - Color(0xFF0066CC), + // 旋转边框 - 只在加载时显示 + if (isLoading) + SizedBox( + width: 100.w, + height: 100.w, + child: CircularProgressIndicator( + strokeWidth: 4.w, + valueColor: AlwaysStoppedAnimation(primaryColor), + backgroundColor: Colors.grey.withOpacity(0.2), + ), ), - backgroundColor: Colors.grey.withOpacity(0.2), - ), - ), - // 设备图标 - Container( - width: 120.w, - height: 120.w, - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFF0066CC), - Color(0xFF5E5CE6), - ], + // 设备图标 + Container( + width: 120.w, + height: 120.w, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [primaryColor, secondaryColor], + ), + shape: BoxShape.circle, + ), + child: Icon( + _getIconForState(state), + color: Colors.white, + size: 60.w, ), - shape: BoxShape.circle, - ), - child: Icon( - Icons.headphones, - color: Colors.white, - size: 60.w, ), - ), - ], - ), - ); + ], + ), + ); + }); + } + + // 根据状态获取图标 + IconData _getIconForState(PairingState state) { + switch (state) { + case PairingState.paired: + return Icons.check_circle; + case PairingState.exitNoPermission: + case PairingState.exitBtOff: + return Icons.bluetooth_disabled; + case PairingState.exitNoClassic: + case PairingState.exitNotMatch: + return Icons.headphones_outlined; + case PairingState.exitPairFailed: + case PairingState.exitTimeout: + case PairingState.exitIllegal: + case PairingState.exitBound: + return Icons.error_outline; + default: + return Icons.headphones; + } } // 状态信息 Widget _buildStatusInfo(bool isDarkMode) { return Obx(() { final status = controller.statusDescription.value; - final isLoading = controller.isLoading.value; + final state = controller.state; + final device = controller.currentDevice; return Column( children: [ @@ -189,9 +228,9 @@ class PairingView extends GetView { SizedBox(height: 10.h), - // 子状态提示文本 + // 子状态提示文本 - 根据状态显示不同提示 Text( - 'turnEarphones'.tr, // 请打开耳机充电盒,将耳机放入您的耳朵 + _getSubtitleForState(state), style: TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white60 : Colors.grey[600], @@ -200,43 +239,73 @@ class PairingView extends GetView { ), // 当前连接设备(有设备时才显示) - if (controller.currentDevice != null) ...[ + if (device != null && + (state == PairingState.classicOk || + state == PairingState.serverVerify || + state == PairingState.pairing || + state == PairingState.paired)) ...[ SizedBox(height: 24.h), - _buildConnectedDevice(isDarkMode), + _buildConnectedDevice(device, isDarkMode), ], ], ); }); } - // 已连接设备信息 - Widget _buildConnectedDevice(bool isDarkMode) { - return Obx(() { - final device = controller.currentDevice; - - if (device == null) { - return const SizedBox.shrink(); - } + // 根据状态获取副标题 + String _getSubtitleForState(PairingState state) { + switch (state) { + case PairingState.init: + case PairingState.btReady: + return '正在准备配对环境...'; + case PairingState.classicOk: + return '请先通过系统蓝牙连接DeapSound设备'; + case PairingState.serverVerify: + case PairingState.pairing: + return '请稍候,正在完成配对...'; + case PairingState.paired: + return '配对成功!即将跳转到主页...'; + case PairingState.exitNoPermission: + return '需要蓝牙权限才能继续'; + case PairingState.exitBtOff: + return '请开启蓝牙后重试'; + case PairingState.exitNoClassic: + return '请先通过系统蓝牙连接DeapSound设备'; + case PairingState.exitNotMatch: + return '请确保连接的是DeapSound设备'; + case PairingState.exitTimeout: + return '扫描超时,请确保设备在附近'; + case PairingState.exitPairFailed: + return '配对失败,请重试'; + case PairingState.exitBound: + return '该设备已被其他账号绑定'; + case PairingState.exitIllegal: + return '设备验证失败,请检查设备是否正常'; + default: + return ''; + } + } - return Container( - width: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'currentlyConnected'.tr, // 当前已连接: - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white70 : Colors.black87, - ), + // 已连接设备信息 + Widget _buildConnectedDevice(device, bool isDarkMode) { + return Container( + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'currentlyConnected'.tr, // 当前已连接: + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white70 : Colors.black87, ), - SizedBox(height: 8.h), - _buildDeviceItem(device, isDarkMode), - ], - ), - ); - }); + ), + SizedBox(height: 8.h), + _buildDeviceItem(device, isDarkMode), + ], + ), + ); } // 设备项 @@ -291,52 +360,75 @@ class PairingView extends GetView { // 操作按钮 Widget _buildActionButtons(bool isDarkMode) { - return Container( - width: double.infinity, - child: Column( - children: [ - // 主按钮 - 改为更宽的圆角按钮 - ElevatedButton( - onPressed: () => controller.openBluetoothSettings(), - style: ElevatedButton.styleFrom( - backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[200], - foregroundColor: isDarkMode ? Colors.white : Colors.black87, - padding: EdgeInsets.symmetric(vertical: 16.h), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16.r), - ), - elevation: 0, - minimumSize: Size(double.infinity, 56.h), - ), - child: Text( - 'unsystemSetup'.tr, // 去系统设置 - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, + return Obx(() { + final showActionButton = controller.showActionButton; + final canSkip = controller.canSkip; + final actionButtonText = controller.actionButtonText.value; + + return Container( + width: double.infinity, + child: Column( + children: [ + // 主按钮 - 根据状态显示不同的按钮 + if (showActionButton) + ElevatedButton( + onPressed: () => controller.handleActionButtonTap(), + style: ElevatedButton.styleFrom( + backgroundColor: _getButtonColor(controller.state, isDarkMode), + foregroundColor: Colors.white, + padding: EdgeInsets.symmetric(vertical: 16.h), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.r), + ), + elevation: 0, + minimumSize: Size(double.infinity, 56.h), + ), + child: Text( + actionButtonText, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + ), + ), ), - ), - ), - - SizedBox(height: 12.h), - // 次要按钮 - TextButton( - onPressed: () => controller.skipConnecting(), - style: TextButton.styleFrom( - foregroundColor: Color(0xFF0066CC), - padding: EdgeInsets.symmetric(vertical: 12.h), - minimumSize: Size(double.infinity, 48.h), - ), - child: Text( - 'talkLater'.tr, // 稍后再说 - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w500, + // 只在可以跳过时显示跳过按钮 + if (canSkip) ...[ + SizedBox(height: 12.h), + TextButton( + onPressed: () => controller.skipPairing(), + style: TextButton.styleFrom( + foregroundColor: Color(0xFF0066CC), + padding: EdgeInsets.symmetric(vertical: 12.h), + minimumSize: Size(double.infinity, 48.h), + ), + child: Text( + 'talkLater'.tr, // 稍后再说 + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), ), - ), - ), - ], - ), - ); + ], + ], + ), + ); + }); + } + + // 根据状态获取按钮颜色 + Color _getButtonColor(PairingState state, bool isDarkMode) { + switch (state) { + case PairingState.exitNoPermission: + case PairingState.exitBtOff: + return isDarkMode ? Colors.grey[800]! : Colors.grey[600]!; + case PairingState.exitPairFailed: + case PairingState.exitBound: + case PairingState.exitIllegal: + return Colors.red; + default: + return Color(0xFF0066CC); + } } } diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt index 68f15312a..07f3ab396 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt @@ -261,6 +261,23 @@ class BleServicePlugin : FlutterPlugin, MethodCallHandler, ActivityAware, val macAddress = bleCompanionManager.getPairedMacAddress() result.success(macAddress) } + "verifyDeviceCanPair" -> { + // Android上暂时返回true,实际验证逻辑待实现 + result.success(true) + } + "savePairedMacAddress" -> { + val macAddress = call.argument("macAddress") + if (macAddress != null) { + bleCompanionManager.savePairedMacAddress(macAddress) + result.success(true) + } else { + result.error("INVALID_ARGUMENT", "MAC地址参数不能为空", null) + } + } + "isBleConnected" -> { + val connected = BleService.isConnected() + result.success(connected) + } "registerBackgroundScan" -> { bleCompanionManager.registerBackgroundScan() result.success(true) diff --git a/local_plugins/ble_service/ios/Classes/BleAccessorySetup.swift b/local_plugins/ble_service/ios/Classes/BleAccessorySetup.swift index 4d687b71e..67ad78c17 100644 --- a/local_plugins/ble_service/ios/Classes/BleAccessorySetup.swift +++ b/local_plugins/ble_service/ios/Classes/BleAccessorySetup.swift @@ -19,6 +19,9 @@ class BleAccessorySetup: NSObject { private let deviceCompanyIdentifier: UInt16 = 0xEFAB private let deviceDisplayName = "语音助理耳机" + // 用于存储配对设备UUID的UserDefaults键 + private let pairedDeviceUUIDKey = "com.yunqiinnovation.ble_service.paired_device_uuid" + typealias DeviceDiscoveredCallback = (UUID) -> Void private var onDeviceDiscovered: DeviceDiscoveredCallback? @@ -65,10 +68,37 @@ class BleAccessorySetup: NSObject { // MARK: - 会话管理 func initializeSession() { - if isInitializing || (session != nil && isSessionActivated) { + if isInitializing { + os_log("会话正在初始化中,跳过", log: logger, type: .info) return } + // 如果会话已激活,检查是否有配对设备 + if session != nil && isSessionActivated { + os_log("会话已激活,检查配对设备", log: logger, type: .info) + // 会话已激活,检查是否有配对设备 + if let accessories = session?.accessories, !accessories.isEmpty { + os_log("发现 %d 个已配对设备,尝试连接", log: logger, type: .info, accessories.count) + // 有配对设备,尝试连接 + if let service = bleService { + let _ = service.getCentralManager() + + for accessory in accessories { + if let uuid = accessory.bluetoothIdentifier { + onDeviceDiscovered?(uuid) + connectToAccessory(uuid: uuid) + } + } + } + } else { + os_log("没有已配对设备,显示配对框", log: logger, type: .info) + // 没有配对设备,直接显示配对框 + showDevicePicker() + } + return + } + + os_log("开始初始化新会话", log: logger, type: .info) isInitializing = true do { @@ -78,6 +108,7 @@ class BleAccessorySetup: NSObject { self.handleSessionEvent(event) } } catch { + os_log("会话初始化失败: %{public}@", log: logger, type: .error, error.localizedDescription) handleSessionInitError(error) } } @@ -92,9 +123,12 @@ class BleAccessorySetup: NSObject { // MARK: - 设备选择器显示 private func showDevicePicker() { guard let session = session, isSessionActivated else { + os_log("无法显示配对框:会话未激活", log: logger, type: .error) return } + os_log("准备显示设备配对框", log: logger, type: .info) + let descriptor = ASDiscoveryDescriptor() descriptor.bluetoothCompanyIdentifier = ASBluetoothCompanyIdentifier(deviceCompanyIdentifier) @@ -106,12 +140,15 @@ class BleAccessorySetup: NSObject { ) DispatchQueue.main.async { + os_log("正在显示设备配对框", log: self.logger, type: .info) session.showPicker(for: [displayItem]) { [weak self] error in guard let self = self else { return } if let error = error { let nsError = error as NSError os_log("设备选择器错误: %{public}@", log: self.logger, type: .error, error.localizedDescription) + } else { + os_log("设备选择器完成", log: self.logger, type: .info) } } } @@ -129,15 +166,19 @@ class BleAccessorySetup: NSObject { handleAccessoryAdded(event.accessory) case .accessoryRemoved: + os_log("设备已移除: %{public}@", log: logger, type: .info, event.accessory?.bluetoothIdentifier?.uuidString ?? "Unknown") handleAccessoryRemoved(event.accessory) case .accessoryChanged: + os_log("设备状态已改变", log: logger, type: .info) break case .pickerDidPresent: + os_log("配对框已显示", log: logger, type: .info) break case .pickerDidDismiss: + os_log("配对框已关闭", log: logger, type: .info) break case .pickerSetupFailed: @@ -145,6 +186,7 @@ class BleAccessorySetup: NSObject { event.error?.localizedDescription ?? "未知错误") default: + os_log("未处理的会话事件: %d", log: logger, type: .info, event.eventType.rawValue) break } } @@ -174,6 +216,9 @@ class BleAccessorySetup: NSObject { return } + // 保存配对设备的UUID + savePairedMacAddress(uuid) + onDeviceDiscovered?(uuid) connectToAccessory(uuid: uuid) } @@ -217,6 +262,9 @@ class BleAccessorySetup: NSObject { func clearAssociations() { resetBluetoothState() + // 清除保存的配对设备UUID + clearPairedMacAddress() + #if canImport(AccessorySetupKit) && swift(>=5.9) if #available(iOS 18.0, *) { resetSession() @@ -224,4 +272,34 @@ class BleAccessorySetup: NSObject { } #endif } + + // MARK: - 配对设备UUID管理 + + /// 获取已配对设备的UUID字符串 + /// 返回存储的配对设备UUID,如果没有则返回nil + func getPairedMacAddress() -> String? { + let uuidString = UserDefaults.standard.string(forKey: pairedDeviceUUIDKey) + if let uuidString = uuidString, !uuidString.isEmpty { + os_log("获取已配对设备UUID: %{public}@", log: logger, type: .info, uuidString) + return uuidString + } + os_log("未找到已配对设备UUID", log: logger, type: .info) + return nil + } + + /// 保存配对设备的UUID + /// - Parameter uuid: 要保存的设备UUID + func savePairedMacAddress(_ uuid: UUID) { + let uuidString = uuid.uuidString + UserDefaults.standard.set(uuidString, forKey: pairedDeviceUUIDKey) + UserDefaults.standard.synchronize() + os_log("已保存配对设备UUID: %{public}@", log: logger, type: .info, uuidString) + } + + /// 清除已保存的配对设备UUID + private func clearPairedMacAddress() { + UserDefaults.standard.removeObject(forKey: pairedDeviceUUIDKey) + UserDefaults.standard.synchronize() + os_log("已清除配对设备UUID", log: logger, type: .info) + } } \ No newline at end of file diff --git a/local_plugins/ble_service/ios/Classes/SwiftBleServicePlugin.swift b/local_plugins/ble_service/ios/Classes/SwiftBleServicePlugin.swift index a619e95e1..c6fca81c8 100644 --- a/local_plugins/ble_service/ios/Classes/SwiftBleServicePlugin.swift +++ b/local_plugins/ble_service/ios/Classes/SwiftBleServicePlugin.swift @@ -7,8 +7,8 @@ import os public class SwiftBleServicePlugin: NSObject, FlutterPlugin { // MARK: - 属性 private var methodChannel: FlutterMethodChannel - private var dataEventSink: FlutterEventSink? - private var statusEventSink: FlutterEventSink? + internal var dataEventSink: FlutterEventSink? + internal var statusEventSink: FlutterEventSink? private let logger = OSLog(subsystem: "com.yunqiinnovation.ble_service", category: "BleServicePlugin") // 标记是否已初始化所有服务 @@ -84,12 +84,16 @@ public class SwiftBleServicePlugin: NSObject, FlutterPlugin { let instance = SwiftBleServicePlugin(channel) registrar.addMethodCallDelegate(instance, channel: channel) - // 注册事件通道 + // 注册事件通道 - 为每个通道创建独立的handler let dataEventChannel = FlutterEventChannel(name: "com.yunqiinnovation.ble_service/data_events", binaryMessenger: registrar.messenger()) let statusEventChannel = FlutterEventChannel(name: "com.yunqiinnovation.ble_service/status_events", binaryMessenger: registrar.messenger()) - dataEventChannel.setStreamHandler(instance) - statusEventChannel.setStreamHandler(instance) + // 创建独立的StreamHandler + let dataHandler = BleDataStreamHandler(instance) + let statusHandler = BleStatusStreamHandler(instance) + + dataEventChannel.setStreamHandler(dataHandler) + statusEventChannel.setStreamHandler(statusHandler) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { @@ -122,7 +126,21 @@ public class SwiftBleServicePlugin: NSObject, FlutterPlugin { #endif case "getPairedMacAddress": + #if canImport(AccessorySetupKit) && swift(>=5.9) + if #available(iOS 18.0, *) { + let pairedUUID = BleAccessorySetup.shared.getPairedMacAddress() + result(pairedUUID) + } else { + result(nil) + } + #else result(nil) + #endif + + + + case "isBleConnected": + result(BleService.shared.isConnected()) case "registerBackgroundScan", "unregisterBackgroundScan": // iOS上禁用,直接返回成功以避免Flutter端报错 @@ -240,46 +258,6 @@ public class SwiftBleServicePlugin: NSObject, FlutterPlugin { } } -// MARK: - FlutterStreamHandler -@available(iOS 13.0, *) -extension SwiftBleServicePlugin: FlutterStreamHandler { - public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { - if let args = arguments as? [String: Any], let type = args["type"] as? String { - if type == "data" { - dataEventSink = events - } else if type == "status" { - statusEventSink = events - } - } else { - // 默认行为:根据注册的通道来确定事件类型 - if arguments == nil { - // 如果无参数,根据函数被调用的顺序确定 - if dataEventSink == nil { - dataEventSink = events - } else { - statusEventSink = events - } - } - } - return nil - } - - public func onCancel(withArguments arguments: Any?) -> FlutterError? { - if let args = arguments as? [String: Any], let type = args["type"] as? String { - if type == "data" { - dataEventSink = nil - } else if type == "status" { - statusEventSink = nil - } - } else { - // 同时清除两个sink - dataEventSink = nil - statusEventSink = nil - } - return nil - } -} - // MARK: - BleService.Callback @available(iOS 13.0, *) extension SwiftBleServicePlugin: BleService.Callback { @@ -287,7 +265,7 @@ extension SwiftBleServicePlugin: BleService.Callback { if let eventSink = statusEventSink { DispatchQueue.main.async { eventSink([ - "event": "scanResult", + "type": "scanResult", "devices": devices ]) } @@ -296,27 +274,27 @@ extension SwiftBleServicePlugin: BleService.Callback { public func onConnectionStateChanged(state: Int) { if let eventSink = statusEventSink { - var stateDesc = "未知" + var stateStr = "Unknown" switch state { case BleConst.STATE_DISCONNECTED: - stateDesc = "已断开" + stateStr = "Disconnected" case BleConst.STATE_CONNECTING: - stateDesc = "连接中" + stateStr = "Connecting" case BleConst.STATE_CONNECTED: - stateDesc = "已连接" + stateStr = "Connected" case BleConst.STATE_DISCONNECTING: - stateDesc = "断开中" + stateStr = "Disconnecting" case BleConst.STATE_ERROR: - stateDesc = "错误" + stateStr = "Connection Error" default: - break + stateStr = "Unknown State(\(state))" } DispatchQueue.main.async { eventSink([ - "event": "connectionStateChanged", + "type": "connectionStateChanged", "state": state, - "stateDesc": stateDesc + "stateStr": stateStr ]) } } @@ -326,7 +304,7 @@ extension SwiftBleServicePlugin: BleService.Callback { if let eventSink = dataEventSink { DispatchQueue.main.async { eventSink([ - "event": "audioDataReceived", + "type": "audioData", "data": FlutterStandardTypedData(bytes: data) ]) } @@ -337,7 +315,7 @@ extension SwiftBleServicePlugin: BleService.Callback { if let eventSink = statusEventSink { DispatchQueue.main.async { eventSink([ - "event": "wakeupSignalReceived" + "type": "wakeup" ]) } } @@ -345,13 +323,52 @@ extension SwiftBleServicePlugin: BleService.Callback { public func onDeviceInfoReceived(infoType: Int, infoData: [String: Any]) { if let eventSink = statusEventSink { + var resultMap = infoData + resultMap["type"] = "deviceInfo" + resultMap["result"] = infoType + DispatchQueue.main.async { - eventSink([ - "event": "deviceInfoReceived", - "infoType": infoType, - "infoData": infoData - ]) + eventSink(resultMap) } } } +} + +// MARK: - 独立的StreamHandler类 +@available(iOS 13.0, *) +class BleDataStreamHandler: NSObject, FlutterStreamHandler { + private weak var plugin: SwiftBleServicePlugin? + + init(_ plugin: SwiftBleServicePlugin) { + self.plugin = plugin + } + + func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { + plugin?.dataEventSink = events + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + plugin?.dataEventSink = nil + return nil + } +} + +@available(iOS 13.0, *) +class BleStatusStreamHandler: NSObject, FlutterStreamHandler { + private weak var plugin: SwiftBleServicePlugin? + + init(_ plugin: SwiftBleServicePlugin) { + self.plugin = plugin + } + + func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { + plugin?.statusEventSink = events + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + plugin?.statusEventSink = nil + return nil + } } \ No newline at end of file diff --git a/local_plugins/ble_service/lib/ble_service.dart b/local_plugins/ble_service/lib/ble_service.dart index 076da7705..232aba03b 100644 --- a/local_plugins/ble_service/lib/ble_service.dart +++ b/local_plugins/ble_service/lib/ble_service.dart @@ -245,7 +245,20 @@ class BleService { return null; } } + + /// 检查BLE连接状态 + /// + /// 返回BLE是否已连接 + Future isBleConnected() async { + try { + final result = await _methodChannel.invokeMethod('isBleConnected'); + return result ?? false; + } catch (e) { + print('检查BLE连接状态失败: $e'); + return false; + } + } /// 注册BLE后台扫描 /// diff --git a/macos/Podfile.lock b/macos/Podfile.lock index b70239d80..352cc6d03 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,57 +1,10 @@ PODS: - app_settings (5.1.1): - FlutterMacOS - - AppAuth (1.7.6): - - AppAuth/Core (= 1.7.6) - - AppAuth/ExternalUserAgent (= 1.7.6) - - AppAuth/Core (1.7.6) - - AppAuth/ExternalUserAgent (1.7.6): - - AppAuth/Core - - audio_session (0.0.1): - - FlutterMacOS - device_info_plus (0.0.1): - FlutterMacOS - facebook_auth_desktop (0.0.3): - FlutterMacOS - - file_picker (0.0.1): - - FlutterMacOS - - file_selector_macos (0.0.1): - - FlutterMacOS - - Firebase/Auth (11.10.0): - - Firebase/CoreOnly - - FirebaseAuth (~> 11.10.0) - - Firebase/CoreOnly (11.10.0): - - FirebaseCore (~> 11.10.0) - - firebase_auth (5.5.2): - - Firebase/Auth (~> 11.10.0) - - Firebase/CoreOnly (~> 11.10.0) - - firebase_core - - FlutterMacOS - - firebase_core (3.13.0): - - Firebase/CoreOnly (~> 11.10.0) - - FlutterMacOS - - FirebaseAppCheckInterop (11.12.0) - - FirebaseAuth (11.10.0): - - FirebaseAppCheckInterop (~> 11.0) - - FirebaseAuthInterop (~> 11.0) - - FirebaseCore (~> 11.10.0) - - FirebaseCoreExtension (~> 11.10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/Environment (~> 8.0) - - GTMSessionFetcher/Core (< 5.0, >= 3.4) - - RecaptchaInterop (~> 101.0) - - FirebaseAuthInterop (11.12.0) - - FirebaseCore (11.10.0): - - FirebaseCoreInternal (~> 11.10.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreExtension (11.10.0): - - FirebaseCore (~> 11.10.0) - - FirebaseCoreInternal (11.10.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - flutter_blue_plus_darwin (0.0.2): - - Flutter - - FlutterMacOS - flutter_image_compress_macos (1.0.0): - FlutterMacOS - flutter_local_notifications (0.0.1): @@ -61,125 +14,30 @@ PODS: - flutter_tts (0.0.1): - FlutterMacOS - FlutterMacOS (1.0.0) - - google_sign_in_ios (0.0.1): - - AppAuth (>= 1.7.4) - - Flutter - - FlutterMacOS - - GoogleSignIn (~> 7.1) - - GTMSessionFetcher (>= 3.4.0) - - GoogleSignIn (7.1.0): - - AppAuth (< 2.0, >= 1.7.3) - - GTMAppAuth (< 5.0, >= 4.1.1) - - GTMSessionFetcher/Core (~> 3.3) - - GoogleUtilities/AppDelegateSwizzler (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.0): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.0)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.0) - - GoogleUtilities/Reachability (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GTMAppAuth (4.1.1): - - AppAuth/Core (~> 1.7) - - GTMSessionFetcher/Core (< 4.0, >= 3.3) - - GTMSessionFetcher (3.5.0): - - GTMSessionFetcher/Full (= 3.5.0) - - GTMSessionFetcher/Core (3.5.0) - - GTMSessionFetcher/Full (3.5.0): - - GTMSessionFetcher/Core - - just_audio (0.0.1): - - Flutter - - FlutterMacOS - - package_info_plus (0.0.1): - - FlutterMacOS - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - record_darwin (1.0.0): - FlutterMacOS - - share_plus (0.0.1): - - FlutterMacOS - - sqflite_darwin (0.0.4): - - Flutter - - FlutterMacOS - - webview_flutter_wkwebview (0.0.1): - - Flutter - - FlutterMacOS - window_size (0.0.2): - FlutterMacOS DEPENDENCIES: - app_settings (from `Flutter/ephemeral/.symlinks/plugins/app_settings/macos`) - - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - facebook_auth_desktop (from `Flutter/ephemeral/.symlinks/plugins/facebook_auth_desktop/macos`) - - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - - firebase_auth (from `Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos`) - - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) - - flutter_blue_plus_darwin (from `Flutter/ephemeral/.symlinks/plugins/flutter_blue_plus_darwin/darwin`) - flutter_image_compress_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_image_compress_macos/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - flutter_tts (from `Flutter/ephemeral/.symlinks/plugins/flutter_tts/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - - google_sign_in_ios (from `Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin`) - - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/darwin`) - - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - record_darwin (from `Flutter/ephemeral/.symlinks/plugins/record_darwin/macos`) - - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) - - webview_flutter_wkwebview (from `Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin`) - window_size (from `Flutter/ephemeral/.symlinks/plugins/window_size/macos`) -SPEC REPOS: - trunk: - - AppAuth - - Firebase - - FirebaseAppCheckInterop - - FirebaseAuth - - FirebaseAuthInterop - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - - GoogleSignIn - - GoogleUtilities - - GTMAppAuth - - GTMSessionFetcher - EXTERNAL SOURCES: app_settings: :path: Flutter/ephemeral/.symlinks/plugins/app_settings/macos - audio_session: - :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos device_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos facebook_auth_desktop: :path: Flutter/ephemeral/.symlinks/plugins/facebook_auth_desktop/macos - file_picker: - :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos - file_selector_macos: - :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos - firebase_auth: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos - firebase_core: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos - flutter_blue_plus_darwin: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_blue_plus_darwin/darwin flutter_image_compress_macos: :path: Flutter/ephemeral/.symlinks/plugins/flutter_image_compress_macos/macos flutter_local_notifications: @@ -190,60 +48,21 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/flutter_tts/macos FlutterMacOS: :path: Flutter/ephemeral - google_sign_in_ios: - :path: Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin - just_audio: - :path: Flutter/ephemeral/.symlinks/plugins/just_audio/darwin - package_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos - path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin record_darwin: :path: Flutter/ephemeral/.symlinks/plugins/record_darwin/macos - share_plus: - :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos - sqflite_darwin: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin - webview_flutter_wkwebview: - :path: Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin window_size: :path: Flutter/ephemeral/.symlinks/plugins/window_size/macos SPEC CHECKSUMS: app_settings: cd21e176b56f8172043640ade81322a98896bff4 - AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 - audio_session: eaca2512cf2b39212d724f35d11f46180ad3a33e device_info_plus: a56e6e74dbbd2bb92f2da12c64ddd4f67a749041 facebook_auth_desktop: bf89ccf460c903de45e86fa0c7878b8b62db65fb - file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a - file_selector_macos: 6280b52b459ae6c590af5d78fc35c7267a3c4b31 - Firebase: 1fe1c0a7d9aaea32efe01fbea5f0ebd8d70e53a2 - firebase_auth: 22945027646e71960caae1b9f2b2498d7a52a4c7 - firebase_core: efd50ad8177dc489af1b9163a560359cf1b30597 - FirebaseAppCheckInterop: 73b173e5ec45192e2d522ad43f526a82ad10b852 - FirebaseAuth: c4146bdfdc87329f9962babd24dae89373f49a32 - FirebaseAuthInterop: b583210c039a60ed3f1e48865e1f3da44a796595 - FirebaseCore: 8344daef5e2661eb004b177488d6f9f0f24251b7 - FirebaseCoreExtension: 6f357679327f3614e995dc7cf3f2d600bdc774ac - FirebaseCoreInternal: ef4505d2afb1d0ebbc33162cb3795382904b5679 - flutter_blue_plus_darwin: 09444a26fb6bdef523e55b68fc1c59af5a877ea6 flutter_image_compress_macos: e68daf54bb4bf2144c580fd4d151c949cbf492f0 flutter_local_notifications: 13862b132e32eb858dea558a86d45d08daeacfe7 flutter_secure_storage_macos: 7f45e30f838cf2659862a4e4e3ee1c347c2b3b54 flutter_tts: ae915565cc6948444b513acc8ee021993281e027 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - google_sign_in_ios: 19297361f2c51d7d8ac0201b866ef1fa5d1f94a8 - GoogleSignIn: d4281ab6cf21542b1cfaff85c191f230b399d2db - GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de - GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed - package_info_plus: f0052d280d17aa382b932f399edf32507174e870 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 record_darwin: 30509266ae213af8afdb09a8ae7467cb64c1377e - share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc - sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 - webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2 window_size: 4bd15034e6e3d0720fd77928a7c42e5492cfece9 PODFILE CHECKSUM: 8c4442624fc136b0afb378a2502958e01c05d073 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 11828b195..f8204469c 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -28,6 +28,7 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 8A1F597EEC2C8309B42497EF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D0AA1BD9497E076A526E305 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ @@ -103,6 +104,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, 8A1F597EEC2C8309B42497EF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -241,7 +243,6 @@ 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, EEBEF79BCB6B649D2C3D134C /* [CP] Embed Pods Frameworks */, - 5D85B8FB5391E947F8A1E18F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -249,6 +250,9 @@ 33CC11202044C79F0003C045 /* PBXTargetDependency */, ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 33CC10ED2044A3C60003C045 /* deep_voice.app */; productType = "com.apple.product-type.application"; @@ -293,6 +297,9 @@ Base, ); mainGroup = 33CC10E42044A3C60003C045; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -406,23 +413,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 5D85B8FB5391E947F8A1E18F /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; EEBEF79BCB6B649D2C3D134C /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -814,6 +804,20 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 33CC10E52044A3C60003C045 /* Project object */; } diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 000000000..3ae6ca0db --- /dev/null +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,159 @@ +{ + "originHash" : "43ec3e8c995feac2564bd470ce08bfc30cda7c3488c8f7fda841884ffd2849c0", + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", + "version" : "1.2024072200.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "61b85103a1aeed8218f17c794687781505fbbef5", + "version" : "11.2.0" + } + }, + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "2781038865a80e2c425a1da12cc1327bcd56501f", + "version" : "1.7.6" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "3663b1aa6c7a1bed67ee80fd09dc6d0f9c3bb660", + "version" : "11.13.0" + } + }, + { + "identity" : "flutterfire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/flutterfire", + "state" : { + "revision" : "a80a123386fd4904cad6938673020a7bcf31b2f2", + "version" : "3.13.0-firebase-core-swift" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "543071966b3fb6613a2fc5c6e7112d1e998184a7", + "version" : "11.13.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googlesignin-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleSignIn-iOS.git", + "state" : { + "revision" : "a7965d134c5d3567026c523e0a8a583f73b62b0d", + "version" : "7.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "60da361632d0de02786f709bdc0c4df340f7613e", + "version" : "8.1.0" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "cc0001a0cf963aa40501d9c2b181e7fc9fd8ec71", + "version" : "1.69.0" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b", + "version" : "3.5.0" + } + }, + { + "identity" : "gtmappauth", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GTMAppAuth.git", + "state" : { + "revision" : "5d7d66f647400952b1758b230e019b07c0b4b22a", + "version" : "4.1.1" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", + "version" : "101.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "d72aed98f8253ec1aa9ea1141e28150f408cf17f", + "version" : "1.29.0" + } + } + ], + "version" : 3 +} diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a257ecc5f..f3035a1fc 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 000000000..3ae6ca0db --- /dev/null +++ b/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,159 @@ +{ + "originHash" : "43ec3e8c995feac2564bd470ce08bfc30cda7c3488c8f7fda841884ffd2849c0", + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", + "version" : "1.2024072200.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "61b85103a1aeed8218f17c794687781505fbbef5", + "version" : "11.2.0" + } + }, + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "2781038865a80e2c425a1da12cc1327bcd56501f", + "version" : "1.7.6" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "3663b1aa6c7a1bed67ee80fd09dc6d0f9c3bb660", + "version" : "11.13.0" + } + }, + { + "identity" : "flutterfire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/flutterfire", + "state" : { + "revision" : "a80a123386fd4904cad6938673020a7bcf31b2f2", + "version" : "3.13.0-firebase-core-swift" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "543071966b3fb6613a2fc5c6e7112d1e998184a7", + "version" : "11.13.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googlesignin-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleSignIn-iOS.git", + "state" : { + "revision" : "a7965d134c5d3567026c523e0a8a583f73b62b0d", + "version" : "7.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "60da361632d0de02786f709bdc0c4df340f7613e", + "version" : "8.1.0" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "cc0001a0cf963aa40501d9c2b181e7fc9fd8ec71", + "version" : "1.69.0" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b", + "version" : "3.5.0" + } + }, + { + "identity" : "gtmappauth", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GTMAppAuth.git", + "state" : { + "revision" : "5d7d66f647400952b1758b230e019b07c0b4b22a", + "version" : "4.1.1" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", + "version" : "101.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "d72aed98f8253ec1aa9ea1141e28150f408cf17f", + "version" : "1.29.0" + } + } + ], + "version" : 3 +}