Google Play游戏成就解锁正常但退出后无法保存问题求助
问题原因
- 代码逻辑问题:你当前调用
AchievementsClient.unlock()是异步网络请求,未添加回调监听无法确认是否成功上传到服务器;同时onPause生命周期里直接将mAchievementsClient置空,会中断还未完成的同步请求,游戏内的解锁弹窗只是SDK本地缓存的提示,实际数据未成功同步到Google Play服务器,退出再进就会丢失。 - 配置校验不通过:如果APK签名指纹、成就ID、测试账号权限任意一项和Google Play Console后台的配置不匹配,服务器会拒绝接收成就同步请求,仅保留本地临时显示。
- 调用时机错误:如果在Google账号还未完成登录、
mAchievementsClient还未初始化完成时就触发成就解锁,请求会被直接丢弃,不会同步到服务器。
修复方案
代码层面修改
- 为成就解锁请求添加结果监听,方便排查问题,同时增加未初始化时的重试逻辑:
// 新增全局变量存储待补发的成就ID队列 private Vector<String> pendingAchievements = new Vector<>(); public void achieve(String id) { if (mAchievementsClient != null) { mAchievementsClient.unlock(id) .addOnSuccessListener(unused -> Log.d(TAG, "成就同步成功:" + id)) .addOnFailureListener(e -> { Log.e(TAG, "成就同步失败:" + id, e); // 失败后加入待补发队列 pendingAchievements.add(id); }); } else { Log.w(TAG, "成就客户端未初始化,加入待补发队列:" + id); pendingAchievements.add(id); } } // 在登录成功的onConnected方法最后补发待同步的成就 private void onConnected(GoogleSignInAccount googleSignInAccount) { Log.d(TAG, "onConnected(): connected to Google APIs"); GamesClient gamesClient = Games.getGamesClient(this, googleSignInAccount); gamesClient.setViewForPopups(findViewById(android.R.id.content)); gamesClient.setGravityForPopups(Gravity.TOP | Gravity.CENTER_HORIZONTAL); mAchievementsClient = Games.getAchievementsClient(this, googleSignInAccount); // 新增:补发之前未同步的成就 while (!pendingAchievements.isEmpty()) { String aid = pendingAchievements.remove(0); achieve(aid); } }
- 删除
onPause方法中mAchievementsClient = null;这行代码,Google Play Games SDK会自动处理生命周期,手动置空会中断未完成的同步任务。
配置层面检查
- 核对代码中使用的成就ID与Google Play Console游戏服务后台配置的成就ID完全一致,无拼写错误。
- 核对当前安装APK的签名SHA1指纹,与Google Play Console游戏服务页面配置的指纹一致,调试阶段需要额外把本地调试签名的SHA1加入后台配置。
- 确认测试账号已经被添加到Google Play Console游戏服务的测试白名单中,未正式发布的游戏只有白名单账号可正常同步数据。
- 更新Google Play Games应用到最新版本,排除旧版本客户端同步异常的问题。
内容的提问来源于stack exchange,提问作者goob256
相关产品推荐
相关产品推荐

