Login with Facebook🔗

Login with Facebook - позволяет людям быстро создать аккаунт и войти в ваше приложение с различных платформ. Эта функция доступна в iOS, Android, веб-приложениях, приложениях для ПК и на таких устройствах, как Smart TV и объекты Интернета вещей. Вход через Facebook позволяет решать две задачи: выполнять аутентификацию и запрашивать разрешения на доступ к данным людей. Вход через Facebook можно использовать и просто для авторизации, и для авторизации и запроса разрешений. С помощью «Входа через Facebook» люди могут легко и быстро создать аккаунт в вашем приложении, не устанавливая пароль. Этот простой и удобный метод позволяет повысить конверсию. Создав аккаунт на одной платформе, человек может затем выполнять вход в ваше приложение на любых других платформах — достаточно одного касания или нажатия. Подтвержденный электронный адрес позволит вам охватить этого человека и вовлечь его повторно. Разработчики, которые интегрировали в свои приложения вход через Facebook, смогли заметно увеличить количество операций входа и повысить уровень вовлеченности пользователей — тем более что люди и сами все чаще используют вход через Facebook
Важно
Данный модуль работает без зависимости от Facebook SDK, но при этом совместим с ним при обновлении. Если у вас сейчас используется Facebook SDK, то при переходе на MRGS, текущие сессии будут автоматически подтянуты, даже если само Facebook SDK было удалено из проекта.
Android/Unity
Не используйте Android gradle plugin classpath 'com.android.tools.build:gradle:x.x.x' lower3.4.3 version так как он содержит ошибки в Jetifier и не позволяет использовать CustomTabs из-за ошибок в компиляции. Подробней.
Предварительная настройка🔗
Получение ключей и необходимых данных🔗
Перед началом работы, необходимо настроить аккаунт разработчика на сайте Facebook, добавить новое приложение. После регистрации приложения Вы получите уникальный идентификатор вашего приложения (Facebook AppID). Также, если хотите использовать некоторые дополнительные разрешения пользователя, такие как доступ к списку друзей, получение пользовательского дня рождения, пола, города и локации, то вам необходимо настроить данные разрешения в настройках приложения, и затем пройти ревью со стороны фейсбука (всю дополнительную информацию мы запросим автоматически, и, если есть разрешения, то все данные автоматически появятся в объекте MRGSAuthenticationUser). Без ревью можно запросить только Email. Инструкцию по регистрации проекта и получения необходимых ключей можно найти на сайте Facebook - https://developers.facebook.com/apps/.
Важно
На данном шаге нужно только получить Facebook App ID и настроить приложение на сайте Facebook. Как его использовать в проекте описано ниже.
Настройка проекта🔗
Для того, чтобы авторизация работала корректно, необходимо добавить некоторые изменения в проект:
Для Unity
Для iOS вам необходимо добавить в Info.plist приложения следующие данные:
- Добавить новые схемы для открытия других приложений из Вашего приложения
- Новую URL-схему для открытия приложения извне вида
fb<FACEBOOK_APP_ID>
Новую схему открытия приложения нужно добавить, чтобы браузер мог вернуть пользователя обратно в ваше приложение. URL-схема должна представлять из себя строку вида fb<FACEBOOK_APP_ID>, где FACEBOOK_APP_ID - это ваш идентификатор приложения в Facebook, полученный на предыдущем шаге (например, если FACEBOOK_APP_ID - 1595275917403961, то добавляемая схема должна иметь вид: fb1595275917403961). Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье, но в Unity есть более простой метод добавления данных в plist приложения, описанный ниже.
Схемы для открытия других приложений нужны для проверки наличия официального приложения facebook. Необходимо добавить следующие схемы - fbapi,fbauth,fbauth2 в LSApplicationQueriesSchemes. Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье, но в Unity есть более простой метод добавления данных в plist приложения, описанный ниже.
Для этого добавьте код в Unity post build process:
[PostProcessBuild]
public static void PostProcessBuild(BuildTarget target, string path)
{
string plistPath = path + "/Info.plist";
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath));
PlistElementDict rootDict = plist.root;
PlistElementArray schemesToOpen = rootDict.CreateArray("LSApplicationQueriesSchemes");
schemesToOpen.AddString("fbapi");
schemesToOpen.AddString("fbauth");
schemesToOpen.AddString("fbauth2");
// Добавление URL-схемы
PlistElementArray appSchemes = rootDict.CreateArray("CFBundleURLTypes");
PlistElementDict appSchemesDict = appSchemes.AddDict();
appSchemesDict.SetString("CFBundleURLName", "");
PlistElementArray appSchemesArray = appSchemesDict.CreateArray("CFBundleURLSchemes");
appSchemesArray.AddString("fb<FACEBOOK_APP_ID>"); // Где FACEBOOK_APP_ID - это ваш идентификатор приложения в Facebook, полученный на предыдущем шаге
File.WriteAllText(plistPath, plist.WriteToString());
}
Или измените уже существующий код добавления свойств в Info.plist приложения, если он у вас есть.
Для iOS
Вам необходимо добавить в Info.plist вашего приложения следующие данные:
- Добавить новые схемы для открытия других приложений из Вашего приложения
- Новую URL-схему для открытия приложения извне вида
fb<FACEBOOK_APP_ID>
Новую схему открытия приложения нужно добавить, чтобы браузер мог вернуть пользователя обратно в ваше приложение. URL-схема должна представлять из себя строку вида fb<FACEBOOK_APP_ID>, где FACEBOOK_APP_ID - это ваш идентификатор приложения в Facebook, полученный на предыдущем шаге (например, если FACEBOOK_APP_ID - 1595275917403961, то добавляемая схема должна иметь вид: fb1595275917403961). Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье, но ниже также приведено описание добавления.
Схемы для открытия других приложений нужны для проверки наличия официального приложения facebook. Необходимо добавить следующие схемы - fbapi,fbauth,fbauth2 в LSApplicationQueriesSchemes. Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье, но ниже также приведено описание добавления.
С помощью UI:
Для добавления схем в LSApplicationQueriesSchemes (для открытия других приложений) необходимо:
- Зайдите в Info.plist вашего приложения
- Добавьте новую строку с названием LSApplicationQueriesSchemes и типом данных array
- Добавьте в созданный массив необходимые элементы (
fbapi,fbauth,fbauth2)
Для добавления URL-схемы (для открытия Вашего приложения извне) необходимо:
- Зайдите в Info.plist вашего приложения
- Добавьте строку «URL types»
- Разверните первый элемент («Item0»), добавьте строку «URL identifier» и добавьте значение с идентификатором своего приложения (например, com.company.appname).
- Добавьте строку в первый элемент («item0») в «URL types» и назовите его «URL Schemes» и добавьте новый элемент (нужную URL-схему) в «URL Schemes»
В итоге получится такая структура:

В виде XML:
Добавьте в ваш Info.plist следующие данные:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fbauth</string>
<string>fbauth2</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb<FACEBOOK_APP_ID></string>
</array>
</dict>
</array>
Note: для URL-схем, если у вас уже есть такая структура в plist'е с другими схемами, то можно просто добавить еще один элемент в массив схем (CFBundleURLSchemes или LSApplicationQueriesSchemes)
Добавление зависимостей🔗
Далее необходимо добавить в проект 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, выберите пакетMRGSAuthenticationFacebookиз списка, затем нажмите "Install" - Импортируйте модуль:
using MRGS;
- Загрузите последнюю версию библиотеки. Распакуйте архив.
- (Для интеграции unitypackage) В Unity нажмите
Assets -> Import Package -> Custom Package, и выберите пакетgames.my.mrgs.authenticationfacebook.unitypackageиз скачанного архива. - (Для интеграции tgz) В Unity нажмите
Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакетgames.my.mrgs.authenticationfacebook-<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 - Выберите модуль MRGSAuthenticationFacebook из "MRGS Package Collection".
- Или вы можете выбрать пакет «MRGS» из "MRGS Package Collection" (содержит все модули mrgs в качестве продуктов), а затем выбрать только продукт "MRGS/AuthenticationFacebook".
Отдельными пакетами
- В Xcode выберите File > Add Packages
- В строке поиска в правом верхнем углу вставьте URL:
https://mrgs-gitea.my.games/mrgs/mrgsauthenticationfacebook-ios-sdk.git - Добавьте модуль в свой проект
- Или вы можете вставить URL
https://mrgs-gitea.my.games/mrgs/ios-sdks.git, чтобы подключить пакет "MRGS", который содержит все модули mrgs в качестве продуктов, а затем выбрать только продукт "MRGS/AuthenticationFacebook".
Шаг 2. Добавьте поддержку категорий ObjectiveC
- В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSAuthenticationFacebook;или#import <MRGSAuthenticationFacebook/MRGSAuthenticationFacebook.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 добавьте последнюю версию MRGSAuthenticationFacebook:
Чтобы добавить через subspecs:
Для добавления через отдельные модули:
Чтобы добавить все модули mrgs:
Шаг 3. Установите зависимости
- Выполните
pod install(илиpod install --repo-updateесли необходимо) - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSAuthenticationFacebook;или#import <MRGSAuthenticationFacebook/MRGSAuthenticationFacebook.h>
Шаг 1. Добавьте зависимости
Добавьте зависимость в ваш Cartfile:
binary "https://mrgs-nexus.my.games/repository/ios-sdks/MRGSAuthenticationFacebook/MRGSAuthenticationFacebook.json" ~> 5.0.0
Шаг 2. Установите зависимости
- Выполните
carthage update --use-xcframeworks - Добавьте загруженные фреймворки в свой проект (убедитесь, что опция "do not embed" включена)
- В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSAuthenticationFacebook;или#import <MRGSAuthenticationFacebook/MRGSAuthenticationFacebook.h>
- Загрузите последнюю версию библиотеки. Распакуйте архив.
-
Добавьте
MRGSAuthenticationFacebook.xcframeworkиз скачанного архива в ваш проект (Перетащите библиотеки в раздел "Linked frameworks and Libraries") (для совместимости в архиве также находится MRGSAuthenticationFacebook.framework - fat framework старого вида) -
В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGSAuthenticationFacebook;или#import <MRGSAuthenticationFacebook/MRGSAuthenticationFacebook.h> - Также, вы можете добавить из архива файлы
MRGServiceKit.hиmodule.modulemapв свой проект, либо в настройках проекта укажите путь до них в разделеBuild Settings -> Header search paths. Теперь вместо импорта каждого из наших фреймворков по отдельности, вы можете импортировать только один заголовочный файл:@import MRGServiceKit;
Добавление в Android проект
- Добавьте зависимости в ваши Application gradle file.
Настройка параметров MRGS🔗
Далее нужно передать в MRGS все полученные значения, то есть FacebookAppID. Для этого, при старте SDK MRGS необходимо добавить соответствующую настройку в параметрах внешних SDK:
using MRGS;
public class MasterController : MonoBehaviour
{
void Awake()
{
// Setting up MRGS params
// ...
var modulesParams = new List<MRGSExternalSDKSettings>
modulesParams.Add(new MRGSFacebookParams("<FACEBOOK_APPID>"));
// Setting up external sdk params
// ...
MRGService.Instance.Initialize(serviceParams, sdkParams);
}
}
@import MRGService;
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Настройка параметров MRGS
// ...
//Настройка Внешних SDK
MRGSFacebookParams* facebookLoginParams = [[MRGSFacebookParams alloc] initWithAppId:@"<FACEBOOK_APP_ID>"];
NSArray *externalParams = @[ ..., facebookLoginParams];
[MRGService startWithServiceParams:<params> externalSDKParams:externalParams delegate:nil];
}
import games.my.mrgs.MRGSExternalSDKParams;
import games.my.mrgs.MRGSExternalSDKParams.FacebookParams;
import games.my.mrgs.MRGService;
import games.my.mrgs.MRGServiceParams;
public class YourApplicationClass extends Application {
@Override
public void onCreate() {
super.onCreate();
// Setting MRGService
final MRGServiceParams serviceParams = ...;
// Setting External SDKs
final MRGSExternalSDKParams externalSDKParams = MRGSExternalSDKParams.newInstance();
externalSDKParams.facebookParams = FacebookParams.init("<FACEBOOK_APP_ID>");
MRGService.service(context, serviceParams, externalSDKParams);
}
}
Facebook App Suffix
Также, если у вас одно приложения facebook на несколько "физических" приложений (то есть если вы используете один facebook app id для нескольких разных приложений), то чтобы их дифференцировать можно использовать appSuffix. Соответствующее поле присутствует в MRGSFacebookParams.
Добавление кнопки🔗
Затем, необходимо добавить на экран входа кнопку 'Login with Facebook', в соответствии с Facebook button guidelines.
Работа с MRGSAuthentication интерфейсом🔗
Для работы с Login with Facebook воспользуйтесь классом MRGSAuthenticationFacebook. Обращаем внимание, что данный класс реализует основной интерфейс MRGSAuthentication, то есть имеет все методы этого интерфейса. Далее описана стандартная реализация интерфейса MRGSAuthentication:
Делегат🔗
Перед началом работы с API, необходимо установить и реализовать делегат, принимающий обратные вызовы:
// Setting
// 'this' conforms to 'IMRGSAuthenticationDelegate' protocol
MRGSAuthenticationFacebook.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());
}
// Установка
[MRGSAuthenticationFacebook 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];
}
import androidx.annotation.NonNull;
import games.my.mrgs.authentication.MRGSAuthentication.OnExternalLogoutListener;
import games.my.mrgs.authentication.MRGSAuthenticationNetwork;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
// Set a listener
MRGSFacebook.getInstance().setOnExternalLogoutListener(new OnExternalLogoutListener() {
@Override
public void onUserLogout(@NonNull MRGSAuthenticationNetwork network) {
// Handel result.
}
});
Статус🔗
Затем, необходимо проверить статус авторизации (залогинен ли пользователь):
Вход🔗
Для обычного входа воспользуйтесь одним из методов:
// If error occured, error object will be non-null
MRGSAuthenticationFacebook.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.
MRGSAuthenticationFacebook.Instance.Login((MRGSAuthenticationCredential credentials, MRGSError error) => {
Debug.Log("MRGSAuthenticationFacebook:\nCredentials: " + credentials + "\nError:\n" + error);
if (error == null) {
// Auth success
}
});
// В ответе придет только объект ошибки, если она случилась
[[MRGSAuthenticationFacebook sharedInstance] login:^(NSError *error) {
if (!error) {
// Auth success
}
}];
// В ответе придет объект, описывающий пользователя и токен, и объект ошибки, если она случилась
[[MRGSAuthenticationFacebook sharedInstance] loginWithCompletionHandler:^(MRGSAuthenticationCredential *credentials, NSError *error) {
NSLog(@"Result - %@. Error - %@", credentials, error);
if (!error) {
// Auth success
}
}];
import android.app.Activity;
import androidx.annotation.NonNull;
import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSCredentials;
import games.my.mrgs.authentication.MRGSLoginCallback;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
MRGSFacebook.getInstance().login(activity, new MRGSLoginCallback() {
@Override
public void onSuccess(@NonNull MRGSCredentials credentials) {
// Handle result.
}
@Override
public void onError(@NonNull MRGSError error) {
// Handle error.
}
});
Ошибка при отсутствии браузера на Android и ее обработка
Facebook не поддерживает авторизацию через нативный WebView, только через браузер. Поэтому в случае, если на устройстве не установлен браузер, в callback будет приходить ошибка с кодом -110 и описанием Browser not found. В таком случае рекомендуем показать пользователям алерт о том, что нужно установить браузер для авторизации в Facebook.
Вход с доп. разрешениями🔗
Также у пользователя можно запросить дополнительные данные:
- Доступ к списку друзей
- Доступ к описанию пользователя "о себе"
- Доступ к дню рождения пользователя
- Доступ к полу пользователя
- Доступ к родному городу пользователя
- Доступ к локации пользователя (указанную в профиле)
Описание enum'a:
* Email - MRGSAuthenticationFacebook.Scopes.Email
* Доступ к списку друзей - MRGSAuthenticationFacebook.Scopes.UserFriends
* Доступ к дню рождения пользователя - MRGSAuthenticationFacebook.Scopes.UserBirthday
* Доступ к полу пользователя - MRGSAuthenticationFacebook.Scopes.UserGender
* Доступ к родному городу пользователя - MRGSAuthenticationFacebook.Scopes.UserHometown
* Доступ к локации пользователя (указанную в профиле) - MRGSAuthenticationFacebook.Scopes.UserLocation
* Email - kMRGSAuthenticationFacebookScopeEmail
* Доступ к списку друзей - kMRGSAuthenticationFacebookScopeFriends
* Доступ к описанию пользователя "о себе" - kMRGSAuthenticationFacebookScopeUserAboutMe
* Доступ к дню рождения пользователя - kMRGSAuthenticationFacebookScopeBirthday
* Доступ к полу пользователя - kMRGSAuthenticationFacebookScopeGender
* Доступ к родному городу пользователя - kMRGSAuthenticationFacebookScopeHometown
* Доступ к локации пользователя (указанную в профиле) - kMRGSAuthenticationFacebookScopeLocation
* Email - "email"
* Доступ к списку друзей - "user_friends"
* Доступ к описанию пользователя "о себе" - "public_profile"
* Доступ к дню рождения пользователя - "user_birthday"
* Доступ к полу пользователя - "user_gender"
* Доступ к родному городу пользователя - "user_hometown"
* Доступ к локации пользователя (указанную в профиле) - "user_location"
Для этого воспользуйтесь методом ниже, передав в него массив с нужными разрешениями:
var scopes = new List<string>();
scopes.Add(MRGSAuthenticationFacebook.Scopes.Email);
scopes.Add(MRGSAuthenticationFacebook.Scopes.UserFriends);
scopes.Add(MRGSAuthenticationFacebook.Scopes.UserBirthday);
scopes.Add(MRGSAuthenticationFacebook.Scopes.UserGender);
scopes.Add(MRGSAuthenticationFacebook.Scopes.UserHometown);
scopes.Add(MRGSAuthenticationFacebook.Scopes.UserLocation);
MRGSAuthenticationFacebook.Instance.Login(scopes, (MRGSAuthenticationCredential credentials, MRGSError error) => {
Debug.Log("MRGSAuthenticationFacebook:\nCredentials: " + credentials + "\nError:\n" + error);
if (error == null) {
// Auth success
}
});
NSArray* scopesToRequest = @[kMRGSAuthenticationFacebookScopeEmail,kMRGSAuthenticationFacebookScopeFriends,kMRGSAuthenticationFacebookScopeUserAboutMe,kMRGSAuthenticationFacebookScopeBirthday,kMRGSAuthenticationFacebookScopeGender,kMRGSAuthenticationFacebookScopeHometown,kMRGSAuthenticationFacebookScopeLocation];
[[MRGSAuthenticationFacebook sharedInstance] loginWithScopes:scopesToRequest completionHandler:^(MRGSAuthenticationCredential *credentials, NSError *error) {
NSLog(@"Result - %@. Error - %@", credentials, error);
}];
import android.app.Activity;
import androidx.annotation.NonNull;
import java.util.Arrays;
import java.util.List;
import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSCredentials;
import games.my.mrgs.authentication.MRGSLoginCallback;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
final List<String> scopes = Arrays.asList("email", "user_friends", "user_birthday");
MRGSFacebook.getInstance().login(activity, scopes, new MRGSLoginCallback() {
@Override
public void onSuccess(@NonNull MRGSCredentials credentials) {
// Handle result
}
@Override
public void onError(@NonNull MRGSError error) {
// Handle error.
}
});
Важно
Учтите, что пользователь может не дать некоторые разрешения, выборочно. Список полученных разрешений можно посмотреть в поле credentials.accessToken.authorizedScopes. Если вы вызовете метод login даже после авторизации, но с расширенным списком разрешений (добавились новые), то будет показано окно запроса разрешений у пользователя.
Статус авторизации🔗
Чтобы получить всю информацию о текущем состоянии авторизации, информацию пользователя, статусе авторизации, воспользуйтесь методами:
// The information about the user, identifier, name, email, etc.
MRGSAuthenticationFacebook.Instance.GetCurrentUser((MRGSAuthenticationUser user, MRGSError error) => {
Debug.Log("MRGSAuthenticationFacebook:\User: " + user + "\nError:\n" + error);
if (error == null) {
// Work with user data
}
});
// Information about the token, lifetime, etc.
MRGSAuthenticationFacebook.Instance.GetAccessToken((MRGSAuthenticationAccessToken token, MRGSError error) => {
Debug.Log("MRGSAuthenticationFacebook:\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, и др) и о токене.
[[MRGSAuthenticationFacebook sharedInstance] getCredentials:^(MRGSAuthenticationCredential *credentials, NSError *error) {
NSLog(@"Result - %@. Error - %@", credentials, error);
if(!error){
// Credentials data work
}
}];
// Возвращается отдельно информация о пользователе, идентификатор, имя, email, и др.
[[MRGSAuthenticationFacebook sharedInstance] getCurrentUser:^(MRGSAuthenticationUser *user, NSError *error) {
NSLog(@"User - %@. Error - %@", user, error);
if(!error){
// User data work
}
}];
// Возвращается отдельно информация о токене, времени жизни и др.
[[MRGSAuthenticationFacebook sharedInstance] getAccessToken:^(MRGSAuthenticationAccessToken *token, NSError *error) {
if (!error) {
NSLog(@"getAccessToken result - %@", token);
} else {
NSLog(@"getAccessToken error - %@", error);
}
}];
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSAccessToken;
import games.my.mrgs.authentication.MRGSAuthentication;
import games.my.mrgs.authentication.MRGSUser;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
import games.my.mrgs.utils.optional.BiConsumer;
// Returns user's information.
MRGSFacebook.getInstance().getCurrentUser(new MRGSAuthentication.UserCallback() {
@Override
public void onSuccess(@NonNull final MRGSUser user) {
}
@Override
public void onError(@NonNull MRGSError error) {
}
});
// Returns authentication's information.
MRGSFacebook.getInstance().getAccessToken(new BiConsumer<MRGSAccessToken, MRGSError>() {
@Override
public void accept(@Nullable MRGSAccessToken accessToken, @Nullable MRGSError error) {
if (error != null) {
Log.d("MRGSAuthentication", "AccessToken error: " + error.getErrorText());
} else {
Log.d("MRGSAuthentication", "AccessToken success: " + accessToken);
}
}
});
Выход🔗
Для того, чтобы "выйти" из аккаунта пользователя, воспользуйтесь методом:
Дополнительно🔗
Учтите, что если вы запросили дополнительные разрешения у пользователя на доступ к дополнительным полям его профиля, мы запросим их автоматически, и данные появятся либо в соответствующих полях объекта класса MRGSAuthenticationUser, или в поле optionalParams у этого объекта.
Работа с MRGSAuthenticationSocialNetwork интерфейсом🔗
MRGSAuthenticationSocialNetwork - interface для работы с социальными сетями, позволяет получать друзей пользователя, его аватарку, делать игровые запросы и приглашения в игру, а также открывать страницу "поделиться".
Получение аватарки🔗
Для получения аватарки пользователя с заданным идентификатором и размером, воспользуйтесь методом:
import android.graphics.Bitmap;
import androidx.annotation.NonNull;
import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSAvatarCallback;
import games.my.mrgs.authentication.MRGSUser;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
// Call #getCurrentUser() to get current user.
final MRGSUser user = ...
// Get user's avatar.
MRGSFacebook.getInstance().getUserAvatar(user, new MRGSAvatarCallback() {
@Override
public void onSuccess(@NonNull Bitmap bitmap) {
// Handle result.
}
@Override
public void onError(@NonNull MRGSError error) {
// Handle error.
}
});
Список друзей и получение пользователей🔗
Для того, чтобы получить список всех друзей текущего пользователя, воспользуйтесь методом:
import androidx.annotation.NonNull;
import java.util.List;
import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSSocial;
import games.my.mrgs.authentication.MRGSUser;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
MRGSFacebook.getInstance().getFriends(new MRGSSocial.FriendsCallback() {
@Override
public void onSuccess(@NonNull List<MRGSUser> users) {
}
@Override
public void onError(@NonNull MRGSError error) {
}
});
Важно
Учтите, что facebook возвращает не всех друзей пользователя, а только тех, которые установили ваше приложение. Также, для работы данного метода необходимо разрешение на список друзей (указывается в методе login). При отсутствии разрешения и вызове данного метода, пользователю будет показан диалог авторизации с дополнительным разрешением на просмотр друзей.
Для того, чтобы получить объект с описанием пользователя с заданным идентификатором, воспользуйтесь методом:
import androidx.annotation.NonNull;
import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSAuthentication;
import games.my.mrgs.authentication.MRGSUser;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
MRGSFacebook.getInstance().getUserWithId("userId", new MRGSAuthentication.UserCallback() {
@Override
public void onSuccess(@NonNull MRGSUser user) {
}
@Override
public void onError(@NonNull MRGSError error) {
}
});
Для того, чтобы получить объекты с описанием пользователей с заданными идентификаторами, воспользуйтесь методом:
import androidx.annotation.NonNull;
import java.util.Arrays;
import java.util.List;
import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSSocial;
import games.my.mrgs.authentication.MRGSUser;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
MRGSFacebook.getInstance().getUsersWithId(Arrays.asList("user_id_1", "user_id_2"), new MRGSSocial.FriendsCallback() {
@Override
public void onSuccess(@NonNull List<MRGSUser> users) {
}
@Override
public void onError(@NonNull MRGSError error) {
}
});
Создание публикации🔗
Для того, чтобы открыть диалог создания нового поста в ленте текущего пользователя с заданными параметрами, воспользуйтесь методом:
MRGSAuthenticationPost *post = [[MRGSAuthenticationPost alloc] init];
post.caption = @"Check out MRGS site!";
post.link = @"http://mrgs.astrum.team";
[[MRGSAuthenticationFacebook sharedInstance] showPostOnWallDialog:post completionHandler:^(NSError *error) {
if(!error){
// Operation completed successfully
}
}];
Важно
Будет открыт диалог создания нового поста с заполненными данными, указанными в MRGSAuthenticationPost. Для Facebook в объекте MRGSAuthenticationPost используются только поля caption и link.
Отправка приглашений и игровых запросов🔗
Для отправки приглашений в игру и игровых запросов (с помощью них в некоторых случаях можно отправлять "подарки"), а также проверки входящих запросов, предусмотрены методы ниже. Методы принимают объект MRGSAuthenticationInvite, в котором указывается текст приглашения, список пользователей, которых нужно пригласить, и другие параметры запроса (смотрите поля класса MRGSAuthenticationInvite). Пользователю будет показан диалог для подтверждения. В ответе в случае успеха придет объект MRGSAuthenticationInvite с заполненными полями, такими как идентификатор запроса, приглашенных пользователи.
// Sending an invitation to join a game
var inviteIn = new MRGSAuthenticationInvite();
inviteIn.Message = @"Test invite message";
inviteIn.Title = @"Test title";
MRGSAuthenticationFacebook.Instance.SendInvite(inviteIn, (MRGSAuthenticationInvite inviteOut, MRGSError error) => {
if(error == null){
// Operation completed successfully
Debug.Log("Sended invite - " + inviteOut);
}
});
// Sending a game request
var inviteIn = new MRGSAuthenticationInvite();
inviteIn.Message = @"Test invite message";
inviteIn.Title = @"Test MRGS title";
inviteIn.Data = @"Test invite data";
inviteIn.Frictionless = true;
MRGSAuthenticationFacebook.Instance.SendGameRequest(inviteIn, (MRGSAuthenticationInvite inviteOut, MRGSError error) => {
if(error == null){
// Operation completed successfully
Debug.Log("Sended game request - " + inviteOut);
}
});
// Receiving incoming game requests to the user
MRGSAuthenticationFacebook.Instance.GetGameRequests((List<Dictionary<string, object>> requests, MRGSError error) => {
if(error == null){
// Operation completed successfully
string requestsString = requests != null ? MRGS.JSON.Json.Serialize(requests.ConvertAll(x => (object)x), true) : "null";
Debug.Log("Received requests - " + requestsString);
}
});
// Отправка приглашения в игру
MRGSAuthenticationInvite *invite = [[MRGSAuthenticationInvite alloc] init];
invite.message = @"Test invite message";
invite.title = @"Test title";
[[MRGSAuthenticationFacebook sharedInstance] sendInvite:invite completionHandler:^(MRGSAuthenticationInvite* inviteOut,NSError *error) {
if(!error){
// Operation completed successfully
NSLog(@"Sended invite - %@", inviteOut);
}
}];
// Отправка игрового запроса
MRGSAuthenticationInvite *invite = [[MRGSAuthenticationInvite alloc] init];
invite.message = @"Test invite message";
invite.title = @"Test MRGS title";
invite.data = @"Test invite data";
invite.frictionless = YES;
[[MRGSAuthenticationFacebook sharedInstance] sendGameRequest:invite completionHandler:^(MRGSAuthenticationInvite* inviteOut, NSError *error) {
if(!error){
// Operation completed successfully
NSLog(@"Sended request - %@", inviteOut);
}
}];
// Получение входящих игровых запросов пользователю
[[MRGSAuthenticationFacebook sharedInstance] getGameRequests:^(NSArray<NSDictionary *> *requests, NSError *error) {
if(!error){
// Operation completed successfully
NSLog(@"Received requests - %@", requests);
}
}];
import androidx.annotation.NonNull;
import java.util.Collections;
import java.util.List;
import games.my.mrgs.MRGSError;
import games.my.mrgs.MRGSList;
import games.my.mrgs.authentication.MRGSSocial;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
// Send invite request
MRGSFacebook.getInstance().sendGameRequest("Game Request",
"Invite message",
true,
Collections.singletonList(friend),
new MRGSSocial.GameRequestResultCallback() {
@Override
public void onSuccess(@NonNull List<String> users) {
// Handle result
}
@Override
public void onError(@NonNull MRGSError error) {
// Handle error
}
});
// Send game request
MRGSFacebook.getInstance().sendGameRequest("Game Request",
"Game request message",
false,
Collections.singletonList(friend),
new MRGSSocial.GameRequestResultCallback() {
@Override
public void onSuccess(@NonNull List<String> users) {
// Handle result
}
@Override
public void onError(@NonNull MRGSError error) {
// Handle error
}
});
// Get games requests
MRGSFacebook.getInstance().getGameRequests(new MRGSSocial.GameRequestCallback() {
@Override
public void onSuccess(@NonNull final MRGSList requests) {
// Handle result
}
@Override
public void onError(@NonNull MRGSError error) {
// Handle error
}
});
Отправка приглашений или игровых запросов
Для Facebook будет открыто окно, где пользователь сам выбирает друзей, которых пригласить.
Структура словаря при запросе входящих игровых запросов
Список полей приведен на сайте facebook - https://developers.facebook.com/docs/graph-api/reference/app-request/
Дополнительные возможности Facebook🔗
Также, MRGSAuthenticationFacebook предоставляет несколько дополнительных возможностей, исключительно для работы с Facebook:
Так как в Facebook необходимо вручную удалять входящие игровые запросы, то для этого предусмотрен метод (идентификатор запроса можно получить с помощью метода getGameRequests):
import androidx.annotation.NonNull;
import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSSocial;
import games.my.mrgs.authentication.facebook.MRGSFacebook;
MRGSFacebook.getInstance().deleteGameRequest(itemId, new MRGSSocial.GameRequestDeleteCallback() {
@Override
public void onSuccess() {
}
@Override
public void onError(@NonNull MRGSError error) {
}
});
Дата создания: 2020-05-28