Google Play Games C ++, похоже, не возвращает правильные данные о моих друзьях.
Основная идея здесь заключается в том, что в нашей игре есть страница, на которой показан список друзей. Кроме того, когда вы играете в игру, на экране будет отображаться индикатор, когда вы приближаетесь и когда вы передаете лучшие результаты своих друзей.
Игра написана на Cocos2d-x, и в результате мы используем библиотеку Google Play Games C ++. GPG успешно проходит проверку подлинности, а другие функции (например, разблокировка достижений и фактическая отправка баллов) работают правильно. Кроме того, если кто-то из Google читает, на сайте есть Примечания к выпуску для версии 2.2, но на странице загрузок есть только 2.1, так что это то, что мы используем.
В любом случае, у нас есть два устройства с разными учетными записями Google Play, которые являются друзьями. У нас есть возможность открыть стандартный интерфейс игровых таблиц игровых сервисов по умолчанию, и если я перейду к социальной таблице лидеров, то оба устройства увидят высокий балл другого игрока на этой странице — так что, похоже, мы успешно подружились с двумя учетными записями.
К сожалению, я не могу получить эти данные о друзьях программно с помощью API C ++.
Вот соответствующий код.
void GameCenterSession::fetchFriends()
{
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Fetching friends!");
//GET INVITABLE FRIENDS
game_services_->Players().FetchInvitable(gpg::DataSource::CACHE_OR_NETWORK, [] (gpg::PlayerManager::FetchListResponse response) {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got invitable friends response: %d", response.status);
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got invitable players info! Num players: %d", response.data.size());
if (gpg::IsSuccess(response.status)) {
//PROCESS PLAYERS
GameCenterSession::getInstance()->onPlayersInfoReceived(kRequestFriendsInfo, response.data);
}
});
//GET CONNECTED FRIENDS
game_services_->Players().FetchConnected(gpg::DataSource::CACHE_OR_NETWORK, [] (gpg::PlayerManager::FetchListResponse response) {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got connected friends response: %d", response.status);
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got connected players info! Num players: %d", response.data.size());
});
}
void GameCenterSession::onPlayersInfoReceived(const int requestId, std::vector<gpg::Player> playersInfo) {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "onPlayersInfoReceived num players: %d", playersInfo.size());
const gpg::ScorePage::ScorePageToken distanceToken = game_services_->Leaderboards().ScorePageToken(
kLeaderboardBestDistance,
gpg::LeaderboardStart::TOP_SCORES,
gpg::LeaderboardTimeSpan::ALL_TIME,
gpg::LeaderboardCollection::SOCIAL
);
//FETCH ALL TIME SOCIAL SCORES FOR DISTANCE
game_services_->Leaderboards().FetchScorePage(gpg::DataSource::CACHE_OR_NETWORK, distanceToken, 1000, [] (gpg::LeaderboardManager::FetchScorePageResponse response) {
if (gpg::IsSuccess(response.status) && response.data.Valid()) {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got social leaderboard! Num players: %d", response.data.Entries().size());
gpg::ScorePage::Entry myEntry = gpg::ScorePage::Entry();
//search through and find my score!
for (auto score : response.data.Entries()) {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "%s got distance %d", score.PlayerId().c_str(), score.Score().Value());if (score.PlayerId().compare(GameCenterSession::getInstance()->myPlayer.Id()) == 0) {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Distance - Yup that's me");
myEntry = score;
} else {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Distance - It's another player!");
}
}
GameCenterSession::getInstance()->onScoresReceived(kRequestFriendsDistancesInfo, myEntry, response.data.Entries());
}
});const gpg::ScorePage::ScorePageToken scoreToken = game_services_->Leaderboards().ScorePageToken(
kLeaderboardBestScore,
gpg::LeaderboardStart::TOP_SCORES,
gpg::LeaderboardTimeSpan::ALL_TIME,
gpg::LeaderboardCollection::SOCIAL
);
game_services_->Leaderboards().FetchScorePage(gpg::DataSource::CACHE_OR_NETWORK, scoreToken, 1000, [] (gpg::LeaderboardManager::FetchScorePageResponse response) {
if (gpg::IsSuccess(response.status) && response.data.Valid()) {
gpg::ScorePage::Entry myEntry = gpg::ScorePage::Entry();
//search through and find my score!
for (auto score : response.data.Entries()) {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "%s got score %d", score.PlayerId().c_str(), score.Score().Value());if (score.PlayerId().compare(GameCenterSession::getInstance()->myPlayer.Id()) == 0) {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Score - Yup that's me");
myEntry = score;
} else {
__android_log_print(ANDROID_LOG_INFO, "MyGame!", "Score - It's another player!");
}
}
GameCenterSession::getInstance()->onScoresReceived(kRequestFriendsScoresInfo, myEntry, response.data.Entries());
}
});
if (requestId == kRequestFriendsInfo)
{
friends = playersInfo;
}
}
Посмотрев код, вы увидите, что я сначала выбираю список друзей и проверяю, сколько игроков в этом списке. Я пытаюсь получить доступ как к приглашенным друзьям (судя по документации, это то, что мне нужно), так и к друзьям (просто в качестве теста). Я продолжаю собирать два разных социальных списка лидеров на все времена — расстояние и счет, и я проверяю, сколько игроков в результате. Вот мой вывод журнала.
// Устройство 1
I/MyGame!( 1510): Google Play Games authenticated successfully!
I/MyGame!( 1510): Fetching friends!
I/MyGame!( 1510): Got invitable friends response: 1
I/MyGame!( 1510): Got invitable players info! Num players: 0
I/MyGame!( 1510): onPlayersInfoReceived num players: 0
I/MyGame!( 1510): Got connected friends response: 1
I/MyGame!( 1510): Got connected players info! Num players: 0
I/MyGame!( 1510): Got social leaderboard! Num players: 1
I/MyGame!( 1510): g1703186947466536XXXX got distance 310
I/MyGame!( 1510): Distance - Yup that's me
I/MyGame!( 1510): g1703186947466536XXXX got score 2510
I/MyGame!( 1510): Score - Yup that's me
// Устройство 2
01-23 17:11:27.227 17187 17234 I MyGame!: Google Play Games authenticated successfully!
01-23 17:11:27.250 17187 17234 I MyGame!: Fetching friends!
01-23 17:11:27.451 17187 17234 I MyGame!: Got invitable friends response: 1
01-23 17:11:27.451 17187 17234 I MyGame!: Got invitable players info! Num players: 0
01-23 17:11:27.451 17187 17234 I MyGame!: onPlayersInfoReceived num players: 0
01-23 17:11:27.581 17187 17234 I MyGame!: Got connected friends response: 1
01-23 17:11:27.581 17187 17234 I MyGame!: Got connected players info! Num players: 0
01-23 17:11:27.973 17187 17234 I MyGame!: Got social leaderboard! Num players: 1
01-23 17:11:27.973 17187 17234 I MyGame!: g0152008166550356XXXX got distance 712
01-23 17:11:27.973 17187 17234 I MyGame!: Distance - Yup that's me
01-23 17:11:28.444 17187 17234 I MyGame!: g0152008166550356XXXX got score 2142
01-23 17:11:28.444 17187 17234 I MyGame!: Score - Yup that's me
Как видите, все мои обратные вызовы возвращают успешные коды результатов. К сожалению, ни одно из устройств не возвращает друзей, а обратный вызов в социальной таблице лидеров содержит только игрока на устройстве, а не счет их друзей.
Я следил за документацией как мог, и я просмотрел код, не найдя ни одной проблемы, но если это просто проблема семантики, я был бы рад услышать о моих ошибках. Я что-то здесь не так делаю или есть проблема с самим C ++ API?
Заранее спасибо.
API ведет себя как ожидалось. От: https://android-developers.googleblog.com/2016/12/games-authentication-adopting-google.html
Google+ больше не интегрирован
Объявлено в прошлом году, Игры отделяются от Google+ во время этого перехода. В результате общедоступные API для подключения игроков через круги перестали работать, но стандартные пользовательские интерфейсы для многопользовательских приглашений и списков лидеров в социальных сетях продолжали работать. Начиная с февраля 2017 года, стандартные пользовательские интерфейсы также не будут отображать результаты социального графика, поскольку данные Google+ становятся недоступными. Это повлияет на многопользовательские игры, социальные таблицы лидеров и API подарков на Android. Эффект будет состоять в том, что эти API вернутся успешно, но с пустым списком игроков.
Других решений пока нет …