iOS 上的 Firebase 身份验证失败(Unity、Xcode)

Posted

技术标签:

【中文标题】iOS 上的 Firebase 身份验证失败(Unity、Xcode)【英文标题】:Firebase Auth failed on iOS (Unity, Xcode) 【发布时间】:2020-05-22 05:55:52 【问题描述】:

我正在尝试让 Firebase Unity SDK 在 ios 13 设备上运行。我能够构建项目,但问题是我无法注册或验证用户。

复制步骤:(我做了什么)

    已下载 quickstart-unity/auth/testapp 项目 在 iOS 平台的 Unity 2019.2.20f1 中打开 将 Bundle ID 更改为我在 Firebase 控制台中注册的那个 将 GoogleService-Info.plist 放在 Assets/Firebase 文件夹下 Set Resolver iOS 设置选项将 CocoaPods 添加到 Xcode 项目 将最新的 Firebase Auth 包 6.10.0 从 dotnet4 文件夹导入到项目中 已构建

我在 Xcode 项目中看到的:

    PodFile 内容如下所示:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'

target 'Unity-iPhone' do
  pod 'Firebase/Auth', '6.14.0'
  pod 'Firebase/Core', '6.14.0'
end
    GoogleService-Info.plist 也在 Xcode 项目层次结构中

在装有 iOS 13 的 iPhone 8 上签名并构建。

结果:当我尝试填写字段电子邮件和密码并按下调用该方法的“创建用户”按钮时:

// Create a user with the email and password.
    public Task CreateUserWithEmailAsync() 
      DebugLog(String.Format("Attempting to create user 0...", email));
      DisableUI();

      // This passes the current displayName through to HandleCreateUserAsync
      // so that it can be passed to UpdateUserProfile().  displayName will be
      // reset by AuthStateChanged() when the new user is created and signed in.
      string newDisplayName = displayName;
      return auth.CreateUserWithEmailAndPasswordAsync(email, password)
        .ContinueWithOnMainThread((task) => 
          EnableUI();
          if (LogTaskCompletion(task, "User Creation")) 
            var user = task.Result;
            DisplayDetailedUserInfo(user, 1);
            return UpdateUserProfileAsync(newDisplayName: newDisplayName);
          
          return task;
        ).Unwrap();
    

我在设备屏幕和 Xcode 日志中也看到了这个错误:

AuthError.Failure: Firebase.FirebaseException: An internal error has occurred, print and inspect the error details for more information.

这是来自 Xcode 的完整日志:

https://drive.google.com/file/d/1ZQzrA67NXqM-lwNsSqT8Dgam9XiSHD9y/view?usp=sharing

我也尝试过:

    在 iOS 版本较低的设备上构建。 尝试使用 Unity 2019.1.11 和 2019.1.13 版本构建 尝试将 GoogleService-Info.plist 直接导入 Xcode 项目 已试用 Firebase SDK 6.8.0 版本 尝试手动添加 [FIRApp 配置] 没有任何效果。

为项目配置的 Firebase 控制台,包含两个具有不同 Bundle ID 的应用 android 和 iOS。安卓版经过多次测试完美运行。

Unity 编辑器版本:2019.2.20f1

Firebase Unity SDK 版本:6.10.0

正在使用的 Firebase 插件:身份验证

我们正在使用的其他 SDK(Facebook、AdMob 等):无

我们使用 Unity 编辑器的平台:Mac

我们的目标平台:iOS

脚本运行时:IL2CPP

Xcode 版本:11(最新) CocoaPods:最新版本

【问题讨论】:

【参考方案1】:

至少我能够解决问题。这是我如何修复它的描述。

正如我上面提到的,Unity 是这样导出 PodFile 的:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'

target 'Unity-iPhone' do
  pod 'Firebase/Auth', '6.14.0'
  pod 'Firebase/Core', '6.14.0'
end

这意味着 Firebase Unity SDK 6.10.0 需要 Pod 版本 6.14.0。 使用这个 pod 构建时,我看到了上面提到的错误:

[SA LOG] CreateUserWithEmailAndPasswordAsync encountered an error: System.AggregateException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> Firebase.FirebaseException: An internal error has occurred, print and inspect the error details for more information.
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
---> (Inner Exception #0) System.AggregateException: One or more errors occurred. ---> Firebase.FirebaseException: An internal error has occurred, print and inspect the error details for more information.
   --- End of inner exception stack trace ---
---> (Inner Exception #0) Firebase.FirebaseException: An internal error has occurred, print and inspect the error details for more information.<---
<---

正如你所见,这个错误什么也没说。

经过长时间的研究,我注意到在 CocoaPods 网站上有更新的 Firebase pod 版本可用,所以我手动更改了我的 PodsFile 并使用终端安装了 Pod:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'

target 'Unity-iPhone' do
  pod 'FirebaseAnalytics', '~> 6.2'
  pod 'FirebaseAuth', '~> 6.4'
  pod 'FirebaseCore', '~> 6.6'
end

在构建之后,我得到了人类可读的错误,上面写着:

Response body: 
  "error": 
    "code": 400,
    "message": "API key expired. Please renew the API key.",
    "status": "INVALID_ARGUMENT",
    "details": [
      
        "@type": "type.googleapis.com/google.rpc.Help",
        "links": [
          
            "description": "Google developer console API key",
            "url": "https://console.developers.google.com/project/37062923653/apiui/credential"
          
        ]
      
    ]
  

我按照错误提示在 Google Developer Console 中更新了 API 密钥,现在一切正常。

结论:

这与 Firebase Unity SDK 6.10.0 和 6.8.0 无关,也与 Parse DLL 无关。只是问题是 Firebase Pods 的旧版本 6.14.0 没有给出人类可读的错误,所以我无法理解发生了什么。使用最新的 Firebase Pod 后,我能够理解错误原因。

感谢所有回复我问题的人。

【讨论】:

【参考方案2】:

您需要检查您的 Xcode Info.Plist 文件,那里需要添加用于 google 登录的密钥。 Link

还看到您的日志第 3 行需要删除一个键。

【讨论】:

感谢您的回复。在这个项目中,我只使用电子邮件和密码登录功能,我是否需要为 Google 登录添加密钥?还有我日志中的第 3 行,你是说这个吗?要禁用屏幕报告,请在 Info.plist 中将标志 FirebaseScreenReportingEnabled 设置为 NO(布尔值) 是的,您需要添加密钥,同时为 FirebaseScreenReportingEnabled 密钥设置 NO 链接已经存在 Unity 自动添加了它。在 Info.plist 中将标志 FirebaseScreenReportingEnabled 设置为 NO(布尔值)也无济于事。【参考方案3】:

我看到“CreateUserWithEmailAndPasswordAsync 遇到错误:System.AggregateException:发生内部错误。”在 Unity 控制台中。

为了解决这个问题,我关闭了 Unity,提交了我的重要更改,然后重新打开了 Unity。在出现的弹出窗口中,我单击了“启用”。

同时,我还进入了 Firebase 控制台 (https://console.firebase.google.com/project/myprojectname/authentication/providers) 中的项目设置并启用了邮件注册。视频教程中也建议这样做,但书面教程中没有。 Firebase Official Video Tutorial

之后,问题就解决了。

【讨论】:

以上是关于iOS 上的 Firebase 身份验证失败(Unity、Xcode)的主要内容,如果未能解决你的问题,请参考以下文章

通过移动数据的 Firebase 匿名身份验证失败

Firebase 电话身份验证失败

Firebase Android 身份验证失败:expired_token(身份验证令牌已过期)

Flutter:使用谷歌身份验证在 Firebase 存储中实施任何身份验证失败

Firebase-tools 升级后 Firebase-functions 身份验证失败

在android中通过firebase进行Facebook登录时身份验证失败