Интеграция с помощью LLM (ИИ) — Используйте следующий запрос:
Добавьте Tenjin SDK в мой проект с помощью: https://raw.githubusercontent.com/tenjin/sdk-llm-guides/main/guides/unity/llm-guide.md
Резюме #
В приведенной ниже документации описывается SDK Unity для Tenjin. Чтобы узнать больше о Tenjin и наших продуктах, посетите сайт https://www.tenjin.com.
- Ознакомьтесь с нашими Примечаниями к выпуску, чтобы увидеть подробную историю изменений в разных версиях.
- Tenjin Unity SDK поддерживает как iOS, так и Android.
- Ознакомьтесь с документацией по iOS и Android и примените соответствующие настройки платформы к вашим сборкам. (iOS, Android)
- По всем вопросам и за поддержкой обращайтесь по адресу: support@tenjin.com.
Если вы используете Unity SDK версии 1.12.29 или ниже, пожалуйста, следуйте инструкциям по ссылке этим инструкциям перед завершением интеграции SDK.
Чтобы обновиться до версии 1.12.30 или выше с более ранних версий, перед установкой последней версии Unity обязательно удалите бинарные файлы Tenjin.
Если при компиляции в iOS вы получаете следующую ошибку: Библиотека не загружена: @rpath/TenjinSDK.framework/TenjinSDK, вам необходимо перейти в раздел “Frameworks, Libraries and Embedded Content” и добавить TenjinSDK, а затем выбрать ‘Embed & Sign’
Если у вас есть libTenjinSDK.a и/или libTenjinSDKUniversal.a из более старых версий Tenjin SDK, пожалуйста, удалите их и выполните команду pod Install, чтобы интегрировать его в iOS
Менеджер пакетов Unity (UPM) #
Чтобы установить пакет UPM по URL-адресу Git:
- Откройте окно «Диспетчер пакетов», если оно ещё не открыто.
- Откройте меню «Добавить» (+) на панели инструментов диспетчера пакетов.
- В меню «Установка» выберите Установить пакет по URL-адресу Git. Появятся текстовое поле и кнопка «Установить».
- Введите в текстовое поле следующий действительный URL-адрес Git (необходимо добавить
#, а затем тег версии):https://github.com/tenjin/tenjin-unity-sdk.git#1.16.5 - Нажмите Установить.
Установка вручную (.unitypackage) #
- Скачайте последнюю версию Unity SDK здесь.
- Импортируйте
TenjinUnityPackage.unitypackageв свой проект:«Assets» → «Import Package».
Важное примечание для Android #
Чтобы обеспечить бесперебойную работу Tenjin с новейшими функциями и исправлениями, пожалуйста, убедитесь, что ваши зависимости Maven (Gradle) обновлены до последней версии, так как мы распространяем наш SDK Tenjin Android через Maven. Мы заметили, что некоторые разработчики по-прежнему используют устаревшие версии, что может привести к возникновению проблем.
Если вы выполняете сборку с помощью Android Studio, не забудьте запустить команду «Gradle sync» для обновления зависимостей.
Если вы не используете Android Studio, обновите зависимости в Unity, выполнив следующие действия:
- Запустите Unity.
- Перейдите в раздел «Ресурсы» > «Менеджер внешних зависимостей» > «Android Resolver».
- Выберите «Force Resolve», чтобы обновить зависимости Gradle до последних версий.
Google Play #
По умолчанию в качестве магазина приложений используется unspecified. Измените значение магазина приложений на googleplay, если вы распространяете своё приложение в Google Play Store.
Укажите значение параметра «Тип App Store» как googleplay:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.googleplay);Tenjin SDK требует следующих разрешений:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Required to get network connectivity (i.e. wifi vs. mobile) -->Google Play Services требует, чтобы все приложения уровня API 32 (Android 13), использующие advertising_id (Android Advertising ID (AAID)), объявляли в своём файле манифеста разрешение AD_ID для Google Play Services (приведено ниже). Для использования приведенного ниже разрешения необходимо обновить tenjin-android-sdk до версии 1.12.8.
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>Рекламный идентификатор Android (AAID) и реферер установки #
Добавьте Android Advertising ID (AAID) и Install Referrer, добавьте их в файл build.gradle.
dependencies {
implementation 'com.google.android.gms:play-services-ads-identifier:{version}'
implementation 'com.android.installreferrer:installreferrer:{version}'
}Чтобы иметь возможность собирать данные о реферере установки Meta, добавьте следующие запросы в свой манифест Android:
<queries>
<package android:name="com.facebook.katana" />
</queries>
<queries>
<package android:name="com.instagram.android" />
</queries>Далее добавьте следующее в файл strings.xml (вы можете создать этот шаблон файла для хранения строк на основе это руководство):
<string name="facebook_app_id" translatable="false">YOUR_META_APP_ID</string>Магазин Amazon #
По умолчанию в качестве магазина приложений используется не указан. Измените значение магазина приложений на amazon, если вы распространяете своё приложение в магазине Amazon.
Укажите значение параметра «Тип App Store» как amazon:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.amazon);OAID и другие магазины приложений Android #
Tenjin поддерживает продвижение вашего приложения в других магазинах приложений Android с использованием Android OAID. К интеграции библиотек OAID предъявляются следующие требования. Если вы планируете выпустить своё приложение за пределами Google Play, обязательно внедрите эти библиотеки OAID.
MSA OAID #
MSA OAID — это рекламный идентификатор для устройств, произведенных в Китае, который предоставляется организацией MSA (Mobile Security Alliance). Для интеграции с библиотекой MSA загрузите следующий файл oaid\_sdk\_1.0.25.aar.
Поместите файл oaid_sdk_1.0.25.aar в каталог Android libs вашего проекта: /Assets/Plugins/Android
Укажите значение параметра «Тип App Store» как other:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.other);Huawei OAID #
Для стран за пределами Китая вы можете получить OAID с помощью библиотеки, предоставленной компанией Huawei. Для интеграции с библиотекой Huawei OAID скачайте следующий файл AAR от Huawei: huawei-ads-identifier.aar. Если ваше приложение находится в Huawei App Gallery, скачайте и добавьте файл Huawei Install Referrer: huawei-ads-installreferrer.aar.
Поместите файлы Huawei в каталог libs вашего проекта Android: /Assets/Plugins/Android
Укажите значение параметра «Тип App Store» как other:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.other);Настройки Proguard #
-keep class com.tenjin.** { *; }
-keep public class com.google.android.gms.ads.identifier.** { *; }
-keep public class com.google.android.gms.common.** { *; }
-keep public class com.android.installreferrer.** { *; }
-keep class * extends java.util.ListResourceBundle {
protected java.lang.Object[][] getContents();
}
-keepattributes *Annotation*Если вы используете библиотеки Huawei, вы можете воспользоваться следующими настройками:
-keep class com.huawei.hms.ads.** { *; }
-keep interface com.huawei.hms.ads.** { *; }Инициализация приложения #
- Получите свой
SDK_KEYна странице вашего приложения. Примечание:SDK_KEYявляется уникальным для каждого вашего приложения. Для одного и того же приложения можно создать до 3 ключей.

- В первом методе
Start()вашего проекта добавьте следующую строку кода. Также добавьте в методOnApplicationPause(), если хотите отправлять данные сессии, когда пользователь возобновляет работу с приложением из фонового режима.
using UnityEngine;
using System.Collections;
public class TenjinExampleScript : MonoBehaviour {
void Start() {
TenjinConnect();
}
void OnApplicationPause(bool pauseStatus) {
if (!pauseStatus) {
TenjinConnect();
}
}
public void TenjinConnect() {
BaseTenjin instance = Tenjin.getInstance(" ");
// Sends Install/open event to Tenjin
instance.Connect();
}
}ПРИМЕЧАНИЕ: Обязательно внедрите этот код в каждый вызов Start() и OnApplicationPause(), а не только при первом запуске приложения.
App Store #
Мы поддерживаем три варианта магазинов приложений:,
- googleplay
- amazon
- другие
По умолчанию не указан является магазином приложений по умолчанию. Если вы публикуете приложение в конкретном магазине приложений, измените значение параметра «app store» на соответствующее значение. Значение параметра «app store» другой используется для Huawei AppGallery и других магазинов приложений:
AndroidManifest.xml:
<meta-data
android:name="TENJIN_APP_STORE"
android:value="{{SET_APP_STORE_TYPE_VALUE}}" />SetAppStoreType():
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.{{SET_APP_STORE_TYPE_VALUE}});ATTrackingManager (iOS) #
- Начиная с версии iOS 14, у вас появилась возможность отображать начальный запрос на предоставление прав доступа к ATTrackingManager и предлагать пользователям выбрать, согласны ли они на отслеживание или нет.
- Если устройство не предоставит разрешение на отслеживание, значение IDFA станет равным нулю. Если устройство предоставит разрешение на отслеживание, метод
Connect()отправит IDFA на наши серверы. - Кроме того, вы по-прежнему можете вызывать функцию Tenjin
connect()без использования ATTrackingManager. Вы можете не внедрять ATT, если не планируете получать доступ к IDFA каких-либо пользователей или передавать его в Tenjin.
using UnityEngine;
using System.Collections;
using UnityEngine.iOS;
public class TenjinExampleScript : MonoBehaviour {
void Start() {
TenjinConnect();
}
void OnApplicationPause(bool pauseStatus) {
if (!pauseStatus) {
TenjinConnect();
}
}
public void TenjinConnect() {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
#if UNITY_IOS
if (new Version(Device.systemVersion).CompareTo(new Version("14.0")) >= 0) {
// Tenjin wrapper for requestTrackingAuthorization
instance.RequestTrackingAuthorizationWithCompletionHandler((status) => {
Debug.Log("===> App Tracking Transparency Authorization Status: " + status);
// Sends Install/open event to Tenjin
instance.Connect();
});
}
else {
instance.Connect();
}
#elif UNITY_ANDROID
// Sends Install/open event to Tenjin
instance.Connect();
#endif
}
}Отображение запроса на предоставление разрешения ATT #
Чтобы соблюсти требования Apple к ATT, необходимо предоставить описание для запроса разрешения ATT, а затем реализовать запрос разрешения в вашем приложении.
> Примечание: перед тем как начать показывать рекламу в игре, необходимо реализовать запрос на разрешение.
Настройка описания отслеживания пользователей #
Apple требует указать описание для запроса на разрешение ATT. Вам необходимо задать описание с помощью ключа NSUserTrackingUsageDescription в файле Info.plist вашего проекта Xcode. Вы должны предоставить сообщение, информирующее пользователя о том, почему вы запрашиваете разрешение на использование данных отслеживания устройства:
- В панели навигации проекта Xcode откройте файл
Info.plist. - Нажмите кнопку «Добавить» (+) рядом с любым ключом в редакторе списка свойств, чтобы создать новый ключ свойства.
- Введите имя ключа
NSUserTrackingUsageDescription. - Выберите тип значения «строка».
- Введите в поле «Значение» сообщение о прозрачности отслеживания приложений. Вот несколько примеров:
- “Мы будем использовать ваши данные для того, чтобы обеспечить более качественную и персонализированную рекламу”.”
- “Мы стараемся показывать вам рекламу приложений и товаров, которые могут вас заинтересовать, исходя из того, какими приложениями вы пользуетесь, на каком устройстве вы находитесь и в какой стране проживаете”.”
- “Мы стараемся показывать вам рекламу приложений и товаров, которые могут вас заинтересовать, исходя из того, какими приложениями вы пользуетесь”.”
> Примечание: компания Apple предоставляет специальные рекомендации для App Store, в которых определены допустимые способы использования и формулировки для всех функций, связанных с конфиденциальностью и предназначенных для конечных пользователей. Tenjin не предоставляет юридических консультаций. Поэтому информация, представленная на этой странице, не заменяет консультации с вашим собственным юрисконсультом для определения правовых требований, применимых к вашему бизнесу и процессам, а также способов их соблюдения.
SKAdNetwork и показатели конверсии #
В рамках SKAdNetwork мы создали метод-обёртку для updatePostbackConversionValue(_:). Наш метод будет регистрировать соответствующие методы SKAdNetwork, а также отправлять значения конверсий на наши серверы.
updatePostbackConversionValue(_:) 6-битное значение должно соответствовать событию в приложении и должно вводиться не в виде двоичного кода, а в виде целого числа от 0 до 63. Наш сервер отклонит любые недопустимые значения.
Начиная с версии iOS 16.1, поддерживающей SKAdNetwork 4.0, теперь можно передавать coarseValue (строка, возможные значения: “low”, “medium” или “high”) и lockWindow (логическое значение) в качестве параметров метода обратной связи обновления:
updatePostbackConversionValue(conversionValue: Integer, coarseValue: String)
updatePostbackConversionValue(conversionValue: Integer, coarseValue: String, lockWindow: Bool)
- В версии iOS 16.1 и выше, поддерживающей SKAdNetwork 4.0, вы можете вызывать этот метод столько раз, сколько захотите, и устанавливать значение Conversion ниже или выше предыдущего значения.
- Для версий iOS ниже 16.1, поддерживающих версии SKAdNetwork ниже 4.0, вы можете вызвать этот метод, и наш SDK автоматически определит версию iOS и обновит только
conversionValue.
using UnityEngine;
using System.Collections;
public class TenjinExampleScript : MonoBehaviour {
void Start() {
TenjinConnect();
}
void OnApplicationPause(bool pauseStatus) {
if (!pauseStatus) {
TenjinConnect();
}
}
public void TenjinConnect() {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
#if UNITY_IOS
// Sends Install/open event to Tenjin
instance.Connect();
// Sets SKAdNetwork Conversion Value
// You will need to use a value between 0-63
instance.updatePostbackConversionValue(<Integer between 0 and 63>);
// For iOS 16.1+ (SKAN 4.0)
instance.updatePostbackConversionValue(<Integer between 0 and 63>, "medium");
instance.updatePostbackConversionValue(<Integer between 0 and 63>, "medium", true);
#elif UNITY_ANDROID
// Sends Install/open event to Tenjin
instance.Connect();
#endif
}
}SKAdNetwork и iOS: постбэки рекламодателей для пользователей старше 15 лет #
Чтобы указать Tenjin в качестве пункта назначения для постбэков в рекламной сети SK Ad Network, выполните следующие действия:
- Выберите
Info.plistв панели навигации по проекту в Xcode. - Нажмите кнопку «Добавить» (+) рядом с ключом в редакторе списка свойств и нажмите клавишу Return.
- Введите название ключа
NSAdvertisingAttributionReportEndpoint. - Выберите «Строка» во всплывающем меню в столбце «Тип».
- Введите
https://tenjin-skan.com
Эти шаги взяты из инструкций компании Apple, размещенных по адресу https://developer.apple.com/documentation/storekit/skadnetwork/configuring_an_advertised_app.
GDPR #
В рамках обеспечения соответствия требованиям GDPR с помощью SDK Tenjin вы можете разрешить или запретить участие устройств/пользователей, а также выбрать, для каких конкретных параметров, связанных с устройством, следует разрешить или запретить участие. Функция OptOut() не будет отправлять никаких запросов API в Tenjin, и мы не будем обрабатывать никакие события.
Чтобы отказаться от участия/отказаться от участия:
void Start () {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
boolean userOptIn = CheckOptInValue();
if (userOptIn) {
instance.OptIn();
}
else {
instance.OptOut();
}
instance.Connect();
}
boolean CheckOptInValue()
{
// check opt-in value
// return true; // if user opted-in
return false;
}- Чтобы включить или отключить определенные параметры, связанные с устройством, можно использовать
OptInParams()илиOptOutParams(). Функция OptInParams()будет отправлять только те параметры, связанные с устройством, которые указаны.OptOutParams()будет отправлять все параметры, связанные с устройством, за исключением указанных.- Обращаем ваше внимание на то, что для правильного отслеживания устройств в системе Tenjin нам необходимы следующие параметры. Если один из этих обязательных параметров отсутствует, событие не будет обработано или зарегистрировано.
- Для Android,
advertising_id
- Для iOS
developer_device_id
- Если вы настраиваете таргетинг на рекламные сети по IMEI и/или OAID для Android, добавьте:
imeioaid
- Если вы планируете использовать Google AdWords, вам также необходимо будет добавить:
platformos_versionapp_versionlocaledevice_modelbuild_idadvertising_iddeveloper_device_id(для iOS)
Если вы хотите получить только определённые параметры, связанные с устройством, используйте OptInParams(). В приведенном ниже примере мы будем использовать только следующие параметры, связанные с устройством: ip_address, advertising_id, developer_device_id, limit_ad_tracking и referrer:
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
List<string> optInParams = new List<string> {"ip_address", "advertising_id", "developer_device_id", "limit_ad_tracking", "referrer", "iad"};
instance.OptInParams(optInParams);
instance.Connect();Если вы хотите отправить ВСЕ параметры, за исключением определённых параметров, связанных с устройством, используйте OptOutParams(). В приведенном ниже примере мы отправим ВСЕ параметры, связанные с устройством, за исключением: locale, timezone и build_id.
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
List<string> optOutParams = new List<string> {"locale", "timezone", "build_id"};
instance.OptOutParams(optOutParams);
instance.Connect();Включение/выключение с помощью CMP #
Вы можете автоматически отказаться от участия или отказаться от участия, используя свои согласия CMP (цель 1), которые уже сохранены в устройстве пользователя. Метод возвращает булево значение, чтобы сообщить вам о том, был ли пользователь согласен или нет.
OptInOutUsingCMP()
BaseTenjin instance = Tenjin.getInstance(" ");
optInOut = instance.OptInOutUsingCMP(); Параметры, связанные с устройством #
| Параметр | Описание | Платформа |
|---|---|---|
| ip_адрес | IP-адрес | Все |
| рекламный идентификатор | Идентификатор устройства | Все |
| идентификатор_устройства_разработчика | Идентификационный номер поставщика | iOS |
| оаид | Открытый рекламный идентификатор | Android |
| imei | IMEI устройства | Android |
| limit_ad_tracking | отключено отслеживание рекламы | Все |
| платформа | платформа | Все |
| реферер | Источник перехода при установке из Google Play | Android |
| os_version | версия операционной системы | Все |
| устройство | название устройства | Все |
| производитель_устройства | производитель оборудования | Android |
| модель устройства | модель устройства | Все |
| brand_device | марка устройства | Android |
| устройство_продукт | продукт для устройств | Android |
| название_модели_устройства | устройство-машина | iOS |
| device_cpu | название процессора устройства | iOS |
| перевозчик | оператор мобильной связи | Android |
| тип_соединения | мобильная связь или Wi-Fi | Android |
| ширина_экрана | ширина экрана устройства | Android |
| высота экрана | высота экрана устройства | Android |
| os_version_release | версия операционной системы | Все |
| build_id | идентификатор сборки | Все |
| локаль | локаль устройства | Все |
| страна | регион, страна | Все |
| часовой пояс | часовой пояс | Все |
События покупки #
Проверка IAP iOS #
Для проверки квитанции iOS требуются transactionId и сама квитанция. Поле signature будет установлено в null. Что касается квитанции, обязательно отправьте из Unity полезные данные квитанции (квитанцию в формате ASN.1, закодированную в base64).
ВАЖНО: Если у вас есть IAP по подписке, вам необходимо добавить открытый ключ вашего приложения в панель управления Tenjin. Вы можете получить общий секретный ключ iOS для конкретного приложения на консоли iTunes Connect > Выберите своё приложение > Информация о приложении > Общий секретный ключ для приложения.
Проверка IAP Android #
Магазин приложений Google Play
Для проверки чека в Google Play требуется наличие чека и подписи (transactionId установлен в null).
ВАЖНО: Вам необходимо добавить открытый ключ вашего приложения в панель управления Tenjin (на странице ‘Редактировать’ приложения). Вы можете получить свой открытый ключ RSA, закодированный в Base64, в консоли разработчика Google Play > Выберите свое приложение > Монетизация > Настройка монетизации > Биллинг Google Play > Лицензирование: Открытый ключ RSA, закодированный в Base64. Обратите внимание, что для Android в настоящее время мы поддерживаем только транзакции IAP из Google Play.
(ПРИМЕЧАНИЕ) В случае с Google Play обязательно ‘подтвердите’ событие покупки, прежде чем отправлять его в Tenjin. Более подробную информацию можно найти здесь
Amazon AppStore
Для проверки чека в AppStore в Amazon требуются параметры receiptId и userId.
ВАЖНО: Вам необходимо добавить общий ключ вашего приложения Amazon в панель управления Tenjin. Общий секретный ключ можно найти в разделе "Общий ключ" вашей учетной записи разработчика в учетной записи Amazon Appstore
Пример IAP с параметрами iOS и Android #
В приведенном ниже примере мы используем широко распространённую библиотеку MiniJSON для десериализации JSON.
Если вы используете Unity IAP версии 5 и выше:
Для расходных материалов подтверждение заказа доступно только в статусе PendingOrder. После подтверждения (ConfirmedOrder) поле подтверждения заказа становится пустым. Всегда обрабатывайте закупки расходных материалов и отправляйте их в Tenjin в статусе OnPurchasePending.
public static void OnPurchasePending(PendingOrder pendingOrder) {
ProcessOrder(pendingOrder);
// Confirm the purchase after processing
UnityIAPServices.DefaultPurchase().ConfirmPurchase(pendingOrder);
}
public static void ProcessOrder(Order order) {
// Get the first item from the cart
var item = order.CartOrdered.Items().FirstOrDefault();
if (item == null) return;
var product = item.Product;
var price = product.metadata.localizedPrice;
double lPrice = decimal.ToDouble(price);
var currencyCode = product.metadata.isoCurrencyCode;
var productId = product.definition.id;
var info = order.Info;
#if UNITY_ANDROID
// Parse the unified receipt JSON
var wrapper = Json.Deserialize(info.Receipt) as Dictionary<string, object>; // https://gist.github.com/darktable/1411710
if (wrapper == null) return;
var store = (string)wrapper["Store"];
var payload = (string)wrapper["Payload"];
if (store.Equals("GooglePlay")) {
var googleDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var googleJson = (string)googleDetails["json"];
var googleSig = (string)googleDetails["signature"];
CompletedAndroidPurchase(productId, currencyCode, 1, lPrice, googleJson, googleSig);
}
if (store.Equals("AmazonAppStore")) {
var amazonDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var amazonReceiptId = (string)amazonDetails["receiptId"];
var amazonUserId = (string)amazonDetails["userId"];
CompletedAmazonPurchase(productId, currencyCode, 1, lPrice, amazonReceiptId, amazonUserId);
}
#elif UNITY_IOS
// Try SK2 first (Unity IAP 5.1+ on iOS 15+), fall back to SK1
var receipt = info.Apple?.jwsRepresentation;
if (string.IsNullOrEmpty(receipt)) {
receipt = info.Apple?.AppReceipt;
}
if (string.IsNullOrEmpty(receipt)) {
Debug.LogError("No receipt available");
return;
}
var transactionId = info.TransactionID;
CompletedIosPurchase(productId, currencyCode, 1, lPrice, transactionId, receipt);
#endif
}
private static void CompletedAndroidPurchase(string ProductId, string CurrencyCode, int Quantity,
double UnitPrice, string Receipt, string Signature)
{
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, null, Receipt, Signature);
}
private static void CompletedIosPurchase(string ProductId, string CurrencyCode, int Quantity,
double UnitPrice, string TransactionId, string Receipt)
{
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, TransactionId, Receipt, null);
}
private static void CompletedAmazonPurchase(string ProductId, string CurrencyCode, int Quantity,
double UnitPrice, string ReceiptId, string UserId)
{
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.TransactionAmazon(ProductId, CurrencyCode, Quantity, UnitPrice, ReceiptId, UserId);
}Если вы используете Unity IAP версии 4 (или более ранней):
public static void OnProcessPurchase(PurchaseEventArgs purchaseEventArgs) {
var price = purchaseEventArgs.purchasedProduct.metadata.localizedPrice;
double lPrice = decimal.ToDouble(price);
var currencyCode = purchaseEventArgs.purchasedProduct.metadata.isoCurrencyCode;
var wrapper = Json.Deserialize(purchaseEventArgs.purchasedProduct.receipt) as Dictionary<string, object>;
// https://gist.github.com/darktable/1411710
if (null == wrapper) {
return;
}
var store = (string)wrapper["Store"]; // GooglePlay, AmazonAppStore, AppleAppStore, etc.
var payload = (string)wrapper["Payload"]; // For Apple: base64 encoded ASN.1 receipt. For Android: raw JSON receipt.
var productId = purchaseEventArgs.purchasedProduct.definition.id;
#if UNITY_ANDROID
if (store.Equals("GooglePlay")) {
var googleDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var googleJson = (string)googleDetails["json"];
var googleSig = (string)googleDetails["signature"];
CompletedAndroidPurchase(productId, currencyCode, 1, lPrice, googleJson, googleSig);
}
if (store.Equals("AmazonApps")) {
var amazonDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var amazonReceiptId = (string)amazonDetails["receiptId"];
var amazonUserId = (string)amazonDetails["userId"];
CompletedAmazonPurchase(productId, currencyCode, 1, lPrice, amazonReceiptId, amazonUserId);
}
#elif UNITY_IOS
var transactionId = purchaseEventArgs.purchasedProduct.transactionID;
CompletedIosPurchase(productId, currencyCode, 1, lPrice, transactionId, payload);
#endif
}
private static void CompletedAndroidPurchase(string ProductId, string CurrencyCode, int Quantity, double UnitPrice, string Receipt, string Signature) {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, null, Receipt, Signature);
}
private static void CompletedIosPurchase(string ProductId, string CurrencyCode, int Quantity, double UnitPrice, string TransactionId, string Receipt) {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, TransactionId, Receipt, null);
}
private static void CompletedAmazonPurchase(string ProductId, string CurrencyCode, int Quantity, double UnitPrice, string ReceiptId, string UserId) {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.TransactionAmazon(ProductId, CurrencyCode, Quantity, UnitPrice, ReceiptId, UserId);
}(Гибкая настройка комиссии App Store) С помощью нашей новой настройки вы можете выбрать один из следующих вариантов комиссии App Store: 0%, 15% или 30%. Порядок действий следующий:
- Перейдите в раздел «Настройки» –> «Приложения»
- Нажмите на приложение, для которого вы хотите его изменить
- В разделе ‘Комиссия App Store’ нажмите ‘Изменить’.’
- Выберите 30%, 15% или 0% в качестве желаемой комиссии магазина приложений.
- Выберите дату начала и дату окончания (или вы можете оставить дату окончания пустой, если вам не нужна дата окончания).
- Нажмите «Сохранить» (примечание: комиссия может применяться только к датам, наступающим в будущем, а не к прошлым датам. Поэтому, пожалуйста, установите дату начала, начиная с даты внесения изменений и далее)
Внутриигровая покупка по подписке #
- Вы обязаны отправлять транзакцию по подписке один раз в течение каждого периода действия подписки (т. е., например, в случае ежемесячной подписки вам необходимо отправлять нам 1 транзакцию в месяц). В приведенном ниже примере временной шкалы событие транзакции следует отправлять только при событиях “Первый сбор” и “Продление”. В течение пробного периода не отправляйте событие транзакции в Tenjin.
- Tenjin не удаляет дубликаты транзакций.
- Если у вас есть подписка iOS, приобретенная в рамках встроенных покупок (IAP), вам необходимо добавить открытый ключ вашего приложения в панель управления Tenjin. Вы можете получить общий секретный ключ для конкретного приложения iOS на сайте консоли iTunes Connect \> Выберите своё приложение \> Функции \> Внутриприложные покупки \> Общий секретный ключ для приложения.
- Дополнительную информацию о подписке на iOS см. по ссылке: Документация Apple по работе с подписками
- Для получения дополнительной информации о подписке на Android см.: Документация по подпискам в системе Google Play Billing
Нестандартные события #
ВАЖНО: Ограничьте названия пользовательских событий до 80 символов. Не превышайте 500 уникальных названий пользовательских событий.
- Добавьте папку «Assets» в свой проект Unity
- В методе вашего проекта, отвечающем за обработку пользовательского события, для именованного события введите следующий код:
Tenjin.getInstance("").SendEvent("name"), а для именованного события с целочисленным значением — следующее:Tenjin.getInstance("").SendEvent("nameWithValue","value") - Убедитесь, что переданное значение
valueявляется целым числом (например, “2000”, а не “0,02”). Еслизначениене является целым числом, параметрзначениебудет пропущен.
Вот пример кода:
void MethodWithCustomEvent(){
//event with name
BaseTenjin instance = Tenjin.getInstance ("SDK_KEY");
instance.SendEvent("name");
//event with name and integer value
instance.SendEvent("nameWithValue", "value");
}.SendEvent("name") предназначено для событий, представляющих собой статические метки или вехи. К ним относятся такие события, как tutorial_complete, registration или level_1.
.SendEvent("name", "value") используется для событий, в которых необходимо выполнить математические вычисления над каким-либо свойством данного события. Например, ("coins_purchased", "100") позволит вам проанализировать сумму или среднее значение монет, приобретённых в рамках данного события.
Интеграция между серверами #
Tenjin предлагает интеграцию «сервер-сервер». Это позволяет отправлять события, связанные с установкой и последующими действиями, напрямую с ваших серверов на серверы Tenjin без необходимости интеграции SDK.
Параметр Subversion приложения для A/B-тестирования #
Если вы проводите A/B-тестирование и хотите отразить различия в отчётах, мы можем добавить числовое значение к версии вашего приложения с помощью метода AppendAppSubversion(). Например, если версия вашего приложения 1.0.1, и вы установите AppendAppSubversion(8888), версия приложения будет отображаться как 1.0.1.8888.
Эти данные появятся в DataVault, где вы сможете запускать отчеты, используя значения субверсии приложения.
BaseTenjin instance = Tenjin.getInstance(" ");
instance.AppendAppSubversion(8888);
instance.Connect();Кампании LiveOps #
Tenjin поддерживает получение информации об атрибуции пользователей, такой как рекламная сеть и кампания, из SDK. Это позволит разработчикам собирать и анализировать данные об атрибуции на уровне пользователей в режиме реального времени. Ниже приведены возможные сценарии использования с помощью Tenjin LiveOps Campaigns:
- Если у вас есть собственный инструмент для анализа данных, функция обратного вызова S2S позволит вам сопоставить данные атрибуции с вашими внутриигровыми данными на уровне отдельного устройства.
- Показывайте разный контент приложения в зависимости от того, откуда пришел пользователь. Например, если пользователь А приписан к органической сети, а пользователь Б - к Facebook, и пользователь Б, скорее всего, будет более вовлечен в работу с вашим приложением, то вы хотите показать специальное предложение в игре после того, как пользователь установит приложение. Если вы хотите обсудить более конкретные сценарии использования, напишите на support@tenjin.com.
Подробную информацию об использовании LiveOps можно найти здесь.
Идентификатор пользователя клиента #
Вы можете задавать и получать идентификатор пользователя клиента, чтобы отправлять его в качестве параметра в событиях.
.SetCustomerUserId("user_id")
.GetCustomerUserId()
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetCustomerUserId("user_id");
string userId = instance.GetCustomerUserId(); Идентификатор установки аналитики #
Вы можете получить идентификатор аналитика, который генерируется случайным образом и сохраняется в локальном хранилище устройства. GetAnalyticsInstallationId()
BaseTenjin instance = Tenjin.getInstance(" ");
analyticsId = instance.GetAnalyticsInstallationId; События повторной попытки/кэширования #
Вы можете включить/выключить повторную попытку и кэширование всех событий при неудачных запросах или отсутствии интернет-соединения у пользователей. Эти события будут отправляться после того, как новое событие будет добавлено в очередь и пользователь восстановит соединение.
.SetCacheEventSetting(true)
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetCacheEventSetting(true); Параметры Google DMA #
Если у вас уже интегрирована платформа управления согласием (CMP), параметры Google DMA будут автоматически собираться SDK Tenjin. Если у вас интегрирована CMP, в SDK Tenjin ничего дополнительно реализовывать не нужно. Если вы хотите переопределить настройки своей CMP или просто создать собственные механизмы получения согласия, вы можете воспользоваться следующим:
SetGoogleDMAParameters(bool, bool)
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetGoogleDMAParameters(adPersonalization, adUserData); Чтобы явно управлять сбором параметров Google DMA, у вас есть возможность в любой момент включить или отключить эту функцию. Хотя по умолчанию она включена, вы можете легко настроить свои предпочтения с помощью методов OptInGoogleDMA или OptOutGoogleDMA, что обеспечит вам полный контроль над настройками конфиденциальности ваших данных:
instance.OptInGoogleDMA();
instance.OptOutGoogleDMA(); Профиль пользователя — LiveOps Metrics #
SDK Tenjin автоматически отслеживает и агрегирует показатели сеансов пользователей и выручки, которые можно использовать для проведения кампаний LiveOps, сегментации пользователей и аналитики. Функция «Профиль пользователя» обеспечивает доступ к этим показателям в режиме реального времени для отдельных пользователей.
Отслеживаемые показатели #
SDK автоматически отслеживает следующие показатели для каждого пользователя:
| Метрическая система | Описание | Тип |
|---|---|---|
session_count | Общее количество сеансов | Целое число |
total_session_time | Общее время сеанса в миллисекундах | Число |
average_session_length | Средняя продолжительность сеанса в миллисекундах | Число |
last_session_length | Продолжительность последней завершённой сессии в миллисекундах | Число |
iap_transaction_count | Общее количество транзакций IAP | Целое число |
total_ilrd_revenue_usd | Общая выручка от рекламы ILRD в долларах США | Число |
first_session_date | Временная метка первой сессии по стандарту ISO 8601 | Строка |
last_session_date | Временная метка по стандарту ISO 8601 последней завершённой сессии | Строка |
current_session_length | Текущая продолжительность активной сессии в миллисекундах | Число |
iap_revenue_by_currency | Структура выручки по кодам валют | Строка JSON |
purchased_product_ids | Массив идентификаторов приобретенных товаров | Строка JSON |
ilrd_revenue_by_network | Доходы ILRD по рекламным сетям | Строка JSON |
Примечание: Условные поля (даты, текущая сессия, карты доходов, массивы продуктов) включаются в словарь только при наличии данных.
Доступные методы #
Получить словарь профилей пользователей #
Возвращает словарь, содержащий все отслеживаемые метрики для текущего пользователя. Все значения возвращаются в виде строк (числа, массивы JSON и объекты JSON преобразуются в строки).
BaseTenjin instance = Tenjin.getInstance("<SDK_KEY>");
Dictionary<string, string> profile = instance.GetUserProfileDictionary();
if (profile != null && profile.Count > 0)
{
Debug.Log("Session Count: " + profile["session_count"]);
Debug.Log("Total Session Time (ms): " + profile["total_session_time"]);
Debug.Log("Average Session Length (ms): " + profile["average_session_length"]);
Debug.Log("Last Session Length (ms): " + profile["last_session_length"]);
Debug.Log("IAP Transaction Count: " + profile["iap_transaction_count"]);
Debug.Log("Total ILRD Revenue USD: " + profile["total_ilrd_revenue_usd"]);
// Convert milliseconds to seconds if needed
long totalTimeMs = long.Parse(profile["total_session_time"]);
Debug.Log($"Total Session Time: {totalTimeMs / 1000.0:F1} seconds");
// Revenue by currency is a JSON string (conditional)
if (profile.ContainsKey("iap_revenue_by_currency"))
{
Debug.Log("IAP Revenue by Currency: " + profile["iap_revenue_by_currency"]);
// Example: {"USD":99.99,"EUR":49.99}
}
// Product IDs is a JSON array string (conditional)
if (profile.ContainsKey("purchased_product_ids"))
{
Debug.Log("Purchased Products: " + profile["purchased_product_ids"]);
// Example: ["com.app.coins100","com.app.coins500"]
}
}
else
{
Debug.Log("User profile not available yet");
}Сброс настроек профиля пользователя #
Очищает все отслеживаемые показатели для текущего пользователя. Полезно при тестировании или при выходе пользователя из системы.
BaseTenjin instance = Tenjin.getInstance("<SDK_KEY>");
instance.ResetUserProfile();
Debug.Log("User profile has been reset");Примечания, относящиеся к конкретной платформе #
Доступность данных:
Данные профиля пользователя становятся доступны после отслеживания первой сессии. Метод GetUserProfileDictionary() возвращает данные в режиме реального времени из кэша SDK, хранящегося в оперативной памяти.
Единицы времени:
- Все временные значения теперь указаны в миллисекундах как в iOS, так и в Android для обеспечения единообразия
- При необходимости преобразуйте в секунды:
milliseconds / 1000.0
Сложные типы данных:
- Карты выручки (
iap_revenue_by_currency,ilrd_revenue_by_network) возвращаются в виде строк JSON:{"USD":99.99,"EUR":49.99} - Массивы идентификаторов товаров (
purchased_product_ids) возвращаются в виде строк JSON:["product1","product2"]
Интеграция доходов от рекламы на уровне впечатлений #
Tenjin поддерживает возможность интеграции с функцией Impression Level Ad Revenue (ILRD) из,
- AppLovin MAX
- Unity LevelPlay
- ГиперБид
- AdMob
- TopOn
- CAS
- TradPlus
- CloudX
Эта функция позволяет вам получать события, связанные с вашей рекламной выручкой, на которую влияет каждое рекламное объявление, показанное пользователю. Руководство по интеграции доступно здесь.
Тестирование #
Вы можете проверить, правильно ли работает интеграция, с помощью нашего инструмента для тестирования данных устройств в режиме реального времени. Добавьте свой advertising_id или IDFA/GAID в список тестовых устройств. Вы найдёте его в разделе "Поддержка" -> Тестовые устройства. Перейдите на страницу Live Event Tool и отправьте тестовые события из вашего приложения. Вы должны увидеть поступающие события в режиме реального времени:
