问题起因是这样,google有一个签名计划,叫Google Play App Signing,这个是在开发者上传包的时候就需要选择的,应该是强制升级,没注意,问题就是因为这个签名的协议,启用了之后,google会在你上传包的时候给你把包里的签名改掉。
因为是第一次接google的应用,所以没有在意,开发测试没问题就直接发布了,轻易发布应用是大忌,因为没有在正式环境下测试,这个值得铭记和检讨。
Facebook接入登陆时候会有一个密钥散列,这个散列是根据包的正式签名生成的,开发环境下,用的是自己的签名,搞好散列后填入fb后台,测试没问题,发布后,google改了签名,导致正式环境下的散列和后台的对不上,登陆失败。”… The key hash … does not match any store key hashes …”
通常密钥散列的获取方法是本地存有签名文件.keystore的情况下通过命令行获取的,可是google改了签名怎么办呢,首先我从网上copy了一段代码,如果侵权,请联系我删除,我不知道原作者是谁,所以就不引用其他博客了。
private void printKeyHash(){
// Add code to print out the key hash
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.zhanyouall.qianjunji.google",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
Log.d("KeyHash:", e.toString());
} catch (NoSuchAlgorithmException e) {
Log.d("KeyHash:", e.toString());
}
}
通过这个打印,用logcat查看,将打印出来的散列加到fb后台,登陆成功。
google登陆也会失败,因为,google创建服务时候,会在后台添加OAuth客户端Android,里面有一行参数,需要添加签名的sha-1值。
google的签名sha-1值在这个位置,
以上,是google应用发布时遇到的一个问题。
反思其实就是自己太过于轻视测试的流程了,不完整的流程导致发布后的应用遇到了问题,工作中不是所有人都会给你机会容许犯错。