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里可以直接确认:
- 右键你的Xamarin Android项目 → 选择「选项」
- 找到「Android签名」选项卡
- 切换到「调试」标签,就能看到当前使用的密钥库完整路径,以及是否启用了默认调试密钥库
问题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
相关产品推荐
相关产品推荐

