# #firebase #flutter
Вопрос:
Авторизация телефона Firebase работает в симуляторе, а не на реальном устройстве.
я уже создал ключ apn в developer.apple.com и добавьте это в firebase и включенный фоновый режим, а также проверьте выборку, процесс и фон.
Вот что выводит консоль:
Runner[11345:2633540] GTMSessionFetcher invoking fetch callbacks, data {length = 252, bytes = 0x7b0a2020 22657272 6f72223a 207b0a20 ... 5d0a2020 7d0a7d0a }, error Error Domain=com.google.HTTPStatus Code=400 "(null)" UserInfo={data={length = 252, bytes = 0x7b0a2020 22657272 6f72223a 207b0a20 ... 5d0a2020 7d0a7d0a }, data_content_type=application/json; charset=UTF-8} 2021-10-29 22:07:22.273998 0300 Runner[11345:2633546] flutter: Invalid token. 2021-10-29 22:07:22.523814 0300 Runner[11345:2633540] [connection] nw_resolver_start_query_timer_block_invoke [C3.1] Query fired: did not receive all answers in time for www.googleapis.com:443
Мой код флаттера выглядит следующим образом
Futurelt;voidgt; verifyPhone() async { await _auth.verifyPhoneNumber( phoneNumber: _phoneNumber, verificationCompleted: (PhoneAuthCredential credential) async { await FirebaseAuth.instance.signInWithCredential(credential); final snackBar = SnackBar(content: Text("Login Success")); ScaffoldMessenger.of(context).showSnackBar(snackBar); }, verificationFailed: (FirebaseAuthException e) { print(e.message); final snackBar = SnackBar(content: Text("verificationFailed ${e.message}")); ScaffoldMessenger.of(context).showSnackBar(snackBar); }, codeSent: (String verficationId, int resendToken) { setState(() { codeSent = true; verId = verficationId; }); }, codeAutoRetrievalTimeout: (String verificationId) { setState(() { verId = verificationId; }); }, timeout: Duration(seconds: 60), ); }
AppDelegate.swift
import UIKit import Flutter import Firebase @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -gt; Bool { FirebaseApp.configure() GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
Подфайл
# Uncomment this line to define a global platform for your project # platform :ios, '9.0' platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' project 'Runner', { 'Debug' =gt; :debug, 'Profile' =gt; :release, 'Release' =gt; :release, } def flutter_root generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) unless File.exist?(generated_xcode_build_settings_path) raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" end File.foreach(generated_xcode_build_settings_path) do |line| matches = line.match(/FLUTTER_ROOT=(.*)/) return matches[1].strip if matches end raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" end require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) flutter_ios_podfile_setup target 'Runner' do use_frameworks! use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) end end
Info.plist
lt;?xml version="1.0" encoding="UTF-8"?gt; lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"gt; lt;plist version="1.0"gt; lt;dictgt; lt;keygt;CFBundleDevelopmentRegionlt;/keygt; lt;stringgt;$(DEVELOPMENT_LANGUAGE)lt;/stringgt; lt;keygt;CFBundleDisplayNamelt;/keygt; lt;stringgt;DOTHawalalt;/stringgt; lt;keygt;CFBundleExecutablelt;/keygt; lt;stringgt;$(EXECUTABLE_NAME)lt;/stringgt; lt;keygt;CFBundleIdentifierlt;/keygt; lt;stringgt;$(PRODUCT_BUNDLE_IDENTIFIER)lt;/stringgt; lt;keygt;CFBundleInfoDictionaryVersionlt;/keygt; lt;stringgt;6.0lt;/stringgt; lt;keygt;CFBundleLocalizationslt;/keygt; lt;arraygt; lt;stringgt;enlt;/stringgt; lt;stringgt;falt;/stringgt; lt;stringgt;arlt;/stringgt; lt;/arraygt; lt;keygt;CFBundleNamelt;/keygt; lt;stringgt;dot_exchangelt;/stringgt; lt;keygt;CFBundlePackageTypelt;/keygt; lt;stringgt;APPLlt;/stringgt; lt;keygt;CFBundleShortVersionStringlt;/keygt; lt;stringgt;$(FLUTTER_BUILD_NAME)lt;/stringgt; lt;keygt;CFBundleSignaturelt;/keygt; lt;stringgt;????lt;/stringgt; lt;keygt;CFBundleURLTypeslt;/keygt; lt;arraygt; lt;dictgt; lt;keygt;CFBundleTypeRolelt;/keygt; lt;stringgt;Editorlt;/stringgt; lt;keygt;CFBundleURLSchemeslt;/keygt; lt;arraygt; lt;stringgt;com.googleusercontent.apps.768659512914-kgtssn20sbm0ioj47dnp8ekcgsgou7b8lt;/stringgt; lt;/arraygt; lt;/dictgt; lt;/arraygt; lt;keygt;CFBundleVersionlt;/keygt; lt;stringgt;$(FLUTTER_BUILD_NUMBER)lt;/stringgt; lt;keygt;LSApplicationQueriesSchemeslt;/keygt; lt;arraygt; lt;stringgt;httpslt;/stringgt; lt;stringgt;httplt;/stringgt; lt;/arraygt; lt;keygt;LSRequiresIPhoneOSlt;/keygt; lt;true/gt; lt;keygt;NSAppTransportSecuritylt;/keygt; lt;dictgt; lt;keygt;NSAllowsArbitraryLoadslt;/keygt; lt;true/gt; lt;/dictgt; lt;keygt;UIBackgroundModeslt;/keygt; lt;arraygt; lt;stringgt;fetchlt;/stringgt; lt;stringgt;processinglt;/stringgt; lt;stringgt;remote-notificationlt;/stringgt; lt;/arraygt; lt;keygt;UILaunchStoryboardNamelt;/keygt; lt;stringgt;LaunchScreenlt;/stringgt; lt;keygt;UIMainStoryboardFilelt;/keygt; lt;stringgt;Mainlt;/stringgt; lt;keygt;UISupportedInterfaceOrientationslt;/keygt; lt;arraygt; lt;stringgt;UIInterfaceOrientationPortraitlt;/stringgt; lt;stringgt;UIInterfaceOrientationLandscapeLeftlt;/stringgt; lt;stringgt;UIInterfaceOrientationLandscapeRightlt;/stringgt; lt;/arraygt; lt;keygt;UISupportedInterfaceOrientations~ipadlt;/keygt; lt;arraygt; lt;stringgt;UIInterfaceOrientationPortraitlt;/stringgt; lt;stringgt;UIInterfaceOrientationPortraitUpsideDownlt;/stringgt; lt;stringgt;UIInterfaceOrientationLandscapeLeftlt;/stringgt; lt;stringgt;UIInterfaceOrientationLandscapeRightlt;/stringgt; lt;/arraygt; lt;keygt;UIViewControllerBasedStatusBarAppearancelt;/keygt; lt;false/gt; lt;/dictgt; lt;/plistgt;
Ответ №1:
Создайте ключ apn в developer.apple.com и добавьте это в firebase. Затем в xcode добавьте схему URL — адреса и вставьте в нее обратный идентификатор клиента. Включите push-уведомление в настройках, включите фоновый режим и проверьте выборку, процесс и фон.
Отредактируйте и добавьте эти строки в свой список info.plist lt;keygt;FirebaseAppDelegateProxyEnabledlt;/keygt; lt;false/gt;
и в коде добавьте
FirebaseMessaging.instance.getToken().then((token) { print('$token'); });
просто чтобы проверить, получаете ли вы токен так, как ожидалось.
Комментарии:
1. Я сделал все, чтобы в лесном выпуске все работало, но после этого остановилось и показало мне эту ошибку
2. Вы также добавили тип URL-адреса в раздел «Информация»?
3. Да, конечно, в симуляторе работает, когда я подключаюсь к реальному устройству, покажите мне ошибку
4. Вы установили коды в appdeligate.swift? Было бы полезно, если бы вы могли опубликовать делегат приложения, файл модуля и info.plist, а также скриншот Xcode, показывающий возможности
5. да, я все сделал
Ответ №2:
Я столкнулся с точно такой же проблемой и решил ее.
- Прежде всего, убедитесь, что
firebase_messaging
это указано в разделеpubspec.yaml
. - Если вы установите параметр для Info.plist
lt;keygt;FirebaseAppDelegateProxyEnabledlt;/keygt; lt;false/gt;
, это будет решено путем добавления этой реализацииios/Runner/AppDelegate.swift
. (или, возможно, просто удалитьlt;keygt;FirebaseAppDelegateProxyEnabledlt;/keygt; lt;false/gt;
из Info.plist, это будет решено просто.)
import UIKit import Flutter import FirebaseMessaging @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -gt; Bool { GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } } // 👇 this block override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // NOTE: For logging // let deviceTokenString = deviceToken.reduce("", {$0 String(format: "X", $1)}) // print("==== didRegisterForRemoteNotificationsWithDeviceToken ====") // print(deviceTokenString) Messaging.messaging().apnsToken = deviceToken } }