Інтеграція Unity з Facebook: авторизація та шаринг новин

Інтеграція Unity з Facebook. Авторизація та шаринг новин

Ну цього разу ми точно писатимемо код. Хто хоче додати віральності своїй грі за допомогою Facebook — ласкаво просимо під кат. Друга частина серії про те, як інтегрувати Unity з Facebook, присвячена саме цьому.

План:

  1. Знайомство та інтеграція Unity з Facebook SDK
  2. Авторизація та шаринг новин в приват і на стіну (читаєте зараз)

Дисклеймер. Як і решта статей мого авторства, ця публікація може містити неоптимальні реалізації, костилі, велосипеди та інші інженерні дива. Ви знаєте, що робити — кидатись брудними шкарпетками, кислими помідорами та фіксами з порадами в коментарях ;)

Хоча залежно від проекту, основні кроки можуть дещо відрізнятися, інтеграція Unity з Facebook найкраще описана саме у головному туторіалі Facebook. Тому я знову ж таки рекомендую спершу заглянути туди. Я припускаю, що ви вже інтегрували Facebook SDK в свій проект (якщо ні — швиденько качаєм, я поки тут зачекаю), і нам залишилося всього нічого :)

Оу, ледь не забув. Для чого ми це робимо? Все просто. Соціальна складова — надзвичайно потужний фактор, який у разі правильно використання може забезпечити суттєвий приріст у кількості користувачів. Ми ж хочемо, щоб у нашу гру грали.

Treasure Pop Bubble Shooter and City Jumper — Level complete

Інтеграція логіки шарингу

Існує декілька підходів до інтеграції логіки шарингу в ігровий процес. Зазвичай користувачу дають таку можливість по завершенню рівня чи якоїсь логічної частини гри, де юзер може оцінити власний пройдений шлях та за бажання поділитися зі своїми друзями (згадайте, скільки постів в соцмережах з’являється після здачі сесії або отримання дипломів).

У цьому випадку геймдизайнер грає на почуттях гравця, який вже й сам би не проти поділитись тим, що «наболіло». Окрім того, мотивувавши гравця подвоєнням зароблених грошей/кілець/грибів/етц, можна досягнути одного… ну двох, максимум трьох репостів.

Інший варіант змусити гравця зробити репост — дати йому за це гроші. Не реальні (ні, ну можете й кешу, але тоді вам варто переглянути вашу модель монетизації :), а внутрішньої валюти. А встановивши ліміт на кількість таких репостів можна отримати постійний потік постів, not so bad, right?

Treasure Pop Bubble Shooter and City Jumper — Share with friends and get coins

Ініціалізація SDK

До того, як репостити, потрібно ініціалізувати SDK. Для цього в Awake() методі компонента об’єкту вашої сплеш-сцени (або іншого базового компоненту, що реалізує MonoBehaviour) робимо наступне:

void Awake ()
{
    if (!FB.IsInitialized) {
        // Initialize the Facebook SDK
        FB.Init(InitCallback, OnHideUnity);
    } else {
        // Already initialized, signal an app activation App Event
        FB.ActivateApp();
    }
}
private void InitCallback ()
{
    if (FB.IsInitialized) {
        // Signal an app activation App Event
        FB.ActivateApp();
        // Continue with Facebook SDK
        // ...
    } else {
        Debug.Log("Failed to Initialize the Facebook SDK");
    }
}
 
private void OnHideUnity (bool isGameShown)
{
    if (!isGameShown) {
        // Pause the game - we will need to hide
        Time.timeScale = 0;
    } else {
        // Resume the game - we're getting focus again
        Time.timeScale = 1;
    }
}

Чудово. А ось тепер в нас є вибір, і ми можемо писати що захочемо.

Додавання можливості робити репости

Припустимо, ви таки хочете додати чудесну можливість робити репости з вашого додатку. Це можна реалізувати двома способами. Розглянемо їх по черзі.

FB.ShareLink();
 
 FB.ShareLink(
                new Uri("https://developers.facebook.com/"),
                callback: ShareCallback);

Цей спосіб рекомендується Фейсбуком для шарингу посилань на сайти. Відповідно назву, опис, картинку — все це підтягує Фейсбук самотужки, і вам не треба ні про що хвилюватися.

Другий спосіб:

FB.FeedShare()
 
FB.FeedShare(
            toId: "",
            link: new Uri("https://developers.facebook.com/"),
            callback: ShareCallback);

Цей метод, як і попередній, дозволяє поширювати посилання, проте володіє трішки більшим функціоналом, хоч хлопці з фб й радять використовувати по замовчуванню FB.ShareLink(). Чим він відрізняється від попереднього?

  1. З ним вам не обов’язково постити саме лінк кудись, а можна просто зашарити певну картинку з тайтлом та дискріпшином.
  2. У нього є параметр to, який визначає, на якій сторінці з’явиться публікація: на чужій чи на вашій власній.

Окрім того, обидва приймають останнім параметром колбек, що опрацьовуватиме результати роботи шарингу новин:

private void ShareCallback (IShareResult result) {
    if (result.Cancelled || !String.IsNullOrEmpty(result.Error)) {
        Debug.Log("ShareLink Error: "+result.Error);
    } else if (!String.IsNullOrEmpty(result.PostId)) {
        // Print post identifier of the shared content
        Debug.Log(result.PostId);
    } else {
        // Share succeeded without postID
        Debug.Log("ShareLink success!");
    }
}

Варто зазначити, що для використання даної фічі вам НЕ потрібно змушувати користувача логінитись.

Якщо ж ви маєте бажання «завлечь бедную жертву в свои сети» — нижче я навожу метод авторизації. Існує 2 типи авторизації: «для читання» та «для писання».

Для читання:

 public void LoginWithReadPermission()
    {
        var perms = new List<string>() { "public_profile", "email", "user_friends" };
        FB.LogInWithReadPermissions(perms, AuthCallback);
    }

Для публікацій:

public void LoginWithPublishPermission()
    {
        var perms = new List<string>() { "publish_actions" };
        FB.LogInWithPublishPermissions(perms, AuthCallback);
    }

Коллбек для опрацювання результатів авторизації:

  private void AuthCallback(ILoginResult result)
    {
        if (FB.IsLoggedIn)
        {
            // AccessToken class will have session details
            var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;
            // Print current access token's User ID
            Debug.Log(aToken.UserId);
            // Print current access token's granted permissions
            foreach (string perm in aToken.Permissions)
            {
                Debug.Log(perm);
            }
        }
        else
        {
            Debug.Log("User cancelled login");
        }
    }

У разі авторизації з правами публікації користувач спочатку побачить вікно звичайної авторизації, а далі вікно з запитом на дозвіл постити на стіну або відсилати приватні повідомлення друзям.

Treasure Pop Bubble Shooter — Getting permissions

Таким чином, навіть викликаючи метод LogInWithPublishPermissions(), можна отримати авторизованого користувача без права публікації (він міг відмовитись під час авторизації або пізніше вимкнути даний дозвіл в налаштуваннях фейсбуку). В цьому випадку можна отримати всі надані пермішени в наступній колекції:

foreach(string perm in AccessToken.CurrentAccessToken.Permissions) {
    // log each granted permission
    Debug.Log(perm);}

Тоді виникає справедливе запитання: а навіщо ж, власне, потрібен той логін? Окрім очевидної відповіді про аватар користувача, його мейл, список друзів і т.д., залогінившись withPublishPremissions, ми зможемо писати на стіні користувача одразу з додатку (можливо навіть пропустити етап підтвердження опублікування новини користувачем, якщо він дав на те дозвіл).

Саме таким чином з’являються написи про проходження чергового рівня в Candy Crush у вашій стрічці новин — але це вже тема окремої статті.

І за старою й доброю традицією — коментуємо, кажемо, що так, що ні, і ділимося досвідом ;)

“So long and thanks for all the fish”

Потрібен MVP, розробка під iOS, Android або прототип додатка? Ознайомтеся з нашим портфоліо і зробіть замовлення вже сьогодні!