You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin调试模式下Facebook登录密钥哈希不匹配求助

先拿史蒂夫·乔布斯的一句玩笑开个头:

我感到难过,不是因为微软的成功——我对他们的成功没有意见。……我不满的是他们只会做三流产品。

好了,玩笑归玩笑,刚接手Xamarin项目就碰到Facebook登录的经典密钥哈希报错,这种踩坑的滋味太熟悉了!我来帮你拆解这些问题:

问题1:本地生成的哈希和设备显示不一致?怎么找对密钥库和密码?

  • 密钥库路径是核心坑点:Xamarin for Android的调试密钥库和Android Studio用的不是同一个!默认的调试密钥库路径是~/.local/share/Xamarin/Mono for Android/debug.keystore,而不是大家熟悉的~/.android/debug.keystore,这点你已经找对方向了。
  • 默认密码别瞎猜:这个Xamarin专属调试密钥库的默认密码是固定的android,很多人会下意识用自己设的密码或者Android Studio的密码,自然生成的哈希就对不上设备显示的那个。
  • 查看当前项目用的密钥库:在Visual Studio for Mac里可以直接确认:
    1. 右键你的Xamarin Android项目 → 选择「选项」
    2. 找到「Android签名」选项卡
    3. 切换到「调试」标签,就能看到当前使用的密钥库完整路径,以及是否启用了默认调试密钥库

问题2:Xamarin里怎么用PackageManager类生成密钥哈希?

完全可以实现,只是Xamarin把原生Android的API做了封装,写法稍有不同。你可以在Activity里加入这段代码,运行后查看日志就能拿到准确的密钥哈希:

using Android.Content.PM;
using Android.Util;
using Java.Security;
using System;

public void PrintKeyHash()
{
    try
    {
        PackageInfo packageInfo = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.Signatures);
        foreach (Signature signature in packageInfo.Signatures)
        {
            MessageDigest md = MessageDigest.GetInstance("SHA");
            md.Update(signature.ToByteArray());
            Log.Debug("FacebookKeyHash", Convert.ToBase64String(md.Digest()));
        }
    }
    catch (PackageManager.NameNotFoundException ex)
    {
        Log.Error("FacebookKeyHash", ex.Message);
    }
    catch (NoSuchAlgorithmException ex)
    {
        Log.Error("FacebookKeyHash", ex.Message);
    }
}

这里要注意,Xamarin里用PackageInfoFlags.Signatures对应原生Android的PackageManager.GET_SIGNATURES,是封装好的枚举值,直接用就行。

补充:你找到的正确解法

你提到最后用~/.local/share/Xamarin/Mono for Android/debug.keystore加上默认密码android生成哈希,添加到Facebook开发者后台后解决了问题,这确实是调试环境下最直接有效的解决方案!

内容的提问来源于stack exchange,提问作者Thiago Loddi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:28