Flutter/Firebase 应用程序中的 verifyPhoneNumber 无法正常工作(“令牌不匹配”)

问题描述 投票:0回答:1

我已经尝试让“signinwithphonenumber”工作好几天了,但我似乎无法在 iOS 上做到这一点。它在 Android 上工作正常,但尽我所能,我无法让 iOS 版本工作。

这就是我登录 firebase 的方式:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // Initialize Firebase
  await Firebase.initializeApp(
    name: '<app name>',
    options: DefaultFirebaseOptions.currentPlatform,
  ).then((_) {
    print("Firebase initialized successfully.");
  }).catchError((error) {
    print("Error initializing Firebase: $error");
  });

// Clear Firestore persistence here
  try {
    await FirebaseFirestore.instance.clearPersistence();
    print('Firestore persistence cleared.');
  } catch (e) {
    print('Error clearing Firestore persistence: $e');
  }

  // Set Firestore settings
  try {
    FirebaseFirestore.instance.settings = const Settings(
      persistenceEnabled: false,
      sslEnabled: false,
      cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED,
    );
    print('Firestore settings updated.');
  } catch (e) {
    print('Error setting up Firestore: $e');
  }

  globals.fbdb = FirebaseFirestore.instance;
  globals.fbauth = FirebaseAuth.instance;
  globals.fbs = FirebaseStorage.instance;

  // Run the app
  runApp(const <appname>());
}

这是我尝试验证电话号码的地方:

  static Future<void> verifyPhoneNumber(String phoneNumber) async {
    await FirebaseMessaging.instance.getToken();

    print("+++ phoneNumber = ${phoneNumber}");
    await globals.fbauth.verifyPhoneNumber(
      phoneNumber: phoneNumber,
      verificationCompleted: (PhoneAuthCredential credential) async {
        // Auto-retrieve verification code
        print("Verification Complete has been triggered for some reason!");
      },
      verificationFailed: (FirebaseAuthException e) {
        // Verification failed
        print('+++ Verification failed. Error = ${e}');
      },
      codeSent: (String verificationId, int? resendToken) async {
        // Save the verification ID for future use
        print('got through to codeSent section');
      },
      codeAutoRetrievalTimeout: (String verificationId) {},
      timeout: Duration(seconds: 60),
    );
  }
}

这总是会触发“verificationFailed”部分,并显示错误“令牌不匹配”。

这是AppDelegate.swift:

import UIKit
import Firebase
import Flutter
import FirebaseMessaging
import FirebaseAuth

@main
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        // Firebase initialization
        GeneratedPluginRegistrant.register(with: self)
        Messaging.messaging().delegate = self
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        if Auth.auth().canHandleNotification(userInfo) {
            print(userInfo)
            return
        }
        completionHandler(.newData)
    }

    override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Auth.auth().setAPNSToken(deviceToken, type: AuthAPNSTokenType.unknown)
    }
}

extension AppDelegate: MessagingDelegate {
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("Firebase registration token: \(String(describing: fcmToken))")
    }
}

Flutter版本=3.24.3<>稳定通道 飞镖3.5.3 开发工具 2.37.3

Xcode:版本 15.4 (15F31d)

Android Studio Koala 功能下降 | 2024.1.2

Mac mini M2 Pro - 32GB

在 iPhone 13(真实设备)上测试

  • 没有编译问题
  • 所有插件都是最新的(所有 Firebase 插件都是可用的最新版本)
  • “firebase-options.dart”文件已设置且正确(已检查)
  • 带有 REVERSE_CLIENT_ID 的 URL 类型正确
  • 我已经检查并仔细检查了 Apple 的所有证书,并且 .p8 密钥现在已经重新生成了大约 4 次,只是为了确保我在生成它或其他东西时不会遇到某种停电(!)
  • Firebase 控制台上的“身份验证”设置为“使用 Google 登录”、“使用电话号码登录”和“使用电子邮件地址和密码登录” - 所有这些均已启用。
  • 捆绑包名称都是正确的,Firebase 应用程序的名称在所有引用的地方都是正确的
  • 我已将 Google Cloud Platform 中的“iOS 自动生成密钥”切换为锁定到 iOS 应用程序
  • 我是付费苹果开发者
  • 正确的配置文件已设置
  • GoogleService-Info.plist 位于正确的位置,并且所有内容都是正确的
  • “签名和功能”部分中的后台模式设置为“后台获取”和“远程通知”

这是我花了几个小时在 StackOverflow 上搜索、阅读并重新阅读 Google 的文档,以及尽我所能想到的一切来让它发挥作用的结果……

...但所有相同的代码(完全)在 Android 上都能完美运行。

帮助!我快失去活下去的勇气了!

ios flutter firebase firebase-authentication
1个回答
0
投票

经过一周的寻找终于找到了解决方案:

  1. 找到文件

    firebase_sdk_version.rb
    并将版本修改为
    11.2.0

    文件位置的图像

  2. 运行:

    pod update FirebaseAuth Firebase

  3. 然后:

    pod install

之后,运行您的应用程序,一切都应该正常!

© www.soinside.com 2019 - 2024. All rights reserved.