У нас проблема с достижениями на Android. После разблокировки они снова блокируются через некоторое время. Затем после открытия приложения снова разблокируются те же достижения. Самое странное, что достижения, которые разблокируются снова и снова, различны для каждого пользователя / устройства.
Игра вышла очень давно, сейчас мы просто добавляем достижения. Мы не используем подписывание приложений в Google Play. Тем не менее, это никогда не было проблемой для Firebase и нескольких других сервисов. Одна, возможно, необычная вещь, которую мы имеем в нашей настройке, состоит в том, что у нас есть два приложения в Google Play (производственная и отладочная версия одного и того же приложения), и оба они связаны с одной и той же Игрой в игровых сервисах. Однако конечные пользователи никогда не используют оба приложения, так как приложение Debug даже не выпущено, и у них тоже есть такие же проблемы.
Кроме того, в приложении Play Games происходит нечто странное. Последний пример: после нажатия на заголовок появляется надпись «Достижения 10/28». Однако после открытия самого окна достижений появляется надпись «Достижения 12/28»!
Скриншот 1:
https://i.stack.imgur.com/Di917.jpg
После нажатия на «Достижения:
https://i.stack.imgur.com/CjBBK.jpg
Как вы видите, он идет с 10/28 по 12/28. В других случаях это выглядит как «0/28 снаружи, 13/28 после входа». Похоже, это те достижения, которые разблокируются снова и снова после повторного входа в приложение через некоторое время.
Мы используем Unity 2017.3.1p1
Код, который мы используем перед разблокировкой достижений, вызываемый после социальной аутентификации:
if (Social.localUser.authenticated)
{
Log("Player authenticated, loading achievements...");
Social.LoadAchievements(x =>
{
_achievements = x;
string count = x == null ? "null" : x.Length.ToString();
Log("Achievements loaded. Count: " + count);
RefreshAchievements();
});
}
else
{
Log("Player NOT authenticated, skipping achievements.");
}
Код, который мы используем для разблокировки достижения:
try
{
if (Social.localUser != null && Social.localUser.authenticated && _achievements != null)
{
var achievement = _achievements.FirstOrDefault(x => x.id == id);
if (achievement == null || achievement.completed)
{
return;
}
Social.ReportProgress(
id,
progress, success =>
{
LogDebug("Unlock achievement '" + name + "'; Success: " + success);
});
}
}
catch (Exception ex)
{
LogError("Exception while unlocking achievement", ex.ToString());
}
Я попытался обновить SDK Play Services. Я добавил приведенный выше код, чтобы как-то «инициализировать» достижения, загружая их в первую очередь. Я пытался не разблокировать достижение, которое уже разблокировано.
Некоторые игроки получают следующую ошибку:
*** [Play Games Plugin DLL] 11/07/18 19:18:54 +03:00 ERROR: Cannot refresh achievement CgkI_9Ps96kPEAIQCg: ERROR_INTERNAL
Однако это не всегда так, иногда одно и то же достижение повторно разблокируется снова и снова после нескольких открытий приложения без получения ошибки выше. Самое странное, что предупреждение выводится после успешной аутентификации игрока, что подтверждает следующий журнал, напечатанный несколькими строками выше: (код этого журнала виден в предыдущих примерах кода)
[22.4727811] [ACHIEVEMENTS] Player authenticated, loading achievements...