firebase flutter:如果禁用了应用程序委托混合,则UIApplicationDelegate接收的远程通知需要转发到FIRAuth的

vm0i2vca  于 2022-12-30  发布在  Flutter
关注(0)|答案(3)|浏览(87)

当我想使用带有firebase的sms auth时,应用程序仅在iOS上失败
APN证书已在firebase上配置,并且Info.plist中的FirebaseAppDelegateProxyEnabled为NO。执行verifyPhoneNumber方法期间发生错误。
这是flutter doctor

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel unknown, v1.7.0, on Mac OS X 10.14.5 18F132, locale en-PE)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 10.2.1)
[✓] iOS tools - develop for iOS devices
[✓] Android Studio (version 3.4)
[!] IntelliJ IDEA Ultimate Edition (version 2019.1)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.36.1)
[✓] Connected device (1 available)

下面是我的代码

void sendSms(String fullNumber) {
    FirebaseAuth.instance.verifyPhoneNumber(
      phoneNumber: fullNumber,
      timeout: Duration(minutes: 1),
      verificationCompleted: (AuthCredential phoneAuthCredential) async {
        _smsController?.add('loading');
        FirebaseUser firebaseUser = await FirebaseAuth.instance
            .signInWithCredential(phoneAuthCredential);
        _verifyUser(firebaseUser);
      },
      verificationFailed: (err) {
        print(err.message);
        print(err.code);
        _smsController?.add('UNKNOWN_ERROR');
      },
      codeSent: (verificationId, [forceResendingToken]) {
        _verificationId = verificationId;
        _smsController?.add('code_sent');
      },
      codeAutoRetrievalTimeout: (verificationId) {},
    );
  }

错误消息:
flutter: If app delegate swizzling is disabled, remote notifications received by UIApplicationDelegate need to be forwarded to FIRAuth's canHandleNotificaton: method.
flutter: verifyPhoneNumberError

t98cgbkg

t98cgbkg1#

最佳可用解决方案AppDelegate.swift:

import UIKit
import Flutter
import FirebaseAuth
import FirebaseMessaging

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [. 
UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().delegate = self
    }

    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: 
launchOptions)
}

// https://firebase.google.com/docs/auth/ios/phone-auth#appendix:-using-phone-sign-in-without-swizzling
// https://firebase.google.com/docs/cloud-messaging/ios/client#token-swizzle-disabled
override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Pass device token to auth
    Auth.auth().setAPNSToken(deviceToken, type: .unknown)

    // Pass device token to messaging
    Messaging.messaging().apnsToken = deviceToken

    return super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}

// https://firebase.google.com/docs/auth/ios/phone-auth#appendix:-using-phone-sign-in-without-swizzling
// https://firebase.google.com/docs/cloud-messaging/ios/receive#handle-swizzle
override func application(_ application: UIApplication,
                          didReceiveRemoteNotification notification: [AnyHashable : Any],
                          fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    // Handle the message for firebase auth phone verification
    if Auth.auth().canHandleNotification(notification) {
        completionHandler(.noData)
        return
    }

    // Handle it for firebase messaging analytics
    if ((notification["gcm.message_id"]) != nil) {
        Messaging.messaging().appDidReceiveMessage(notification)
    }

    return super.application(application, didReceiveRemoteNotification: notification, fetchCompletionHandler: completionHandler)
}

// https://firebase.google.com/docs/auth/ios/phone-auth#appendix:-using-phone-sign-in-without-swizzling
override func application(_ application: UIApplication, open url: URL,
                          options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
    // Handle auth reCAPTCHA when silent push notifications aren't available
    if Auth.auth().canHandle(url) {
        return true
    }

    return super.application(application, open: url, options: options)
   }
}
t40tm48m

t40tm48m2#

    • 解决方案:**

我发现这在flutter仓库和目前的作品。
将当前的firebase_auth版本替换为

firebase_auth:
    git:
      url: https://github.com/collinjackson/plugins.git
      ref: 441417c2fed0ff26bf84a49ab2c5ffd2aa5487de
      path: packages/firebase_auth
6yoyoihd

6yoyoihd3#

由于我在flutter项目中使用firebase消息传递和电话身份验证,我也面临着同样的问题,FCM通知支持图像。在ImageNotification项目中

// NotificationService.h

#import <UIKit/UIKit.h>

还有

// NotificationService.m
    
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related; it should be handled separately.
    return NO;
}

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.URL];
    // URL not auth related; it should be handled separately.
  }
}

这对我很有效谢谢。

相关问题