Перейти к содержанию

Login with VKontakte🔗

Login with VKontakte

Login with VKontakte - позволяет людям быстро создать учетную запись и войти в ваше приложение с различных платформ. Эта функция доступна на iOS, Android, веб-приложениях, приложениях для ПК и таких устройствах, как Smart TV и IoT. Вход в систему через ВКонтакте позволяет решить две задачи: выполнить аутентификацию и запросить разрешения на доступ к данным людей. Вход в систему через ВКонтакте может быть использован как для авторизации, так и для авторизации и запроса разрешений. С помощью «Войти через ВКонтакте» люди могут быстро и легко создать учетную запись в вашем приложении, не устанавливая пароль. Этот простой и удобный метод позволяет увеличить конверсию. Создав учетную запись на одной платформе, человек может затем войти в свое приложение на любой другой платформе - одним касанием или щелчком мыши. Подтвержденный адрес электронной почты позволит вам связаться с этим человеком и привлечь его снова.

Важно

Заметьте, что данный подмодуль зависит от нативного sdk VKontakte, и полностью с ним совместим. То есть если у вас сейчас идет работа с нативным sdk, то при переходе на MRGS, мы автоматически подтянем сохраненные сессии.

Android sdk-fingerprint is incorrect

1) Убедитесь что вы удалили все ":" из SHA1 согласно документации.
2) Вы используете новый механизм подписи apk в GooglePlay, вам следует взять SHA1 из GooglePlay Console вашего проекта.

VK авторизация

VK авторизация требует Android 5.0+ (Api level 21+).

Предварительная настройка🔗

Получение ключей и необходимых данных🔗

Прежде чем начать, необходимо создать учетную запись разработчика на сайте ВКонтакте и добавить новое приложение. После регистрации приложения вы получите уникальный идентификатор для вашего приложения (VKontakte AppID).

Для создания приложения откройте страницу «Управление» в левом меню, затем нажмите «Создать приложение» — Вы попадете на страницу https://vk.com/editapp?act=create. Выберите тип приложения - Standalone-приложение. После подтверждения действия Вы попадете на страницу с информацией о приложении. Откройте вкладку «Настройки» в меню слева. Вы увидите поле "ID приложения", в котором будет указано число, например, 5490057. Это число — идентификатор приложения, он же VKontakte App ID, оно потребуется в дальнейшей работе.

Важно

На данном шаге нужно только получить VKontakte App ID и настроить приложение на сайте VKontakte. Как его использовать в проекте описано ниже.

Настройка проекта🔗

Для того, чтобы авторизация работала корректно, необходимо добавить некоторые изменения в проект:

Для Unity

Для iOS вам необходимо добавить в Info.plist приложения следующие данные:

  1. Добавить новую схему для открытия других приложений из Вашего приложения
  2. Новую URL-схему для открытия приложения извне вида vk<VKontakte_APP_ID>

Новую схему открытия приложения нужно добавить, чтобы браузер мог вернуть пользователя обратно в ваше приложение. URL-схема должна представлять из себя строку вида vk<VKontakte_APP_ID>, где VKontakte_APP_ID - это ваш идентификатор приложения в VKontakte, полученный на предыдущем шаге (например, если VKontakte_APP_ID - 7425813, то добавляемая схема должна иметь вид: vk7425813). Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье, но в Unity есть более простой метод добавления данных в plist приложения, описанный ниже.

Схема для открытия других приложений нужны для проверки наличия официального приложения VKontakte. Необходимо добавить схему vkauthorize в 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("vkauthorize");

    // Добавление URL-схемы
    PlistElementArray appSchemes = rootDict.CreateArray("CFBundleURLTypes");
    PlistElementDict appSchemesDict = appSchemes.AddDict();
    appSchemesDict.SetString("CFBundleURLName", "");
    PlistElementArray appSchemesArray = appSchemesDict.CreateArray("CFBundleURLSchemes");                
    appSchemesArray.AddString("vk<VKontakte_APP_ID>"); // Где VKontakte_APP_ID - это ваш идентификатор приложения в VKontakte, полученный на предыдущем шаге

    File.WriteAllText(plistPath, plist.WriteToString());
}

Или измените уже существующий код добавления свойств в Info.plist приложения, если он у вас есть.

Для Android:

К сожалению, VK SDK для Android не позволяет указать AppID (идентификатор приложения), как параметр при инициализации SDK. Единственный способ - добавить специальный целочисленный идентификатор com_vk_sdk_AppId (название важно) в ресурсы приложения. Для этого вы можете, например, создать пустую Android библиотеку (aar-файл), в ресурсы которой добавить этот идентификатор (поместив его в файл res/values/integers.xml вашей библиотеки)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="com_vk_sdk_AppId">YOUR_APP_ID</integer>
</resources>
Для iOS

Вам необходимо добавить в Info.plist вашего приложения следующие данные:

  1. Добавить новые схемы для открытия других приложений из Вашего приложения
  2. Новую URL-схему для открытия приложения извне вида vk<VKontakte_APP_ID>

Новую схему открытия приложения нужно добавить, чтобы браузер мог вернуть пользователя обратно в ваше приложение. URL-схема должна представлять из себя строку вида vk<VKontakte_APP_ID>, где VKontakte_APP_ID - это ваш идентификатор приложения в VKontakte, полученный на предыдущем шаге (например, если VKontakte_APP_ID - 7425813, то добавляемая схема должна иметь вид: vk7425813). Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье, но ниже также приведено описание добавления.

Схема для открытия других приложений нужны для проверки наличия официального приложения VKontakte. Необходимо добавить схему vkauthorize в LSApplicationQueriesSchemes. Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье, но ниже также приведено описание добавления.

С помощью UI:

Для добавления схем в LSApplicationQueriesSchemes (для открытия других приложений) необходимо:

  • Зайдите в Info.plist вашего приложения
  • Добавьте новую строку с названием LSApplicationQueriesSchemes и типом данных array
  • Добавьте в созданный массив необходимые элементы (vkauthorize)

Для добавления URL-схемы (для открытия Вашего приложения извне) необходимо:

  • Зайдите в Info.plist вашего приложения
  • Добавьте строку «URL types»
  • Разверните первый элемент («Item0»), добавьте строку «URL identifier» и добавьте значение с идентификатором своего приложения (например, com.company.appname).
  • Добавьте строку в первый элемент («item0») в «URL types» и назовите его «URL Schemes» и добавьте новый элемент (нужную URL-схему) в «URL Schemes»

В итоге получится такая структура:

Url schemes

В виде XML:

Добавьте в ваш Info.plist следующие данные:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>vkauthorize</string>
</array>

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>vk<VKontakte_APP_ID></string>
        </array>
    </dict>
</array>

Note: для URL-схем, если у вас уже есть такая структура в plist'е с другими схемами, то можно просто добавить еще один элемент в массив схем (CFBundleURLSchemes или LSApplicationQueriesSchemes)

Для Android

В проекте:

К сожалению, VK SDK для Android не позволяет указать AppID (идентификатор приложения), как параметр при инициализации SDK. Единственный способ - добавить специальный целочисленный идентификатор com_vk_sdk_AppId (название важно) в ресурсы приложения (например, в файл res/values/integers.xml)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="com_vk_sdk_AppId">YOUR_APP_ID</integer>
</resources>

Добавление зависимостей🔗

Далее необходимо добавить в проект 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, выберите пакет MRGSAuthenticationVK из списка, затем нажмите "Install"
  • Импортируйте модуль: using MRGS;
  • Загрузите последнюю версию библиотеки. Распакуйте архив.
  • (Для интеграции unitypackage) В Unity нажмите Assets -> Import Package -> Custom Package, и выберите пакет games.my.mrgs.authenticationvk.unitypackage из скачанного архива.
  • (Для интеграции tgz) В Unity нажмите Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакет games.my.mrgs.authenticationvk-<version>.tgz из скачанного архива.
  • Импортируйте модуль: using MRGS;

iOS:

Добавление в проект (общая инструкция)

В iOS, при интеграции вручную, необходимо стандартными средствами добавить в проект VKSdk.framework и VKSdkResources.bundle, которые лежат в папке - Dependencies/MRGSAuthenticationDependencies/VKontakte в скачанном с сайта MRGS архиве. Инструкции по добавлению 3d-party библиотек в проект можно найти в интернете.

Шаг 1. Добавьте зависимости

Через Package collection

  • В Xcode выберите File > Add Packages
  • Выберите «+» > "Add Swift Package Collection"
  • Вставьте URL: https://mrgs-nexus.my.games/repository/ios-sdks/MRGSPackageCollection.json
  • Выберите модуль MRGSAuthenticationVK из "MRGS Package Collection".
  • Или вы можете выбрать пакет «MRGS» из "MRGS Package Collection" (содержит все модули mrgs в качестве продуктов), а затем выбрать только продукт "MRGS/AuthenticationVK".

Отдельными пакетами

  • В Xcode выберите File > Add Packages
  • В строке поиска в правом верхнем углу вставьте URL: https://mrgs-gitea.my.games/mrgs/mrgsauthenticationvk-ios-sdk.git
  • Добавьте модуль в свой проект
  • Или вы можете вставить URL https://mrgs-gitea.my.games/mrgs/ios-sdks.git, чтобы подключить пакет "MRGS", который содержит все модули mrgs в качестве продуктов, а затем выбрать только продукт "MRGS/AuthenticationVK".

Шаг 2. Добавьте поддержку категорий ObjectiveC

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSAuthenticationVK; или #import <MRGSAuthenticationVK/MRGSAuthenticationVK.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 добавьте последнюю версию MRGSAuthenticationVK:

Чтобы добавить через subspecs:

target 'MyProject' do
    pod 'MRGS', '~> 5.0.0', :subspecs => ['AuthenticationVK']
end

Для добавления через отдельные модули:

target 'MyProject' do
    pod 'MRGSAuthenticationVK', '~> 5.0.0'
end

Чтобы добавить все модули mrgs:

target 'MyProject' do
    pod 'MRGS/AllKits', '~> 5.0.0'
end

Шаг 3. Установите зависимости

  • Выполните pod install (или pod install --repo-update если необходимо)
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSAuthenticationVK; или #import <MRGSAuthenticationVK/MRGSAuthenticationVK.h>

Шаг 1. Добавьте зависимости

Добавьте зависимость в ваш Cartfile:

binary "https://mrgs-nexus.my.games/repository/ios-sdks/MRGSAuthenticationVK/MRGSAuthenticationVK.json" ~> 5.0.0

Шаг 2. Установите зависимости

  • Выполните carthage update --use-xcframeworks
  • Добавьте загруженные фреймворки в свой проект (убедитесь, что опция "do not embed" включена)
  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSAuthenticationVK; или #import <MRGSAuthenticationVK/MRGSAuthenticationVK.h>
  • Загрузите последнюю версию библиотеки. Распакуйте архив.
  • Добавьте MRGSAuthenticationVK.xcframework из скачанного архива в ваш проект (Перетащите библиотеки в раздел "Linked frameworks and Libraries") (для совместимости в архиве также находится MRGSAuthenticationVK.framework - fat framework старого вида)

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".

  • Импортируйте модуль в коде: @import MRGSAuthenticationVK; или #import <MRGSAuthenticationVK/MRGSAuthenticationVK.h>
  • Также, вы можете добавить из архива файлы MRGServiceKit.h и module.modulemap в свой проект, либо в настройках проекта укажите путь до них в разделе Build Settings -> Header search paths. Теперь вместо импорта каждого из наших фреймворков по отдельности, вы можете импортировать только один заголовочный файл: @import MRGServiceKit;

Android:

Добавление в проект

Добавьте зависимость в build.gradle файл:

dependencies {
    def mrgsVersion = "6.x.x"

    implementation "games.my.mrgs:authentication-vk:$mrgsVersion"
}

Скопируйте файлы MRGSAuthentication.aar и MRGSAuthenticationVK.aar в директорию libs вашего проекта. Добавьте необходимые зависимости в файл build.gradle

dependencies {
    //...
    implementation(name: 'MRGSAuthentication', ext:'aar')
    implementation(name: 'MRGSAuthenticationVK', ext:'aar')

    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'androidx.browser:browser:1.5.0'
    implementation "com.vk:android-sdk-core:3.4.1"
}

Настройка параметров MRGS🔗

Далее нужно передать в MRGS все полученные значения, то есть VKontakteAppID. Для этого, при старте SDK MRGS необходимо добавить соответствующую настройку в параметрах внешних SDK:

using MRGS;

public class MasterController : MonoBehaviour
{
    void Awake()
    {
        // Setting up mrgs params
        // ...

        var modulesParams = new List<MRGSExternalSDKSettings>
        modulesParams.Add(new MRGSVKontakteParams("<VKontakte_APP_ID>"));
        // Setting up external sdk params
        // ...

        MRGService.Instance.Initialize(serviceParams, sdkParams);
    }
}
@import MRGService;

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Настройка параметров MRGS
    // ...
    //Настройка Внешних SDK

    MRGSVKontakteParams* VKontakteLoginParams = [[MRGSVKontakteParams alloc] initWithAppId:@"<VKontakte_APP_ID>"];

    NSArray *externalParams = @[ ..., VKontakteLoginParams];
    [MRGService startWithServiceParams:<params> externalSDKParams:externalParams delegate:nil];
}
import java.util.ArrayList;
import java.util.List;

import games.my.mrgs.MRGSModuleParams;
import games.my.mrgs.MRGService;
import games.my.mrgs.authentication.vk.MRGSVKAuthParams;

public class YourApplicationClass extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // Setting MRGService
        final MRGServiceParams serviceParams = ...;
        // Setting External SDKs
        final List<MRGSModuleParams> moduleParams = new ArrayList<>();
        moduleParams.add(MRGSVKAuthParams.init());

        MRGService.service(context, serviceParams, moduleParams);
    }
}

Работа с MRGSAuthentication интерфейсом🔗

Для работы с Login with VKontakte воспользуйтесь классом MRGSAuthenticationVKontakte (MRGSVK на Android). Обращаем внимание, что данный класс реализует основной интерфейс MRGSAuthentication, то есть имеет все методы этого интерфейса. Далее описана стандартная реализация интерфейса MRGSAuthentication:

Делегат🔗

Перед началом работы с API, необходимо установить и реализовать делегат, принимающий обратные вызовы:

// Setting
// 'this' conforms to 'IMRGSAuthenticationDelegate' protocol
MRGSAuthenticationVKontakte.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());
}
// Установка
[MRGSAuthenticationVKontakte 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.vk.MRGSVK;

// Set a listener
MRGSVK.getInstance().setOnExternalLogoutListener(new OnExternalLogoutListener() {
    @Override
    public void onUserLogout(@NonNull String socialId) {
        // Handel result.
    }
});

Статус🔗

Затем, необходимо проверить статус авторизации (залогинен ли пользователь):

bool isLoggedIn = MRGSAuthenticationVKontakte.Instance.IsLoggedIn();
BOOL isLoggedIn = [[MRGSAuthenticationVKontakte sharedInstance] isLoggedIn];
import games.my.mrgs.authentication.vk.MRGSVK;

final boolean isLoggedIn = MRGSVK.getInstance().isLoggedIn();

Вход🔗

Для обычного входа воспользуйтесь одним из методов:

// If error occured, error object will be non-null
MRGSAuthenticationVKontakte.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.
MRGSAuthenticationVKontakte.Instance.Login((MRGSAuthenticationCredential credentials, MRGSError error) => {
    Debug.Log("MRGSAuthenticationVKontakte:\nCredentials: " + credentials + "\nError:\n" + error);
    if (error == null) {
        // Auth success
    }
});
// В ответе придет только объект ошибки, если она случилась
[[MRGSAuthenticationVKontakte sharedInstance] login:^(NSError *error) {
    if (!error) {
        // Auth success
    }
}];

// В ответе придет объект, описывающий пользователя и токен, и объект ошибки, если она случилась
[[MRGSAuthenticationVKontakte 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.vk.MRGSVK;

MRGSVK.getInstance().login(activity, new MRGSLoginCallback() {
    @Override
    public void onSuccess(@NonNull MRGSCredentials credentials) {
        // Handle result.
    }

    @Override
    public void onError(@NonNull MRGSError error) {
        // Handle error.
    }
});

Вход с доп. разрешениями🔗

Также у пользователя можно запросить дополнительные данные:

  • Email
  • Доступ к списку друзей
  • Доступ к публикации постов без подтверждения пользователя
  • Доступ к группам (вход/выход/проверка вхождения в группу)
  • Доступ к возможности загрузки фото к пользователю (необходимо при публикации поста с картинкой без подтверждения пользователя)
  • Доступ к статусу пользователя
* Email - MRGSAuthenticationVKontakte.Scopes.Email
* Доступ к списку друзей - MRGSAuthenticationVKontakte.Scopes.Friends
* Доступ к публикации постов без подтверждения пользователя - MRGSAuthenticationVKontakte.Scopes.Wall
* Доступ к группам (вход/выход/проверка вхождения в группу) - MRGSAuthenticationVKontakte.Scopes.Groups
* Доступ к возможности загрузки фото к пользователю - MRGSAuthenticationVKontakte.Scopes.Photos
* Доступ к статусу пользователя - MRGSAuthenticationVKontakte.Scopes.Status
* Email - kMRGSAuthenticationVKontakteScopeEmail
* Доступ к списку друзей - kMRGSAuthenticationVKontakteScopeFriends
* Доступ к публикации постов без подтверждения пользователя - kMRGSAuthenticationVKontakteScopeWall
* Доступ к группам (вход/выход/проверка вхождения в группу) - kMRGSAuthenticationVKontakteScopeGroups
* Доступ к возможности загрузки фото к пользователю - kMRGSAuthenticationVKontakteScopePhotos
* Доступ к статусу пользователя - kMRGSAuthenticationVKontakteScopeStatus
* Email - "email"
* Доступ к списку друзей - "friends"
* Доступ к публикации постов без подтверждения пользователя - "wall"
* Доступ к группам (вход/выход/проверка вхождения в группу) - "groups"
* Доступ к возможности загрузки фото к пользователю - "photos"
* Доступ к статусу пользователя - "status"

Для этого воспользуйтесь методом ниже, передав в него массив необходимых разрешений:

var scopes = new List<string>();
scopes.Add(MRGSAuthenticationVKontakte.Scopes.Email);
scopes.Add(MRGSAuthenticationVKontakte.Scopes.Friends);
scopes.Add(MRGSAuthenticationVKontakte.Scopes.Wall);
scopes.Add(MRGSAuthenticationVKontakte.Scopes.Groups);
scopes.Add(MRGSAuthenticationVKontakte.Scopes.Photos);
scopes.Add(MRGSAuthenticationVKontakte.Scopes.Status);

MRGSAuthenticationVKontakte.Instance.Login(scopes, (MRGSAuthenticationCredential credentials, MRGSError error) => {
    Debug.Log("MRGSAuthenticationVKontakte:\nCredentials: " + credentials + "\nError:\n" + error);
    if (error == null) {
        // Auth success
    }
});
NSArray* scopesToRequest = @[kMRGSAuthenticationVKontakteScopeEmail,kMRGSAuthenticationVKontakteScopeFriends,kMRGSAuthenticationVKontakteScopeWall,kMRGSAuthenticationVKontakteScopeGroups,kMRGSAuthenticationVKontakteScopePhotos,kMRGSAuthenticationVKontakteScopeStatus];
[[MRGSAuthenticationVKontakte 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 games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSCredentials;
import games.my.mrgs.authentication.MRGSLoginCallback;
import games.my.mrgs.authentication.vk.MRGSVK;

final List<String> scopes = Arrays.asList("email", "friends", "groups", "wall", "photos", "status");
MRGSVK.getInstance().login(activity, scopes, new MRGSLoginCallback() {
    @Override
    public void onSuccess(@NonNull MRGSCredentials credentials) {
        // Handle result
    }

    @Override
    public void onError(@NonNull MRGSError error) {
        // Handle error.
    }
});

Важно

Учтите, что пользователь может не дать некоторые разрешения (пока для вконтакте можно не дать только email). Список полученных разрешений можно посмотреть в поле credentials.accessToken.authorizedScopes.

Статус авторизации🔗

Чтобы получить всю информацию о текущем состоянии авторизации, информацию пользователя, статусе авторизации, воспользуйтесь методами:

// The information about the user, identifier, name, email, etc.
MRGSAuthenticationVKontakte.Instance.GetCurrentUser((MRGSAuthenticationUser user, MRGSError error) => {
    Debug.Log("MRGSAuthenticationVKontakte:\User: " + user + "\nError:\n" + error);
    if (error == null) {
        // Work with user data
    }
});

// Information about the token, lifetime, etc.
MRGSAuthenticationVKontakte.Instance.GetAccessToken((MRGSAuthenticationAccessToken token, MRGSError error) => {
    Debug.Log("MRGSAuthenticationVKontakte:\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, и др) и о токене.
[[MRGSAuthenticationVKontakte sharedInstance] getCredentials:^(MRGSAuthenticationCredential *credentials, NSError *error) {
    NSLog(@"Result - %@. Error - %@", credentials, error);
    if(!error){
        // Credentials data work
    }
}];

// Возвращается отдельно информация о пользователе, идентификатор, имя, email, и др.
[[MRGSAuthenticationVKontakte sharedInstance] getCurrentUser:^(MRGSAuthenticationUser *user, NSError *error) {
    NSLog(@"User - %@. Error - %@", user, error);
    if(!error){
        // User data work
    }
}];

// Возвращается отдельно информация о токене, времени жизни и др.
[[MRGSAuthenticationVKontakte 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.utils.optional.BiConsumer;
import games.my.mrgs.authentication.vk.MRGSVK;

// Returns user's information.
MRGSVK.getInstance().getCurrentUser(new MRGSAuthentication.UserCallback() {
    @Override
    public void onSuccess(@NonNull final MRGSUser user) {
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

// Returns authentication's information.
MRGSVK.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);
        }
    }
});

Выход🔗

Для того, чтобы "выйти" из аккаунта пользователя, воспользуйтесь методом:

MRGSAuthenticationVKontakte.Instance.Logout();
[[MRGSAuthenticationVKontakte sharedInstance] logout];
import games.my.mrgs.authentication.vk.MRGSVK;

MRGSVK.getInstance().logout();

Дополнительно🔗

Учтите, что если вы запросили дополнительные разрешения у пользователя на доступ к дополнительным полям его профиля, мы запросим их автоматически, и данные появятся либо в соответствующих полях объекта класса MRGSAuthenticationUser, или в поле optionalParams у этого объекта.

Работа с MRGSAuthenticationSocialNetwork интерфейсом🔗

Протокол для работы с социальными сетями - MRGSAuthenticationSocialNetwork. Он позволяет получать друзей пользователя, его аватарку, делать игровые запросы и приглашения в игру, а также открывать страницу "поделиться".

Получение аватарки🔗

Для получения аватарки пользователя с заданным идентификатором и размером, воспользуйтесь методом:

MRGSAuthenticationVKontakte.Instance.GetAvatar("required_user_id", MRGSAuthenticationPhotoSize.Small, (Texture2D avatar, MRGSError error) => {
    if(error == null){
        // Operation completed sucessfully
    }
});
[[MRGSAuthenticationVKontakte sharedInstance] getAvatarForPlayerWithId: @"required_user_id" size:GKPhotoSizeSmall completionHandler:^(UIImage *image, NSError *error) {
    if(!error){
        // Operation completed successfully, work with data
    }
}];
import android.graphics.Bitmap;

import androidx.annotation.NonNull;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSAvatarCallback;
import games.my.mrgs.authentication.vk.MRGSVK;

// Call #getCurrentUser() to get current user.
final MRGSUser user = ...
// Get user's avatar.
MRGSVK.getInstance().getUserAvatar(user, new MRGSAvatarCallback() {
    @Override
    public void onSuccess(@NonNull Bitmap bitmap) {
        // Handle result.
    }

    @Override
    public void onError(@NonNull MRGSError error) {
        // Handle error.
    }
});

Список друзей и получение пользователей🔗

Для того, чтобы получить список всех друзей текущего пользователя, воспользуйтесь методом:

MRGSAuthenticationVKontakte.Instance.GetFriendsIds((List<string> ids, MRGSError error) => {
    if(error == null){
        // Operation completed sucessfully
    }
});
[[MRGSAuthenticationVKontakte sharedInstance] getFriendsIds:^(NSArray *ids, NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];
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.vk.MRGSVK;

MRGSVK.getInstance().getFriends(new MRGSSocial.FriendsCallback() {
    @Override
    public void onSuccess(@NonNull List<MRGSUser> users) {
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

Важно

Для работы данного метода необходимо разрешение на список друзей (разрешения передаются при вызове метода login).

Для того, чтобы получить объект с описанием пользователя с заданным идентификатором, воспользуйтесь методом:

MRGSAuthenticationVKontakte.Instance.GetUser("required_user_id",(MRGSAuthenticationUser user, MRGSError error) => {
    if(error == null){
        // Operation completed sucessfully
    }
});
[[MRGSAuthenticationVKontakte sharedInstance] getUserWithId:@"required_user_id" completionHandler:^(MRGSAuthenticationUser *user, NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];
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.vk.MRGSVK;

MRGSVK.getInstance().getUserWithId("userId", new MRGSAuthentication.UserCallback() {
    @Override
    public void onSuccess(@NonNull MRGSUser user) {
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

Для того, чтобы получить объекты с описанием пользователей с заданными идентификаторами, воспользуйтесь методом:

MRGSAuthenticationVKontakte.Instance.GetUsers(ids,(List<MRGSAuthenticationUser> users, MRGSError error) => { 
    if(error == null){
        // Operation completed sucessfully
    }
});
[[MRGSAuthenticationVKontakte sharedInstance] getUsersWithIds: @[@"required_user_id_1", @"required_user_id_2"] completionHandler:^(NSArray<MRGSAuthenticationUser*>* users, NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];
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.vk.MRGSVK;

MRGSVK.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) {
    }
});

Создание публикации🔗

Для того, чтобы открыть диалог создания нового поста в ленте текущего пользователя с заданными параметрами, воспользуйтесь методом:

var post = new MRGSAuthenticationPost();
post.Caption = "MRGS Framework - powerful tool for game development.";
post.Link = "http://mrgs.astrum.team";
post.Message = "Check out MRGS site!";
post.LocalImageURL = System.IO.Path.Combine(Application.dataPath.Replace("/Data", ""), "forest.jpg");

MRGSAuthenticationVKontakte.Instance.ShowPostOnWallDialog(post, (MRGSError error) => {
    if(error == null){
        // Operation completed successfully
    }
});
post.caption = @"MRGS Framework - powerful tool for game development.";
post.link = @"http://mrgs.astrum.team";
post.message = @"Check out MRGS site!";
post.image = [UIImage imageNamed:@"MRGSLogo"];

[[MRGSAuthenticationVKontakte sharedInstance] showPostOnWallDialog:post completionHandler:^(NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];
Открытие диалога не поддерживается в VK SDK 2.x, используйте метод postOnWall

Важно

Будет открыт диалог создания нового поста с заполненными данными, указанными в MRGSAuthenticationPost. Для VKontakte в объекте MRGSAuthenticationPost используются все поля: caption, link, message и image.

Отправка приглашений и игровых запросов🔗

Для отправки приглашений в игру и игровых запросов (с помощью них в некоторых случаях можно отправлять "подарки"), а также проверки входящих запросов, предусмотрены методы ниже. Методы принимают объект MRGSAuthenticationInvite, в котором указывается текст приглашения, список пользователей, которых нужно пригласить, и другие параметры запроса (смотрите поля класса MRGSAuthenticationInvite). Пользователю будет показан диалог для подтверждения. В ответе в случае успеха придет объект MRGSAuthenticationInvite с заполненными полями, такими как идентификатор запроса, приглашенные пользователи.

//  Sending invite in game
var inviteIn = new MRGSAuthenticationInvite();
inviteIn.Message = @"Test invite message";
inviteIn.UserIdsToInvite = new List<string>() { "30907315" };

MRGSAuthenticationVKontakte.Instance.SendInvite(inviteIn, (MRGSAuthenticationInvite inviteOut, MRGSError error) => {
    if(error == null){
        // Operation completed successfully
        Debug.Log("Sended invite - " + inviteOut);
    }
});

// Sanding game request
var inviteIn = new MRGSAuthenticationInvite();
inviteIn.Message = @"Test invite message";
inviteIn.UserIdsToInvite = new List<string>() { "30907315" }; 

MRGSAuthenticationVKontakte.Instance.SendGameRequest(inviteIn, (MRGSAuthenticationInvite inviteOut, MRGSError error) => {
    if(error == null){
        // Operation completed successfully
        Debug.Log("Sended game request - " + inviteOut);
    }
});
// Отправка приглашения в игру
MRGSAuthenticationInvite *invite = [[MRGSAuthenticationInvite alloc] init];
invite.message = @"Test invite message";
invite.userIdsToInvite = @[@"30907315"];

[[MRGSAuthenticationVKontakte 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.userIdsToInvite = @[@"30907315"];

[[MRGSAuthenticationVKontakte sharedInstance] sendGameRequest:invite completionHandler:^(MRGSAuthenticationInvite* inviteOut, NSError *error) {
    if(!error){
        // Operation completed successfully
        NSLog(@"Sended request - %@", inviteOut);
    }
}];
import androidx.annotation.NonNull;

import java.util.Collections;
import java.util.List;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSSocial;
import games.my.mrgs.authentication.vk.MRGSVK;

// Send invite request
MRGSVK.getInstance().sendGameRequest("Game Request",
        "Invite message", 
        true,
        Collections.singletonList(friend), 
        new MRGSSocial.GameRequestResultCallback() {
            @Override
            public void onSuccess(@NonNull List<String> users) {
                //users were invited in game
            }

            @Override
            public void onError(@NonNull MRGSError error) {
            }
        });

// Send game request
MRGSVK.getInstance().sendGameRequest("Game Request", 
        "Game request message", 
        false,
        Collections.singletonList(friend),
        new MRGSSocial.GameRequestResultCallback() {
            @Override
            public void onSuccess(@NonNull List<String> users) {
                //users were invited in game
            }

            @Override
            public void onError(@NonNull MRGSError error) {
            }
        });

Важно

Отправка приглашений и игровых запросов доступна только после ревью приложения на стороне вконтакте. Для тестирования работы до ревью, можно отправлять запросы и приглашения только между администраторами приложения.

Также, метод для получения входящих игровых запросов getGameRequests всегда возвращает ошибку, так как в ВКонтакте нет такого API, но метод оставлен для совместимости с интерфейсом MRGSAuthenticationSocialNetwork.

Дополнительные возможности VKontakte🔗

Также, MRGSAuthenticationVKontakte предлагает несколько дополнительных возможностей, исключительно для работы с VKontakte:

Публикация постов без подтверждения🔗

Для публикации поста без подтверждения пользователя на его стене, или стене другого человека, воспользуйтесь методами:

// Post on current user's wall
var post = new MRGSAuthenticationPost();
post.Caption = @"MRGS Framework - powerful tool for game development.";
post.Link = @"http://mrgs.astrum.team";
post.Message = @"Check out MRGS site!";
post.LocalImageURL = System.IO.Path.Combine(Application.dataPath.Replace("/Data", ""), "forest.jpg");

MRGSAuthenticationVKontakte.Instance.SendPostOnWall(post, (MRGSError error) => {
    if(error == null){
        // Operation completed successfully
    }
});

// Posting on another user's wall
var post = new MRGSAuthenticationPost();
post.Caption = @"MRGS Framework - powerful tool for game development.";
post.Link = @"http://mrgs.astrum.team";
post.Message = @"Check out MRGS site!";
post.LocalImageURL = System.IO.Path.Combine(Application.dataPath.Replace("/Data", ""), "forest.jpg");

MRGSAuthenticationVKontakte.Instance.SendPostOnWall(post, "dest_user_id", (MRGSError error) => {
    if(error == null){
        // Operation completed successfully
    }
});
// Публикация на стене текущего пользователя
MRGSAuthenticationPost *post = [[MRGSAuthenticationPost alloc] init];
post.caption = @"MRGS Framework - powerful tool for game development.";
post.link = @"http://mrgs.astrum.team";
post.message = @"Check out MRGS site!";
post.image = [UIImage imageNamed:@"MRGSLogo"];

[[MRGSAuthenticationVKontakte sharedInstance] sendPostOnWall:post completionHandler:^(NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];

// Публикация на стене другого пользователя
MRGSAuthenticationPost *post = [[MRGSAuthenticationPost alloc] init];
post.caption = @"MRGS Framework - powerful tool for game development.";
post.link = @"http://mrgs.astrum.team";
post.message = @"Check out MRGS site!";
post.image = [UIImage imageNamed:@"MRGSLogo"];

[[MRGSAuthenticationVKontakte sharedInstance] sendPostOnWall:post toUserWithId:@"345031059" completionHandler:^(NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];
import androidx.annotation.NonNull;

import java.util.Arrays;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.vk.MRGSVK;
import games.my.mrgs.authentication.vk.MRGSVK.MRGSVKPostOnWall;

final MRGSVKPostOnWall post = new MRGSVKPostOnWall();
// You can set current vk user id or id or another vk user 
post.setUserId("userId to send");
post.setMessage("Text message");
post.setPhotoUris(Arrays.asList("file:///", "https://"));
// Publish only for friends
post.setFriendsOnly(onlyForFriends);

MRGSVK.getInstance().postOnWall(post, new MRGSVK.MRGSPostOnWallCallback() {
    @Override
    public void onSuccess(int postId) {
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

Важно

Требуется разрешение на публикацию постов (Wall), а если вы хотите прикрепить фотографии, то и разрешение доступа к фотографиям (photos)

Расширенное получение списка друзей🔗

Для получения списка друзей, установивших ваше приложение, списка друзей, которым можно отправить приглашение на установку приложения (то есть не установивших его), и списка друзей, которым можно отправить игровой запрос (то есть установивших приложение, но путь к API другой, и не требует разрешение на доступ к списку друзей), предусмотрены методы:

// Get a list of friends who installed your application
MRGSAuthenticationVKontakte.Instance.GetInAppFriendsIds((List<string> ids, MRGSError error) => {
    if(error == null){
        // Operation completed successfully
    }
});

// Getting a list of friends to whom you can send an invitation to install the application (that is, those who did not install it)
MRGSAuthenticationVKontakte.Instance.GetFriendsIdsAvailableForInvite((List<string> ids, MRGSError error) => {
    if(error == null){
        // Operation completed successfully
    }
});

// Getting a list of friends to whom you can send a game request (that is, who installed the application)
MRGSAuthenticationVKontakte.Instance.GetFriendsIdsAvailableForGameRequest((List<string> ids, MRGSError error) => {
    if(error == null){
        // Operation completed successfully
    }
});
// Получения списка друзей, установивших Ваше приложение
[[MRGSAuthenticationVKontakte sharedInstance] getInAppFriendsIds:^(NSArray *ids, NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];

// Получение списка друзей, которым можно отправить приглашение на установку приложения (то есть не установивших его)
[[MRGSAuthenticationVKontakte sharedInstance] getFriendsIdsAvailableForInvite:^(NSArray *ids, NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];

// Получение списка друзей, которым можно отправить игровой запрос (то есть установивших приложение)
[[MRGSAuthenticationVKontakte sharedInstance] getFriendsIdsAvailableForGameRequest:^(NSArray *ids, NSError *error) {
    if(!error){
        // Operation completed successfully
    }
}];
import androidx.annotation.NonNull;

import java.util.List;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.vk.MRGSVK;
import games.my.mrgs.authentication.vk.MRGSVK.MRGSUserIdsCallback;

// Getting a list of friends to whom you can send an invitation to install the application (that is, those who have not installed it)
MRGSVK.getInstance().getFriendsForInvite(new MRGSUserIdsCallback() {
    @Override
    public void onSuccess(@NonNull List<Integer> userIds) {
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

// Getting a list of friends to whom you can send a game request (that is, those who have installed the application)
MRGSVK.getInstance().getFriendsForGameRequest(new MRGSUserIdsCallback() {
    @Override
    public void onSuccess(@NonNull List<Integer> userIds) {
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

Важно

Для метода getInAppFriendsIds требуется разрешение на просмотр друзей (Friends). Для остальных двух методов данное разрешение не требуется.

Работа с группами пользователя🔗

Для работы с группами пользователя предусмотрены методы:

// Join group
MRGSAuthenticationVKontakte.Instance.JoinGroup("29370987", (MRGSError error) => {
    if(error == null){
        // Operation completed sucessfully
    }
});

// Leave group
MRGSAuthenticationVKontakte.Instance.LeaveGroup("29370987", (MRGSError error) => {
    if(error == null){
        // Operation completed sucessfully
    }
});

// Checking if user member of a group
MRGSAuthenticationVKontakte.Instance.IsGroupMember("29370987", (bool isMember, MRGSError error) => {
    if(error == null){
        // Operation completed sucessfully
        if(isMember == true){
            // Group member
        }else{
            // Not group member
        }
    }
});
// Вступление пользователя в группу
[[MRGSAuthenticationVKontakte sharedInstance] joinGroup:@"29370987" completionHandler:^(NSError *error) {
    if(!error){
        // Operation completed sucessfully
    }
}];

// Выход из группы
[[MRGSAuthenticationVKontakte sharedInstance] leaveGroup:@"29370987" completionHandler:^(NSError *error) {
    if(!error){
        // Operation completed sucessfully
    }
}];

// Проверка на вхождение в группу
[[MRGSAuthenticationVKontakte sharedInstance] isGroupMember:@"29370987" completionHandler:^(BOOL isMember, NSError *error) {
    if(!error){
        // Operation completed sucessfully
        if(isMember == true){
            // Group member
        }else{
            // Not group member
        }
    }
}];
import androidx.annotation.NonNull;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.vk.MRGSVK;
import games.my.mrgs.authentication.vk.MRGSVK.MRGSGroupCallback;

// Join the group
MRGSVK.getInstance().joinGroup("groupId", new MRGSGroupCallback() {
    @Override
    public void onSuccess(boolean status) {
        //success if status == true
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

// Leave the group
MRGSVK.getInstance().leaveGroup("groupId", new MRGSGroupCallback() {
    @Override
    public void onSuccess(boolean status) {
        //success if status == true
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

// Check if the user is the member of this group
MRGSVK.getInstance().isGroupMember("groupId", new MRGSGroupCallback() {
    @Override
    public void onSuccess(boolean status) {
        //success if status == true
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

Важно

Для данных методов требуется разрешение на работу с группами (Groups). Никаких диалогов пользователю показано не будет.


Последнее обновление: 2025-01-21
Дата создания: 2020-05-28