Apple Game Center🔗

Apple Game Center - Игры на macOS, iOS, watchOS и tvOS могут использовать Game Center, социальную игровую сеть Apple. Game Center позволяет вашим пользователям отслеживать свои лучшие результаты в таблице лидеров, сравнивать их достижения, приглашать друзей сыграть в игру. Приложения могут включать любые или все из следующих функций, поддерживаемых Game Center:
- Рейтинги — сравнивает оценки с друзьями игрока и с другими игроками со всего мира
- Достижения — очки присуждаются игрокам в составе системы отслеживания достижений Game Center. Игроки могут зарабатывать очки, выполняя определённые внутриигровые задачи. Игроки не могут использовать раздел для чего-либо иного, кроме как оценить прогресс в играх. Он был разработан так, чтобы игроки могли общаться и конкурировать друг с другом.
MRGSAuthentication позволяет с легкостью внедрить данную социальную сеть в Ваше приложение.
Предварительная настройка🔗
Перед началом работы, Вам необходимо настроить сертификаты и ключи в своей учетной записи Apple Developer, чтобы активировать функционал Apple Game Center. Добавьте Apple Game Center для своего приложения на странице Certificates, Identifiers & Profiles в личном кабинете разработчика.
Также, в XCode проекте во вкладке 'Signing & Capabilities' необходимо добавить Apple Game Center, для этого:
В Unity
Добавьте код в Unity post build process:
public class PostBuildProcessSample
{
[PostProcessBuild]
public static void PostProcessBuild(BuildTarget target, string path)
{
if (target == BuildTarget.iOS)
{
#if UNITY_IOS
string projPath = PBXProject.GetPBXProjectPath(path);
PBXProject proj = new PBXProject();
proj.ReadFromString(File.ReadAllText(projPath));
#if UNITY_2019_3_OR_NEWER
string projectTarget = proj.GetUnityMainTargetGuid();
#else
string targetName = PBXProject.GetUnityTargetName();
string projectTarget = proj.TargetGuidByName(targetName);
#endif
//Adding capabilities
#if UNITY_2019_3_OR_NEWER
ProjectCapabilityManager projectManager = new ProjectCapabilityManager(projPath, "ios.entitlements", targetGuid: projectTarget);
#else
ProjectCapabilityManager projectManager = new ProjectCapabilityManager(projPath, "ios.entitlements", targetName);
#endif
projectManager.AddGameCenter();
projectManager.WriteToFile();
#endif
}
}
}
Или вручную включите его в уже сгенерированном проекте:

Затем нажмите "+" на кнопке "Capability", и выберите пункт "Apple Game Center".
В iOS
В проекте XCode:

Затем нажмите "+" на кнопке "Capability", и выберите пункт "Apple Game Center".
Добавление зависимостей🔗
Далее необходимо добавить в проект MRGS SDK:
Unity:
Добавление в проект (общая инструкция)
Шаг 1. Добавьте источники
Для того, чтобы добавить MRGS в проект через Unity Package Manager (доступно с Unity 2018+) просто добавьте в файл Packages/manifest.json раздел scopedRegistries, добавив в него следующую запись:
{
"dependencies": {
...
},
"scopedRegistries": [
{
"name": "MRGS",
"url": "https://mrgs-nexus.my.games/repository/mrgs-uninty-plugins/",
"scopes": [
"games.my.mrgs"
]
}
]
}
Альтернативно, можно нажать Edit -> Project Settings -> Package Manager -> '+' in scoped registry section, и заполнить поля в соответствии с данными выше.
Шаг 2. Добавьте зависимость
- Нажмите
Window -> Package Manager -> select 'Packages: MyRegistries' from dropdown list, выберите пакетMRGSAuthenticationиз списка, затем нажмите "Install" - Импортируйте модуль:
using MRGS;
- Загрузите последнюю версию библиотеки. Распакуйте архив.
- (Для интеграции unitypackage) В Unity нажмите
Assets -> Import Package -> Custom Package, и выберите пакетgames.my.mrgs.authentication.unitypackageиз скачанного архива. - (Для интеграции tgz) В Unity нажмите
Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакетgames.my.mrgs.authentication-<version>.tgzиз скачанного архива. - Импортируйте модуль:
using MRGS;
iOS:
Добавление в проект (общая инструкция)
Шаг 1. Добавьте зависимости
Через Package collection
- В Xcode выберите File > Add Packages
- Выберите «+» > "Add Swift Package Collection"
- Вставьте URL:
https://mrgs-nexus.my.games/repository/ios-sdks/MRGSPackageCollection.json - Выберите модуль MRGSAuthentication из "MRGS Package Collection".
- Или вы можете выбрать пакет «MRGS» из "MRGS Package Collection" (содержит все модули mrgs в качестве продуктов), а затем выбрать только продукт "MRGS/Authentication".
Отдельными пакетами
- В Xcode выберите File > Add Packages
- В строке поиска в правом верхнем углу вставьте URL:
https://mrgs-gitea.my.games/mrgs/mrgsauthentication-ios-sdk.git - Добавьте модуль в свой проект
- Или вы можете вставить URL
https://mrgs-gitea.my.games/mrgs/ios-sdks.git, чтобы подключить пакет "MRGS", который содержит все модули mrgs в качестве продуктов, а затем выбрать только продукт "MRGS/Authentication".
Шаг 2. Добавьте поддержку категорий ObjectiveC
- В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSAuthentication;или#import <MRGSAuthentication/MRGSAuthentication.h>
Шаг 1. Добавьте источники
В вашем podfile добавьте источники в начало файла:
source 'https://github.com/CocoaPods/Specs.git' # For main repo
source 'https://mrgs-gitea.my.games/mrgs/cocoapods-specs.git' # For MRGS repo
Шаг 2. Добавьте зависимости
В target добавьте последнюю версию MRGSAuthentication:
Чтобы добавить через subspecs:
Для добавления через отдельные модули:
Чтобы добавить все модули mrgs:
Шаг 3. Установите зависимости
- Выполните
pod install(илиpod install --repo-updateесли необходимо) - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSAuthentication;или#import <MRGSAuthentication/MRGSAuthentication.h>
Шаг 1. Добавьте зависимости
Добавьте зависимость в ваш Cartfile:
binary "https://mrgs-nexus.my.games/repository/ios-sdks/MRGSAuthentication/MRGSAuthentication.json" ~> 5.0.0
Шаг 2. Установите зависимости
- Выполните
carthage update --use-xcframeworks - Добавьте загруженные фреймворки в свой проект (убедитесь, что опция "do not embed" включена)
- В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSAuthentication;или#import <MRGSAuthentication/MRGSAuthentication.h>
- Загрузите последнюю версию библиотеки. Распакуйте архив.
-
Добавьте
MRGSAuthentication.xcframeworkиз скачанного архива в ваш проект (Перетащите библиотеки в раздел "Linked frameworks and Libraries") (для совместимости в архиве также находится MRGSAuthentication.framework - fat framework старого вида) -
В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGSAuthentication;или#import <MRGSAuthentication/MRGSAuthentication.h> - Также, вы можете добавить из архива файлы
MRGServiceKit.hиmodule.modulemapв свой проект, либо в настройках проекта укажите путь до них в разделеBuild Settings -> Header search paths. Теперь вместо импорта каждого из наших фреймворков по отдельности, вы можете импортировать только один заголовочный файл:@import MRGServiceKit;
Настройка достижений и рейтингов🔗
Для того, чтобы авторизация работала корректно, согласно данному посту Вам обязательно нужно добавить в личном кабинете вашего приложения хотя бы одно достижение и одну таблицу рейтингов. Они могут быть фиктивны, и нигде не показываться, но для корректной работы они необходимы. Про добавление лидерборда и достижений читайте на этой странице
Важная информация об идентификаторах пользователя🔗
Изначально, в Apple Game Center использовался единый идентификатор пользователя, не изменяющийся во всех играх. Начиная с iOS 12.4, Apple пометили поле playerId как deprecated, так как посчитали, что такой идентификатор противоречит их user-privecy концепции. Вместо этого идентификатора они добавили два новых - teamPlayerId и gamePlayerId.
teamPlayerId- идентификатор пользователя, уникальный внутри паблишера приложенийgamePlayerId- идентификатор пользователя, уникальный внутри конкретного приложения
То есть, если вы публикуете несколько игр под одним издателем, то teamPlayerId у одного и того же пользователя во всех этих играх будет одинаковым, а gamePlayerId разный в каждой из игр, но при этом если вдруг Ваша игра начинает публиковаться от другого издателя, то teamPlayerId изменится, а gamePlayerId останется неизменным. Кроме того, Apple говорит, что иногда этих полей может не быть, и как на это реагировать, они не уточняют. Мы вернем ошибку авторизации, если ни одного из всех трех идентификаторов не будет.
Мы не знаем, сколько еще будет работать старое свойство playerId, но за основу мы берем именно его (для возвращаемого объекта MRGSAuthenticationUser.userId), если его нет, то для идентификатора пользователя будет использовано поле teamPlayerId. Для того, чтобы вы могли подготовиться к переходу на новый идентификатор, в поле MRGSAuthenticationUser.optionalParams мы добавляем словарь с соответствующими полями - teamPlayerId и gamePlayerId, в которых хранятся новый идентификаторы (если они есть, иначе хранится пустая строка).
Подробнее смотрите в видеозаписи с сессии WWDC 2019
Автоматический вход при перезапуске🔗
Apple Game Center не сохраняет состояние логина при перезапуске приложения, то есть после перезапуска система будет считать, что пользователь не залогинен. При этом при повторном логине, сверху экрана будет показан бабл с приветствием пользователя, без ввода логина и пароля. Поэтому проекты обычно запоминают, что входил хотя бы один раз, и на повторном запуске автоматически вызывают метод логина.

Чтобы Вам было проще интегрировать Apple Game Center и не делать механизм автоматического входа на каждом запуске, мы добавили настройку автоматического входа, при которой мы сами совершим вышеописанные действия (Кроме того, метод выхода не предусмотрен в данной сети, поэтому при обычной настройке он ничего не делает, а при включенном автологине, метод выхода отключает автологин до следующего вызова метода логина).
Для того, чтобы включить автологин, при старте SDK MRGS необходимо добавить соответствующую настройку в параметрах внешних SDK:
using MRGS;
public class MasterController : MonoBehaviour
{
void Awake()
{
//Настройка параметров MRGS
// ...
var modulesParams = new List<MRGSExternalSDKSettings>
modulesParams.Add(new MRGSAppleGameCenterParams
{
AutomaticallyStartOnLaunch = true
});
//Настройка Внешних SDK и инициализация MRGS
// ...
MRGService.Instance.Initialize(serviceParams, sdkParams)
}
}
@import MRGService;
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Настройка параметров MRGS
// ...
//Настройка Внешних SDK
MRGSAppleGameCenterParams* appleGameCenterParams = [[MRGSAppleGameCenterParams alloc] init];
appleGameCenterParams.automaticallyStartOnLaunch = true;
NSArray *externalParams = @[ ..., appleGameCenterParams];
[MRGService startWithServiceParams:<params> externalSDKParams:externalParams delegate:nil];
}
Работа с MRGSAuthentication интерфейсом🔗
Для работы с Apple Game Center воспользуйтесь классом MRGSAuthenticationAppleGameCenter. Обращаем внимание, что данный класс реализует наш основной протокол MRGSAuthentication, то есть имеет все методы этого протокола. Далее описана стандартная реализация интерфейса MRGSAuthentication:
Делегат🔗
Перед началом работы с API, необходимо установить и реализовать делегат, принимающий обратные вызовы:
// Setting
// 'this' conforms to 'IMRGSAuthenticationDelegate' protocol
MRGSAuthenticationAppleGameCenter.Instance.Delegate = this;
// Implementation
// The method that is called when the user has logged out of the social network remotely, or his session has ended.
public void OnAuthenticationProviderDidLogoutUser(MRGSAuthentication provider, MRGSAuthenticationUser user){
Debug.Log("MRGSAuthentication<Unity> - OnAuthenticationProviderDidLogoutUser: " + user + "\nNetwork: " + provider.SocialId().ToString());
}
// Установка
[MRGSAuthenticationAppleGameCenter sharedInstance].delegate = self;
//Реализация
// Метод, который вызывается, когда пользователь удаленно вышел из социальной сети, или его сессия закончилась.
- (void)authenticationProvider:(id<MRGSAuthentication>)provider didLogoutUser:(MRGSAuthenticationUser *)user{
NSLog(@"User did logout: \n%@", user);
}
// Метод, который вызывается в случае необходимости отображения контроллера для авторизации пользователя.
- (void)shouldPresentAuthorizationController:(UIViewController *)viewController {
UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
[rootVC presentViewController:viewController animated:YES completion:nil];
}
Статус🔗
Затем, необходимо проверить статус авторизации (залогинен ли пользователь):
Вход🔗
Для обычного входа воспользуйтесь одним из методов:
// If error occured, error object will be non-null
MRGSAuthenticationAppleGameCenter.Instance.Login((MRGSError error) => {
if (error == null) {
// Auth success
}
});
// The response will include an object describing the user and the token, and an error object, if any.
MRGSAuthenticationAppleGameCenter.Instance.Login((MRGSAuthenticationCredential credentials, MRGSError error) => {
Debug.Log("MRGSAuthenticationAppleGameCenter:\nCredentials: " + credentials + "\nError:\n" + error);
if (error == null) {
// Auth success
}
});
// В ответе придет только объект ошибки, если она случилась
[[MRGSAuthenticationAppleGameCenter sharedInstance] login:^(NSError *error) {
if (!error) {
// Auth success
}
}];
// В ответе придет объект, описывающий пользователя и токен, и объект ошибки, если она случилась
[[MRGSAuthenticationAppleGameCenter sharedInstance] loginWithCompletionHandler:^(MRGSAuthenticationCredential *credentials, NSError *error) {
NSLog(@"Result - %@. Error - %@", credentials, error);
if (!error) {
// Auth success
}
}];
Проверка пользователя
Если Вы хотите проверять пользователя на сервере, то вы можете получить необходимые данные из поля credentials.accessToken.optionalParams, а именно:
Важно
Нативный интерфейс Apple Game Center не дает возможности принудительно запустить авторизацию второй раз за сессию. То есть если пользователь один раз за сессию отменил логин, или он был неуспешен, еще раз показать окно не получится. В таких случаях при вызове метода логина мы сразу вернем Вам в результат ошибку с кодом '-102'. Лучше всего при получении такой ошибки показать пользователю окно с призывом открыть раздел "Game Center" в системных настройках и выполнить вход в учетную запись там, и после этого вернуться в приложение.
Статус авторизации🔗
Чтобы получить всю информацию о текущем состоянии авторизации, информацию пользователя, статусе авторизации, воспользуйтесь методами:
// The information about the user, identifier, name, email, etc.
MRGSAuthenticationAppleGameCenter.Instance.GetCurrentUser((MRGSAuthenticationUser user, MRGSError error) => {
Debug.Log("MRGSAuthenticationAppleGameCenter:\User: " + user + "\nError:\n" + error);
if (error == null) {
// Work with user data
}
});
// Information about the token, lifetime, etc.
MRGSAuthenticationAppleGameCenter.Instance.GetAccessToken((MRGSAuthenticationAccessToken token, MRGSError error) => {
Debug.Log("MRGSAuthenticationAppleGameCenter:\Token: " + token + "\nError:\n" + error);
if (error == null) {
// Work with token info
}
else if (error.Code == (int)MRGSAuthenticationErrorCode.ConnectionFailed)
{
// No network, try later
}
else
{
// Logout user from app (MRGS will logout automatically in SDK)
}
});
// Возвращается объект, объединяющий в себе информацию о пользователе(идентификатор, имя, email, и др) и о токене.
[[MRGSAuthenticationAppleGameCenter sharedInstance] getCredentials:^(MRGSAuthenticationCredential *credentials, NSError *error) {
NSLog(@"Result - %@. Error - %@", credentials, error);
if(!error){
// Credentials data work
}
}];
// Возвращается отдельно информация о пользователе, идентификатор, имя, email, и др.
[[MRGSAuthenticationAppleGameCenter sharedInstance] getCurrentUser:^(MRGSAuthenticationUser *user, NSError *error) {
NSLog(@"User - %@. Error - %@", user, error);
if(!error){
// User data work
}
}];
// Возвращается отдельно информация о токене, времени жизни и др.
[[MRGSAuthenticationAppleGameCenter sharedInstance] getAccessToken:^(MRGSAuthenticationAccessToken *token, NSError *error) {
if (!error) {
NSLog(@"getAccessToken result - %@", token);
} else {
NSLog(@"getAccessToken error - %@", error);
}
}];
Выход🔗
Для того, чтобы "выйти" из аккаунта пользователя, воспользуйтесь методом:
Работа с MRGSAuthenticationGames интерфейсом🔗
Протокол для работы с игровыми социальными сетями - MRGSAuthenticationGames. Он позволяет взаимодействовать с достижениями игрока и таблицами рейтингов игроков. Далее описана стандартная реализация интерфейса MRGSAuthenticationGames:
Работа с достижениями игрока (Achievements)🔗

Для получения списка доступных достижений, воспользуйтесь методом:
При успешном выполнении вы получите массив объектов типа MRGSAuthenticationAchievement, описывающих каждое достижение, в противном случае придет ошибка.
Для установки прогресса для пользователя для конкретного достижения, воспользуйтесь методом:
В метод передается процент выполнения достижения и его идентификатор (можно получить из ранее полученных объектов типа MRGSAuthenticationAchievement), в ответ придет ошибка, если она произошла.
Для показа экрана с достижениями, воспользуйтесь методом:
Callback будет вызван на событие закрытия пользователем экрана достижений.
Работа с таблицами рейтингов игроков (Leaderboards)🔗

Для получения списка доступных таблиц рейтингов, воспользуйтесь методом:
При успешном выполнении вы получите массив объектов типа MRGSAuthenticationLeaderboard, описывающих каждую таблицу рейтингов, в противном случае придет ошибка.
Для установки очков для пользователя для конкретной таблицы рейтингов, воспользуйтесь методом:
В метод очки для текущего пользователя в таблице рейтингов и идентификатор конкретной таблицы (можно получить из ранее полученных объектов типа MRGSAuthenticationLeaderboard), в ответ придет ошибка, если она произошла.
Для показа экрана со всеми таблицами рейтингов, воспользуйтесь методом:
Callback будет вызван на событие закрытия пользователем экрана со всеми рейтингами.
Для показа экрана с конкретной таблицей рейтингов, воспользуйтесь методом:
В метод передается идентификатор таблицы рейтингов. Callback будет вызван на событие закрытия пользователем экрана таблицы рейтингов.
Для получения текущего рейтинга для пользователя, или для всех пользователей этого рейтинга, воспользуйтесь соответствующими методами:
// Для текущего пользователя
MRGSAuthenticationAppleGameCenter.Instance.GetCurrentPlayerScoreForLeaderboard("some_leaderboard_id", MRGSAuthenticationLeaderboardTimeScope.AllTime, MRGSAuthenticationLeaderboardCollectionType.Public, (MRGSAuthenticationLeaderboardScore score, MRGSError error) => {
if(error == null){
// Operation completed successfully, work with data
}
});
// Для всех пользователей
MRGSAuthenticationAppleGameCenter.Instance.GetAllPlayersScoresForLeaderboard("some_leaderboard_id", MRGSAuthenticationLeaderboardTimeScope.AllTime, MRGSAuthenticationLeaderboardCollectionType.Public, (List<MRGSAuthenticationLeaderboardScore> scores, MRGSError error) => {
if(error == null){
// Operation completed successfully, work with data
}
});
// Для текущего пользователя
[[MRGSAuthenticationAppleGameCenter sharedInstance] getCurrentPlayerScoreForLeaderboardWithId: @"some_leaderboard_id" timeScope:MRGSAuthenticationLeaderboardTimeScopeAllTime collectionType:MRGSAuthenticationLeaderboardCollectionPublic completionHandler:^(MRGSAuthenticationLeaderboardScore *score, NSError *error) {
if(!error){
// Operation completed successfully, work with data
}
}];
// Для всех пользователей
[[MRGSAuthenticationAppleGameCenter sharedInstance] getAllPlayersScoresForLeaderboardWithId: @"some_leaderboard_id" timeScope:MRGSAuthenticationLeaderboardTimeScopeAllTime collectionType:MRGSAuthenticationLeaderboardCollectionPublic completionHandler:^(NSArray *scores, NSError *error) {
if(!error){
// Operation completed successfully, work with data
}
}];
В метод передается идентификатор таблицы рейтингов, время, за которое нужно собрать данные, тип собираемых данных (видимость для всех, или только для друзей). В ответ придет объект, или массив объектов типа MRGSAuthenticationLeaderboardScore, описывающих очки рейтинга пользователя.
Дополнительные возможности Apple Game Center🔗
Также, MRGSAuthenticationAppleGameCenter предлагает вам несколько дополнительных возможностей, исключительно для работы с Apple Game Center:
Для того, чтобы получить аватарку пользователя с заданным идентификатором, воспользуйтесь методом:
Для того, чтобы сбросить все достижения (Achievements) текущего пользователя, воспользуйтесь методом:
Для того, чтобы получить список всех друзей текущего пользователя, воспользуйтесь методом:
Для того, чтобы получить объект с описанием пользователя с заданным идентификатором, воспользуйтесь методом:
Для того, чтобы получить объекты с описанием пользователей с заданными идентификаторами, воспользуйтесь методом:
Дата создания: 2020-05-28