Firebase google 登录身份验证 AppDelegate-使用未解析的标识符“isMFAEnabled”

2023-12-25

我是 iOS 开发新手。我正在尝试将谷歌登录添加到我的应用程序中,但我遇到了一些问题。代码显示一些“使用未解析的标识符'isMFAEnabled”和“类型'AppDelegate'的值没有成员'showTextInputPrompt'”。请帮助我。我正在关注这个文档-https://firebase.google.com/docs/auth/ios/google-signin#swift_9 https://firebase.google.com/docs/auth/ios/google-signin#swift_9 在此输入图像描述 https://i.stack.imgur.com/fvru7.png

import UIKit
import Firebase
import GoogleSignIn

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,GIDSignInDelegate {
   
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
        GIDSignIn.sharedInstance().delegate = self
        return true
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return GIDSignIn.sharedInstance().handle(url)
    }
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
           if let error = error {
            print(error.localizedDescription)
             return
           }

           guard let authentication = user.authentication else { return }
           let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                             accessToken: authentication.accessToken)
          Auth.auth().signIn(with: credential) { (authResult, error) in
            if let error = error {
              let authError = error as NSError
              if (isMFAEnabled && authError.code == AuthErrorCode.secondFactorRequired.rawValue) {
                // The user is a multi-factor user. Second factor challenge is required.
                let resolver = authError.userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
                var displayNameString = ""
                for tmpFactorInfo in (resolver.hints) {
                  displayNameString += tmpFactorInfo.displayName ?? ""
                  displayNameString += " "
                }
                self.showTextInputPrompt(withMessage: "Select factor to sign in\n\(displayNameString)", completionBlock: { userPressedOK, displayName in
                  var selectedHint: PhoneMultiFactorInfo?
                  for tmpFactorInfo in resolver.hints {
                    if (displayName == tmpFactorInfo.displayName) {
                      selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                    }
                  }
                  PhoneAuthProvider.provider().verifyPhoneNumber(with: selectedHint!, uiDelegate: nil, multiFactorSession: resolver.session) { verificationID, error in
                    if error != nil {
                      print("Multi factor start sign in failed. Error: \(error.debugDescription)")
                    } else {
                      self.showTextInputPrompt(withMessage: "Verification code for \(selectedHint?.displayName ?? "")", completionBlock: { userPressedOK, verificationCode in
                        let credential: PhoneAuthCredential? = PhoneAuthProvider.provider().credential(withVerificationID: verificationID!, verificationCode: verificationCode!)
                        let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator.assertion(with: credential!)
                        resolver.resolveSignIn(with: assertion!) { authResult, error in
                          if error != nil {
                            print("Multi factor finanlize sign in failed. Error: \(error.debugDescription)")
                          } else {
                            self.navigationController?.popViewController(animated: true)
                          }
                        }
                      })
                    }
                  }
                })
              } else {
                print(error.localizedDescription)
                return
              }
              // ...
              return
            }
            // User is signed in
            // ...
          }
       }
    
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
          let firebaseAuth = Auth.auth()
        do {
          try firebaseAuth.signOut()
        } catch let signOutError as NSError {
          print ("Error signing out: %@", signOutError)
        }

因此,样板代码比您需要的代码多得多。这是我对您的 AppDelegate 的评论。

  1. didFinishLaunchingWithOptions看起来不错。 专业提示:添加此行以保持登录状态GIDSignIn.sharedInstance()?.restorePreviousSignIn()

  2. 打开,选项看起来不错。

  3. didSignInFor用户这就是它纠结的地方。删除整个功能并将其替换为以下扩展(在类的括号之外):

(同时删除GIDSignInDelegate在类协议中)

    extension AppDelegate: GIDSignInDelegate {
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
        
        //handle sign-in errors
        if let error = error {
            if (error as NSError).code == GIDSignInErrorCode.hasNoAuthInKeychain.rawValue {
                print("The user has not signed in before or they have since signed out.")
            } else {
            print("error signing into Google \(error.localizedDescription)")
            }
        return
        }
        
        // Get credential object using Google ID token and Google access token
        guard let authentication = user.authentication else { return }
        
        let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                        accessToken: authentication.accessToken)
        
        // Authenticate with Firebase using the credential object
        Auth.auth().signIn(with: credential) { (authResult, error) in
            if let error = error {
                print("authentication error \(error.localizedDescription)")
            }
        }
    } 
}

我今天对此进行了测试,目前正在运行(Swift 5/ios 13.6)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase google 登录身份验证 AppDelegate-使用未解析的标识符“isMFAEnabled” 的相关文章

  • 使用 JavaScript 捕获 iPhone 虚拟键盘中的“完成”按钮点击

    我想知道是否有一种方法可以使用 JavaScript 捕获 iPhone 虚拟键盘的完成按钮事件 基本上 我只是希望能够在用户单击 完成 时调用 JS 函数 我无法跟踪单击的 完成 按钮 它没有注册任何clicks or keypresse
  • Cocos2D中如何让物体对触摸做出反应?

    好吧 我开始更多地了解 Coco2D 但我有点沮丧 我发现的很多教程都是针对过时版本的代码 因此当我浏览并了解它们如何执行某些操作时 我无法将其翻译成我自己的程序 因为很多都发生了变化 话虽如此 我正在使用最新版本的 Coco2d 版本 0
  • 在 MLMediaLibrary 中加载媒体源时出错

    我在加载时遇到错误mediaSourcesMac OS X 中的属性 我正在尝试使用以下方法获取 Apple Photos 源MLMediaLibrary class 我的应用程序是沙盒的 并且具有图片文件夹的只读权限 我收到错误 MLMe
  • 当 TestFlight/IAP 总是给出“无连接”错误时,如何接受“Apple 媒体服务条款和条件”?

    我正在通过 TestFlight 测试带有应用内购买的应用程序 最近 当我尝试测试购买应用内购买时 开始出现提示 Apple Media Services 条款和条件已更改 随后总是出现错误 无连接 互联网连接工作正常 如何解决这种情况并恢
  • CIGaussianBlur 有时会改变图像方向

    在我的 iOS 应用程序中 我想在 UIImage 上应用一个滤镜 CIGaussianBlur 当它获得具有大高度的图像时 它会旋转图像 CIContext context CIContext contextWithOptions nil
  • 应用程序终止和设备重启后 PushKit 通知未到达

    借助 PushKit 我的 iOS 应用程序即使已关闭也能成功接收 VoIP 推送通知 失败时只有一个条件 如果我通过标准任务切换器刷出 终止 我的应用程序并重新启动我的设备 起初 我在重新启动设备后就遇到了这个问题 如这个问题所述 排除启
  • 带有预填充 .sqlite 的核心数据 (Swift3)

    目前 我正在对现有 iOS9 应用程序进行 Swift3 iOS10 更新 该应用程序存储了欧洲各地约 10 000 个电动汽车充电点 到目前为止 我总是为应用程序提供预填充的数据库 xcappdata 包中的 sqlite sqlite
  • 在 iOS 上使用 MDCBottomNavigationBar 切换视图控制器

    我正在尝试创建一个使用 Material Design 库的底部导航功能的 iOS 应用程序 我可以获得带有底部导航栏的视图控制器来编译和显示 但我无法添加其他视图控制器并在单击不同选项卡时在它们之间切换 我将所有内容简化为两个文件 一个是
  • 两个滚动视图同时工作,一键触摸

    我正在其中开发应用程序 我必须一键同时处理两个滚动视图 这意味着如果我同时滚动一个滚动视图 另一个滚动视图必须随之滚动 如果这是可能的 那么如何才能做到呢 在包含两个滚动视图的视图控制器中实现 UIScrollViewDelegate 协议
  • 如何在 iOS 中将 URL 添加到 Safari 的阅读列表?

    在我的 UIWebView 中 我想添加一个选项来将当前页面添加到 Safari 的阅读列表中 我知道这个功能的存在 因为 GMail 在长按链接时提供了它 但我找不到任何有关要使用的 URL 方案的信息 可能重复 如何从 iOS 以编程方
  • UIKeyboardFrameBeginUserInfoKey 和 UIKeyboardFrameEndUserInfoKey

    在管理键盘中文档 http developer apple com iphone library documentation StringsTextFonts Conceptual TextAndWebiPhoneOS KeyboardMa
  • 应用内购买自定义价格

    我已经搜索了一段时间 但它可能太明显了 人们不会发布它 我想知道是否可以为产品设定动态价格 我有送货申请 价格可能会因距离而异 此外 它也可以是非整数价格 例如 2 43 美元 是否可以 另外 我无法在 iTunes Connect 上设定
  • 使用 AFNetworking 2.0 发布 JSON 数据

    我有一个 Web 脚本 它通过 HTTP POST 请求接受 JSON 字符串作为输入 我遇到过几个相同的 AFNetworking 1 x 示例 任何人都可以指出我或提供 AFNetworking 2 0 示例 以对使用格式化 JSON
  • 从 HealthKit 获取昨天的步数

    我正在构建一个供个人使用的应用程序 目前我正致力于如何从 healthkit 中准确获取昨天的步数 然后从那里将其放入变量中 我知道应该很容易 我有一个 HealthKitManager 类 它从视图内部调用该函数 然后将其附加到同一视图中
  • 如何比双击更快地识别单击?

    我有一个UITableView与我添加单击的行and双击手势 let doubleTap UITapGestureRecognizer target self action doubleTap doubleTap numberOfTapsR
  • 如何只允许从我的 iOS 应用程序访问我的 MySQL 数据库? (使用webapp作为数据库的网关)

    我的 iOS 应用程序需要连接到 mysql 服务器 为了实现这一目标 我想创建一个 Web 应用程序 充当客户端应用程序和服务器端数据库之间的中间人 我担心的是 有人可以简单地找出我的应用程序使用的 URL 并传递他们自己的 URL 参数
  • iOS 上有像 JUNG 这样的可视化框架吗?

    有没有类似的可视化框架JUNG http jung sourceforge net applet index html对于iOS 我想实现类似的东西this http prefuse org gallery graphview iOS 上最
  • CIImage内存未释放

    我正在尝试拍摄一系列图像 混合当时的 X 图像并生成新图像 这是我必须完成此任务的代码 static func blendImages blendFrames Int blendMode CIImage BlendMode imagePat
  • 无法在 Swift 的 Storyboard 中加载 UIViewController XIB 文件

    我读了使用 XCode 故事板实例化使用 XIB 进行设计的视图控制器 https stackoverflow com questions 9155719 using xcode storyboard to instantiate view
  • WebCore::UserGestureIndicator::processingUserGesture 中的 EXC_BAD_ACCESS (SIGSEGV)

    我有一个使用 UIWebView 和 HTML5 websockets 构建的 iOS 应用程序 该应用程序经历了看似随机的崩溃 它发生在用户与其交互时以及在用户和应用程序之间没有发生交互的寿命测试期间 崩溃日志都有以下内容 Excepti

随机推荐

  • 将 KinteticJS 绘图导出为 SVG?

    可以出口吗动能JS http www kineticjs com 反对 SVG 或者解决方法是将 Kinetic JS 画布转换为 SVG EDIT 最好的是使用fabricJS https github com kangax fabric
  • 使用 Swift 包管理器和 libevent 干净地处理 /usr/local/

    我的项目中有 2 个依赖项libevent and libressl 两者都安装在本地 分别位于 usr local include and usr local opt libressl include 我想要实现的是 SPM 自动理解并在
  • 密码键盘设备的 C# 线程和事件

    我是 C 新手 目前正在开发支持密码键盘的后端代码 基本上 我的代码 OpenDevice gt RequestPIN gt key in PIN on PIN PAD gt GetResultPIN gt ConsolePrintOutP
  • 如何使用标准 C 将罗马数字转换为 int,同时拒绝无效数字?

    正确意味着什么罗马数字 https en wikipedia org wiki Roman numerals may http www numericana com answer roman htm vary https projecteu
  • UIScrollview缩放并同时启用分页

    我可以在uiscrollview中同时实现imageview的分页和缩放吗 是的 你能行的 在每一页中主滚动视图 add a 子滚动视图含有图像视图 您需要做以下事情 Set 最大缩放比例 for 子滚动视图 subScrollView s
  • Django:在网站上显示txt文件的内容

    我的观点是这样的 py def read file request f open path text txt r file contents f read print file contents f close return render
  • 他们有什么方法可以在不使用 src 的情况下将内容放入 IFRAME 中吗?

    我创建了一个自定义 WYSIWYG 编辑器来编辑 XML 文件 我用过一个为了这 我已经解析了 XML 文件和变量中的所有内容 我怎样才能将此内容放入 我尝试了这段代码 但它不起作用 他们有任何 JavaScript 代码吗 提前致谢 没有
  • 如果输入文件未更改,如何使自定义任务避免重做工作?

    我有一个游戏的多项目设置 有一个非常具体的子项目 称为 资源 它只包含要打包到 jar 中的图像 声音和 texfiles 等文件 我有一个处理图像并打包它们的自定义任务 在 src main 内部 我使用一个文件夹 preprocess
  • 正则表达式从 URL 获取协议

    假设我有一个名为 URL 的变量 它的值是http www google com 我还可以通过 ftp 接收 URL 因此它是ftp ftp google com 我怎样才能拥有它 以便我在之前抓住一切 之后我将有一个 if else 条件
  • 在 QTreeWidget 中调用上下文菜单

    当用户单击 QTreeWidgetItem 中的对象时 我想弹出一个菜单 我想从 QWidget 捕获信号 contextMenuRequested 然后使用 itemAt 从视图中检索索引 但这看起来不太漂亮 有没有更简单的方法可以调用视
  • onMouseMove 获取鼠标位置[重复]

    这个问题在这里已经有答案了 在 Javascript 中 在 onMouseMove 的 Javascript 事件处理程序中 如何获取相对于页面顶部的 x y 坐标中的鼠标位置 如果你可以使用 jQuery 那么this http api
  • 如何创建 Helm Chart 以使用相同的 value.yaml 文件部署多个应用程序

    我正在尝试部署 一个 HTTPD 实例和一个使用相同内容的 couch 数据库实例values yaml file 是否有默认文档可以帮助我了解如何部署两个实例以及使用相同实例的服务values yaml file 有人拥有创建了多个部署和
  • Android 列表视图刷新

    在我的应用程序中 当用户单击 添加 菜单按钮时 会出现一个列表视图 其中填充了从文本文件加载的项目 所以现在用户可以向列表视图添加一项了 将其添加到数组后 新项目将写入文本文件 但不会进入列表视图 因为我想通过将文件读取到数组然后用它填充
  • 计算一周的计算机登录次数

    我可能在错误的地方问这个问题 也许我应该去操作系统论坛 但我仍然想知道这一点 我的工作使用的是 Windows 7 机器 我每天登录 做一些工作 然后注销 当我锁定 Windows L 我的笔记本电脑时 我会短暂休息一下 我必须考虑到本周末
  • 为什么 React Bootstrap Navbar 保持折叠状态?

    我遵循了 React Bootstrap 文档 尤其是这段代码来制作我的导航栏 gt https react bootstrap github io components navbar navbars mobile Friendly htt
  • 如何在android中以编程方式设置微调器的条目?

    我在 string xml 文件中创建了各种字符串数组 并且必须根据 Java 中的某些条件将不同的数组设置为微调器的条目 是否可能 或者数据库是这样做的唯一方法 提前致谢 您需要使用适配器并在 xml 文件中填充 tha 数组 在 xml
  • Web api 开放 oauth(DotNetOpenAuth) mvc 4

    mvc 4 互联网应用程序模板有一个令人惊叹的功能 可以轻松与 facebook twitter 和 google 集成 但web api模板中没有这样的功能 如何轻松集成DotNetOpenAuth使用网络 API 有教程吗 MVC 是一
  • 使用 python 从文本文件读取 - 第一行被遗漏

    我有一个名为 test 的文件 其内容为 a b c d e f g 我使用以下 python 代码逐行读取该文件并将其打印出来 with open test txt as x for line in x print x read 其结果是
  • 带有复选框的 Android 列表视图未按预期运行

    这是关于回收问题 我正在使用自定义适配器来填充列表视图 在自定义行中有一个图像视图 两个文本框和一个复选框 所有元素都已填充 但复选框未正确填充 在 的里面getView 我执行一个条件 如果条件为真 我将复选框设置为启用状态 这工作正常
  • Firebase google 登录身份验证 AppDelegate-使用未解析的标识符“isMFAEnabled”

    我是 iOS 开发新手 我正在尝试将谷歌登录添加到我的应用程序中 但我遇到了一些问题 代码显示一些 使用未解析的标识符 isMFAEnabled 和 类型 AppDelegate 的值没有成员 showTextInputPrompt 请帮助