如何将相同的 SHA1 用于具有不同包名称的应用程序,作为另一个应用程序?

Posted

技术标签:

【中文标题】如何将相同的 SHA1 用于具有不同包名称的应用程序,作为另一个应用程序?【英文标题】:How can I use the same SHA1 for an app that has different package-name, as another one? 【发布时间】:2021-03-31 01:12:07 【问题描述】:

背景

我使用公共共享代码开发 2 个不同的应用程序,它们都用于同一个项目(在 gradle 文件中使用 productFlavors),但具有不同的包名称。

问题

这些应用应该能够登录到 Google 帐户并从中获取一些信息。

第一个工作正常,但第二个在登录时出现问题,尤其是在 release-variant 上。

两者都已在 Play 商店中发布并使用 Firebase,因此我无法执行可能会损坏应用程序运行方式的操作。

我发现了什么

我让应用写入日志以显示问题:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
        if (result?.isSuccess == true) 
          ...
        
        else 
          Log.e("AppLog", "onActivityResult failure:$result?.status")
        

这确实是我得到的:

onActivityResult failure:StatusstatusCode=DEVELOPER_ERROR, resolution=null

在 Internet 和 *** 上搜索,它表明我需要将 SHA-1 添加到项目中,包括发布和调试:

https://console.firebase.google.com/u/0/project/.../settings/general/...

添加 debug-variant 的 SHA-1 工作正常(尽管在登录期间由于某种原因它有多个步骤,而不是一两个步骤),但是当我尝试添加 release-variant 的 SHA-1 时,似乎与其他应用程序的 SHA-1 相同(具有不同的包)。它向我显示了这条消息(通过“项目设置”->“常规”):

此包名称和 SHA-1 已存在 OAuth2 客户端 另一个项目。您现在可以省略 SHA-1 和 read more about this situation and how to resolve it。

所以我点击了链接,并尝试按照那里写的那样做:

首先,找到您现有项目的 OAuth 2.0 客户端 ID。为此:

    转到Credentials page of the Google Cloud console。如果项目 包含 OAuth 2.0 客户端 ID 不会自动打开,请选择 从页面右上角的下拉菜单中选择它。 在 OAuth 2.0 客户端 ID 部分下,找到客户端名称 包含您用于 Firebase 的 SHA-1 和包名称 项目。如果您不确定哪个是正确的,请单击 客户查看详细信息。 找到正确的客户名称后,复制“客户 ID”列中的完整值。

接下来,将此客户端 ID 列入白名单,供 Google 作为登录提供商。为此:

    转到Firebase console 并选择您的项目。 从左侧菜单中选择身份验证。 选择登录方法选项卡。 在登录方法页面上,单击登录提供商卡片中的 Google。 扩展来自外部项目的白名单客户端 ID 选项。 将您的客户端 ID 从云控制台粘贴到文本字段中,然后点击添加。

所以我将它们(从“https://console.developers.google.com/apis/credentials?project=...”粘贴到“https://console.firebase.google.com/u/ 0/project/.../authentication/providers" ) 我认为应该在那里,但由于它不起作用,我粘贴了更多,包括两个应用程序。

还是不行。

我也尝试添加 SHA-256,尽管它允许我这样做,但也无济于事。

我试图在 *** 和其他地方搜索解决方案,但这些问题似乎与我所拥有的确切场景无关,因为这里已经有 2 个不同的包名称(所以应该没有问题),并且应用程序已经发布(所以我无法从网站上删除内容)。

问题

最重要的问题是第一个问题。其余的都是可选的,只有这样我才能知道什么是错的和发生了什么。我非常感谢它了解下一次如何正确处理它:

    我怎样才能为第二个应用解决它,而不会对任何一个应用造成任何问题?我不想在任何这些应用的网站上删除帐户/项目。

    为什么我不能为不同包名的应用添加 SHA-1?

    它说要复制说明上的“客户端ID”,但没有说明是哪个应用程序。我猜这意味着该应用程序运行良好,对吧?

    一些解决方案说我可以重新创建 SHA-1 以获得新密钥,但我找不到如何操作。我该怎么做呢?这有帮助吗?它不会影响正常运行的应用程序,并且我将再次遇到相同的 SHA-1 被用于两者的相同问题吗?

【问题讨论】:

你使用了释放 SHA1 密钥吗? @MahmoudOmara 不确定您的问题是什么。 SHA-1 不能添加到有问题的应用程序中,如果这是您所要求的。网站不让我。它显示了错误。 当您打开应用程序的 Firebase 设置时,您会在屏幕底部看到“添加指纹”,您需要为每个应用程序添加调试和释放 SHA1 密钥,因为您有 2 个不同的包名称,您应该在该 firebase 项目上有 2 个应用程序 必须从每个应用程序的发布密钥库中获取发布 sha1,有些人对项目中的所有风格使用相同的密钥,我认为这是您自己的情况 正是我的意思,这两个应用程序都有不同的包名称,这是真的,但是你为它们使用了 1 个密钥库,并且 SHA1 与密钥库而不是包名称相关,这意味着这个 1 SHA1 将适用于这两个应用程序 【参考方案1】:

尝试将 SHA-1 密钥添加到您在将应用上传到 Google Play 控制台时获得的 Firebase。您可以在 Play 管理中心导航到应用签名信息时获取此密钥。

【讨论】:

遗憾的是我已经尝试过了。我添加了所有可能的 SHA-1。由于某种原因,它仅对调试版本有帮助,而对发布版本没有帮助【参考方案2】:

现在可能更喜欢添加 SHA-256 而不是 SHA-1 密钥指纹。

Play App Signing“可能”解决了不添加重复发布密钥的问题,无论上传密钥如何。仔细检查文档,如果不是,注册会通过更改密钥来搞乱发布;到目前为止,我还没有尝试将已发布的应用迁移到 Play App Signing,但如果这不会破坏任何东西,这可能是摆脱这种情况的合适方法。

另一种选择是单击“添加应用程序”,然后添加另一个包名称(以防两种口味都使用同一个 Firebase 项目)。我已经为调试/发布版本配置了这个,它们也有不同的包名称(它们是如何构建的并不重要)。

如果你不得不乱来,再发布一个版本,它具有“维护模式”的特点,可以通过 Firebase 远程配置打开/关闭,以防止数据更改。

【讨论】:

遗憾的是,我已经尝试过 SHA-256(如我所写)。我现在又试了。仍然没有帮助。你有这样的问题吗? 我认为您面临的问题仅在尝试向不同的 Firebase 项目添加相同的密钥时出现,而不是在向同一 Firebase 项目中的不同应用程序添加相同的密钥时出现。即使不想,您也可能不得不重组,然后为其中一个包名称稍有不同的新版本制作......就将它们合并到一个项目中而言。注册 Play App Signing 可能是更改发布密钥的唯一选项,但我不确定。一般来说,Firebase 控制台和 Play 控制台需要同步。 向 Firebase 支持提交工单可能是获得特定答案的一种选择。这可能比尝试并可能弄乱其中一个应用程序要好得多。您最终也可以从风味转移到 DFM,这样单个应用就可以提供。 “我怎么不能添加不同包名称的应用程序的 SHA-1”仍然可以使用“添加应用程序”......但只有在它尚未添加到不同的应用程序时火力基地项目。如果你想重组,你就必须重组——有时必须向系统提交,不管喜欢与否。 这两个应用程序在同一个项目中,因为它们之间的一些代码非常相似。我如何就这个问题联系 Firebase/Google?【参考方案3】:

SHA-1 属于您用于签署 APK 的证书,不属于任何单个应用。

问题似乎是您有多个项目添加了相同的 Package+SHA。检查https://console.firebase.google.com/ 在这里,您将能够看到您帐户下的所有项目。

【讨论】:

不是同一个包名。正如我所写,它们是同一个项目中的 2 个不同的应用程序。【参考方案4】:

这有点晚了...我想这已经为您解决了,但对于其他可能需要解决方案的人...

您上面描述的所有步骤都是正确的。 你错过了最后一步。 获取您从 google 控制台复制的 Oauth 客户端 ID(并在 Firebase 登录中列入白名单)并将其添加到您从 Firebase 下载的 google-services.json 文件中。 最后一步很重要!! 在json文件中,找到oauth部分...

“oauth_client”:[ "client_id": "在此处粘贴 Oauth 客户端 ID", “客户类型”:3 ],

重建应用程序。

【讨论】:

已经试过了。下次我检查这个问题时会再试一次。

以上是关于如何将相同的 SHA1 用于具有不同包名称的应用程序,作为另一个应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

我可以提交具有相同 Icon.png 但不同包名称的 iPhone 应用程序吗

Google App Invites:具有不同包名称/捆绑 ID 的 iOS 应用和 Android 应用 - 它们如何与 goo.gl/App Invites 关联?

如何在不重构的情况下发布两个具有相同源代码但不同包名的 android 应用程序

Delphi,如何在两个不同的包中安装具有相同名称的组件

Google 如何在 API 调用中验证 SHA1 和包名称?

如何组合具有相同名称的 JSON 对象?