Как подключить мобильный SDK к игре на Unity

Обновлено: 9 октября 2026 · 8 мин чтения

Пакет Unity является мостом C# к нативным SDK для Android и iOS, экраны нативные. В редакторе и на других платформах вызовы ничего не делают: SDK работает только в сборках Android и iOS.

Шаги

  1. 1

    Требования

    • Unity 2021.3 или новее, Unity 6 тоже работает.
    • Android: Minimum API Level 23, compileSdk 35 или новее. iOS: Target minimum iOS Version 15.0, Xcode 15.
    • External Dependency Manager for Unity (EDM4U): он приносит нативные SDK.
    • App ID и оба ключа API (android_…, ios_…).
    • Голосовым сообщениям (с SDK 1.0.2) нужно RECORD_AUDIO в манифесте Android-приложения, иначе кнопка микрофона не показывается. Камере разрешение не нужно.
  2. 2

    Установка

    1. Установите EDM4U.
    2. Window › Package Manager › + › Add package from git URL (в Unity 6 «Install package from git URL») и введите:
    https://github.com/clomni/clomni-mobile-sdk.git?path=unity#unity-1.0.5
    1. Android: Project Settings › Player › Android › Minimum API Level 23 или выше. EDM4U › Android Resolver › Settings: «Use Gradle» и «Patch mainTemplate.gradle» включены (EDM4U 1.2.183 или новее).
    2. iOS: Project Settings › Player › iOS › Target minimum iOS Version 15.0. После сборки открывайте .xcworkspace, а не .xcodeproj. Если Xcode спрашивает версию Swift, укажите SWIFT_VERSION = 5.0 у цели UnityFramework.

    EDM4U пишет в Podfile сборки iOS pod 'ClomniMessenger', '1.0.4'. Такая форма ищет pod в CocoaPods trunk, где SDK не опубликован. После каждой сборки iOS замените эту строку в Podfile папки сборки и выполните там pod install:

    pod 'ClomniMessenger', :git => 'https://github.com/clomni/clomni-mobile-sdk.git', :tag => '1.0.4'

    Чтобы быстро попробовать: Package Manager › Clomni Messenger › Samples › Basic › Import. Добавьте ClomniBasicSample на пустой GameObject, введите App ID и ключи в Inspector и соберите на устройство.

  3. 3

    Запустите SDK

    using ClomniMessenger;
    using UnityEngine;
    
    public static class ClomniSetup
    {
        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
        private static void Initialize()
        {
            var apiKey = Application.platform == RuntimePlatform.IPhonePlayer ? "ios_…" : "android_…";
            Clomni.Initialize("app_…", apiKey);
            if (Debug.isDebugBuild) Clomni.SetLogLevel(ClomniLogLevel.Debug);
        }
    }

    Вызывайте Clomni из главного треда Unity (main thread), события приходят туда же.

  4. 4

    Пользователь и Messenger

    Clomni.LoginUser(new ClomniUser { UserId = "12345", Email = "[email protected]", Name = "Aysel" }, hashFromYourServer);
    Clomni.UpdateUser(language: "az", customAttributes: new Dictionary<string, object> { ["plan"] = "premium" });
    
    // Together with the game's own logout:
    Clomni.Logout();

    Хеш приходит с сервера Вашей игры. Никогда не кладите Identity Secret в игру: ни в код C#, ни в ассеты, ни в PlayerPrefs.

    using ClomniMessenger;
    using UnityEngine;
    using UnityEngine.UI;
    
    public sealed class SupportButton : MonoBehaviour
    {
        [SerializeField] private Button button;
        [SerializeField] private Text badge;
    
        private void OnEnable()
        {
            button.onClick.AddListener(Open);
            Clomni.UnreadCountChanged += ShowUnread;
        }
    
        private void OnDisable()
        {
            button.onClick.RemoveListener(Open);
            Clomni.UnreadCountChanged -= ShowUnread;
        }
    
        private void Open() => Clomni.Present("settings_support");
    
        private void ShowUnread(int count) => badge.text = count > 0 ? count.ToString() : "";
    }

    Другие вызовы: PresentNewConversation(source), PresentConversation(id), Dismiss(), SetLauncherVisible(true), SetBottomPadding(72), StartFlow(...). События: MessengerOpened, MessengerClosed, ConversationStarted, FlowCompleted, OnLink.

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

  5. 5

    Push: Android

    Сначала загрузите ключи в панель (статья «Ключи push для мобильного SDK»). Используйте Firebase Unity SDK (Firebase Messaging) и положите google-services.json в Assets/. Пример пакета «Push (Firebase)» передаёт токен и сообщения в Clomni:

    using ClomniMessenger;
    using Firebase.Messaging;
    using UnityEngine;
    
    public sealed class ClomniFirebaseBridge : MonoBehaviour
    {
        private void Start()
        {
            FirebaseMessaging.TokenReceived += OnTokenReceived;
            FirebaseMessaging.MessageReceived += OnMessageReceived;
        }
    
        private void OnDestroy()
        {
            FirebaseMessaging.TokenReceived -= OnTokenReceived;
            FirebaseMessaging.MessageReceived -= OnMessageReceived;
        }
    
        private void OnTokenReceived(object sender, TokenReceivedEventArgs e)
        {
            if (Application.platform == RuntimePlatform.Android) Clomni.SetDeviceToken(e.Token);
        }
    
        private void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            if (Application.platform != RuntimePlatform.Android) return;
            if (Clomni.HandlePush(e.Message.Data)) return;
            // the game's own push
        }
    }
    • Android 13+: UnityEngine.Android.Permission.RequestUserPermission("android.permission.POST_NOTIFICATIONS").
    • Иконка уведомления является drawable в папке .androidlib, например Assets/Plugins/Android/ClomniRes.androidlib/res/drawable/ic_notification.png, имя передаётся через Clomni.SetNotificationIcon("ic_notification").

    Firebase Unity доставляет сообщение в C# только пока игра работает. Чтобы уведомление появлялось и при закрытой игре, передайте сообщение SDK в Java до запуска Unity:

    // Assets/Plugins/Android/ClomniListenerService.java
    package com.example.game;
    
    import ai.clomni.messenger.ClomniPush;
    import com.google.firebase.messaging.RemoteMessage;
    import com.google.firebase.messaging.cpp.ListenerService;
    
    public class ClomniListenerService extends ListenerService {
        @Override
        public void onMessageReceived(RemoteMessage message) {
            if (ClomniPush.handle(this, message.getData())) return;
            super.onMessageReceived(message);
        }
    }
    <!-- Assets/Plugins/Android/AndroidManifest.xml, inside <application>.
         The <manifest> element needs xmlns:tools="http://schemas.android.com/tools". -->
    <service android:name="com.google.firebase.messaging.cpp.ListenerService" tools:node="remove" />
    <service android:name="com.example.game.ClomniListenerService" android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    Проверьте в объединённом манифесте сборки, что MESSAGING_EVENT получает только ClomniListenerService.

  6. 6

    Push: iOS

    Clomni ожидает токен устройства APNs в hex, а не токен FCM. Используйте пакет Unity Mobile Notifications (com.unity.mobile.notifications). В Project Settings › Mobile Notifications › iOS включите «Enable Push Notifications», он добавит capability в проект Xcode.

    using System.Collections;
    using ClomniMessenger;
    using UnityEngine;
    #if UNITY_IOS
    using Unity.Notifications.iOS;
    #endif
    
    public sealed class ClomniIosPush : MonoBehaviour
    {
    #if UNITY_IOS
        private string handled;
    
        private IEnumerator Start()
        {
            var options = AuthorizationOption.Alert | AuthorizationOption.Badge | AuthorizationOption.Sound;
            using (var request = new AuthorizationRequest(options, true))
            {
                while (!request.IsFinished) yield return null;
                if (request.Granted && !string.IsNullOrEmpty(request.DeviceToken))
                {
                    Clomni.SetDeviceToken(request.DeviceToken);
                }
            }
        }
    
        // A tap brings the game to the front: a Clomni push opens its conversation.
        private void OnApplicationFocus(bool focused)
        {
            if (!focused) return;
            var tapped = iOSNotificationCenter.GetLastRespondedNotification();
            if (tapped == null || tapped.Identifier == handled) return;
            handled = tapped.Identifier;
            Clomni.HandlePush(tapped.UserInfo);
        }
    #endif
    }

    Clomni.ShouldShowForeground(data) говорит, показывать ли push, пришедший при открытой игре: для push Clomni при открытом Messenger это false.

  7. 7

    Проблемы

    • В редакторе ничего не происходит: так и должно быть, проверяйте на устройстве.
    • Сборка Android не находит ai.clomni:messenger: Assets › External Dependency Manager › Android Resolver › Force Resolve, «Use Gradle» включён.
    • pod install не находит ClomniMessenger: замените строку в Podfile папки сборки на форму :git.
    • Xcode не находит модуль ClomniMessenger: откройте .xcworkspace.
    • На Android уведомления приходят только при открытой игре: нужен Java-сервис выше.
  8. 8

    Полное руководство

Документ