默认情况下禁用SwiftUIswizzling,电话身份验证不起作用

我正在构建一个带有电话号码登录的屏幕。我一遍又一遍地检查,该项目是新创建的,但是,我收到了以下日志:

7.2.0 - [Firebase/Auth][I-AUT000015] UIApplicationDelegate 必须处理远程通知才能使电话号码身份验证工作。如果 app delegate swizzling 被禁用,UIApplicationDelegate 收到的远程通知需要转发到 FIRAuth 的 canHandleNotificaton: 方法。

我确实阅读了有关 swizzling 的文档,但我不知道为什么它似乎被禁用了,我没有禁用它。我已将 GoogleServices-Info.plist 添加到应用程序中,我在 firebase 面板中添加了应用程序 apn auth 密钥。

我在应用程序中的入口点如下所示:

@main
struct partidulverdeApp: App {
    
    init() {
        FirebaseApp.configure()
    }
    
    var body: some Scene {
        WindowGroup {
            MainView()
                .onOpenURL { url in
                    Auth.auth().canHandle(url.absoluteURL)
                }
        }
    }
}

我的 URL 类型属性有一个带有 RESERVED_CLIENT_ID 的条目

我对这个问题非常绝望。任何想法都受到高度赞赏。

编辑1:

我确实阅读了文档并尝试在禁用 swizzling 的情况下处理通知,但我遇到了同样的错误:

class AppDelegate: NSObject, UIApplicationDelegate {
    
    func application(_ application: UIApplication,
        didReceiveRemoteNotification notification: [AnyHashable : Any],
        fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
      if Auth.auth().canHandleNotification(notification) {
        completionHandler(.noData)
        return
      }
      
    }
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        print("Your code here")
        return true
    }
}

@main
struct partidulverdeApp: App {
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    init() {
        FirebaseApp.configure()
    }
    
    var body: some Scene {
        WindowGroup {
            MainView()
                .onOpenURL { url in
                    Auth.auth().canHandle(url.absoluteURL)
                }
        }
    }
}

回答

以下是如何使用新的 SwiftUI 2 生命周期实现电话号码身份验证:

  1. 创建 Firebase 项目并设置 PhoneNumber Auth

  2. 将您的 iOS 应用添加到 Firebase 项目,下载并添加GoogleService-Info.plist到您的项目

  3. 在 Xcode 中,选择应用程序目标并启用以下功能:

    • 推送通知
    • 后台模式 > 远程通知
  4. 在 Apple 开发者门户上创建并注册 APNS 身份验证密钥

  5. 将密钥上传到 Firebase(在Firebase 控制台中的项目设置 > 云消息传递下)

  6. 将 Firebase 项目的反向客户端 ID 添加到您应用的网址架构

  7. 在您的 中Info.plist,设置FirebaseAppDelegateProxyEnabledNO

  8. 执行AppDelegate如下:

class AppDelegate: NSObject, UIApplicationDelegate {
  func application(_ application: UIApplication,
                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    FirebaseApp.configure()
    print("SwiftUI_2_Lifecycle_PhoneNumber_AuthApp application is starting up. ApplicationDelegate didFinishLaunchingWithOptions.")
    return true
  }

  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("(#function)")
    Auth.auth().setAPNSToken(deviceToken, type: .sandbox)
  }
  
  func application(_ application: UIApplication, didReceiveRemoteNotification notification: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("(#function)")
    if Auth.auth().canHandleNotification(notification) {
      completionHandler(.noData)
      return
    }
  }
  
  func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
    print("(#function)")
    if Auth.auth().canHandle(url) {
      return true
    }
    return false
  }
}

@main
struct SwiftUI_2_Lifecycle_PhoneNumber_AuthApp: App {
  @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
  
  var body: some Scene {
    WindowGroup {
      ContentView()
        .onOpenURL { url in
          print("Received URL: (url)")
          Auth.auth().canHandle(url) // <- just for information purposes
        }
    }
  }
}

为了进一步阅读,我推荐我写的这两篇文章:

  • Firebase 和新的 SwiftUI 2 应用程序生命周期
  • SwiftUI 2 应用程序生命周期终极指南

以上是默认情况下禁用SwiftUIswizzling,电话身份验证不起作用的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>