概要 #
以下のドキュメントでは、Tenjin 用Unity SDKについて説明します。Tenjinおよび当社の製品の詳細については、https://tenjin.comをご覧ください。
- 過去のバージョン履歴については、こちらのリリースノートをご確認下さい。
- Tenjin Unity SDKはiOSとAndroidの両方をサポートしています。
- iOSおよびAndroidのドキュメントを確認し、ビルドに適切なプラットフォーム設定を適用してください。(iOS、Android)
- ご質問がある方は、support@tenjin.comまでお問い合わせください。
Unity SDKv1.12.29以前のバージョンを使用している場合は、SDKの実装を完了する前に、こちらの手順に従ってください。
下位バージョンからv.1.12.30以降にアップグレードする場合は、最新のUnityバージョンをインストールする前に、Tenjinバイナリを削除してください。
iOSでコンパイルする際に次のエラーが発生した場合: Library not loaded: @rpath/TenjinSDK.framework/TenjinSDK Frameworks, Libraries and Embedded Contentに移動してTenjinSDKを追加し、Embed & Signを選択する必要があります。
古いTenjinSDK バージョンのlibTenjinSDK.aおよび/または libTenjinSDKUniversal.aが残っている場合は、それらを削除し、pod installを実行して iOS に統合してください。
Unityパッケージマネージャ (UPM) #
Git URLからUPMパッケージをインストールするには:
- パッケージマネージャーのウィンドウが開いていない場合は、開いてください。
- パッケージマネージャーのツールバーにあるAdd (+) メニューを開きます。
- インストールメニューからInstall package from git URL を選択します。テキストボックスとインストールボタンが表示されます。
- テキストボックスに以下の有効なGit URLを入力してください (バージョンタグの後に
#を追加する必要があります):https://github.com/tenjin/tenjin-unity-sdk.git#1.16.3 - Installをクリックします。
マニュアルインストール (.unitypackage) #
- こちらより最新のUnity SDKをダウンロードします。
- お客様のプロジェクト上の
Assets -> Import Package上で、TenjinUnityPackage.unitypackageをインポートします。
Androidに関する重要な点 #
Tenjinが最新の機能や修正とシームレスに連携するように、Maven(Gradle)の依存関係が最新であることを確認してください。Tenjin Android SDKはMaven経由で配布されているためです。一部の開発者が古いバージョンを使用していることが確認されており、問題が発生する可能性があります。
Android Studioでビルドする場合は、必ずGradle syncを実行して依存関係を更新してください。
Android Studioを使用していない場合は、以下の手順に従ってUnityの依存関係を更新してください。
- Unityを起動します。
- Navigate to Assets > External Dependency Manager > Android Resolver.
- Force Resolveを選択して、Gradleの依存関係を最新バージョンに更新してください。
Googleプレイストア #
デフォルトでは、unspecifiedがデフォルトのAppStoreです。アプリをGooglePlayストアで配布する場合は、アプリストアの値をgoogleplay,に更新します。
アプリストアタイプの値を次のように設定します。 googleplay:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.googleplay);manifestファイルに下記のパーミッションを追加します。
<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開発者サービスでは、APIレベル32(Android 13)のすべてのアプリで、advertising_id(Android広告ID(AAID))を使用する場合、マニフェストファイルにGoogle Play開発者サービスのAD_ID権限(下記参照)を宣言する必要があります。下記の権限を使用するには、tenjin-android-sdkをバージョン1.12.8にアップデートする必要があります。
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>Android広告ID (AAID)とインストールリファラ #
Android広告ID(AAID)とインストールリファラライブラリを下記の通り、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ストア #
デフォルトでは,unspecifiedがアプリストアの設定になります。アプリに応じて、アプリストアの値をamazonに更新します。
アプリストアタイプの値を次のように設定します。 amazon:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.amazon);OAIDと他アンドロイドアプリストア #
Tenjinは、Android OAIDを使用して他のAndroidアプリストアでアプリを宣伝することをサポートしています。OAIDライブラリを統合するには、以下の要件を満たす必要があります。Google Play以外でアプリをリリースする予定がある場合は、これらのOAIDライブラリを実装してください。
MSA OAID #
MSA OAIDは、MSA (Mobile Security Alliance)が提供する、中国で製造されるデバイスで取得可能な広告IDです。MSA ライブラリを実装する場合は、oaid_sdk_1.0.25.aarとsupplierconfig.jsonをダウンロードします。
oaid_sdk_1.0.25.aarファイルをプロジェクトのAndroid libsディレクトリ: /Assets/Plugins/Androidに配置してください。
アプリストアタイプの値を次のように設定します。 other:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.other);Huawei OAID #
中国国外では、Huaweiが提供するライブラリを使用してOAIDを収集できます。Huawei OAIDライブラリの実装には、次のHuawei AARファイルをダウンロードしてください。huawei-ads-identifier.aar。アプリが Huawei App Galleryにアップされている場合は、Huawei インストールリファラファイルをダウンロードして追加してください: huawei-ads-installreferrer.aar。
それらのHuaweiファイルを、プロジェクトのAndroidライブラリディレクトリに配置してください: /Assets/Plugins/Android
アプリストアタイプの値を次のように設定します。 other:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.other);難読化設定 #
-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初期化 #
- Appsページから
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()に実装してください。
アプリストア設定 #
下記の3つのアプリストアのオプションをサポートしています。
- googleplay
- amazon
- other
デフォルトでは, unspecifiedがアプリストアの設定になります。特定のアプリストアにパブリッシュする場合は、アプリストアを適切な値に設定してください。otherのアプリストアはHuaweiアプリギャラリーやその他のアプリストアで使用されます。
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がサーバ側に送られます。 - ATTrackingManager を使用せずに、Tenjinの
connect()を呼び出すこともできます。Tenjin にユーザーのIDFAにアクセスしたり渡したりする予定がない場合は、ATTを実装しないことを選択できます。
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許可プロンプトの説明を入力し、アプリケーションへの許可リクエストを実装する必要があります。
> 注: アプリ内で広告を配信する前に、許可リクエストを実装する必要があります。
ユーザー追跡の説明の設定 #
XcodeプロジェクトのInfo.plistファイル内の NSUserTrackingUsageDescriptionキーを使用して説明の内容を設定します。デバイス追跡データの使用許可を要求している理由をユーザーに通知するメッセージを提供する必要があります。
- Xcodeプロジェクトナビゲータで、
Info.plistファイルを開きます。 - プロパティリストエディタの任意のキーの横にある追加ボタン(+)をクリックして、新しいプロパティキーを作成します。
- キー名を入力します
NSUserTrackingUsageDescription. - 文字列値のタイプを選択します。
- 値フィールドにアプリ追跡のメッセージを入力します。いくつかの例が含まれます:
- お客様のデータを使用して、より優れたパーソナライズされた広告エクスペリエンスを提供します。
- 使用しているアプリ、使用しているデバイス、使用している国に基づいて、最も興味のあるアプリや製品の広告を表示するようにしています。
- 私たちは、あなたが使用するアプリに基づいて、あなたにとって最も興味深いアプリや製品の広告を表示しようとします。
注: Appleは、プライバシー関連の機能に直面しているすべてのエンドユーザーの許容可能な使用とメッセージングを定義する特定のアプリストアガイドラインを提供しています。Tenjinは法律上の助言を提供していません。したがって、このページの情報は、お客様のビジネスとプロセスの法的要件、およびそれらに対処する方法を決定するための法的手段の代替ではありません。
SKAdNetworkとコンバージョンバリュー #
SKAdNetworkの導入に従って, TenjinではupdatePostbackConversionValue(_:)のラッパーメソッドを用意しています。このメソッドは、該当のSKAdNetworkのメソッドをコールし、コンバージョンバリューをTenjinのサーバに送信します。
updatePostbackConversionValue(_:) 6ビットの値はアプリ内イベントに対応する値で、バイナリ値ではなく0-63の間の整数値である必要があります。これ以外の数値の場合、サーバ側でエラーとなります。
SKAdNetwork 4.0がサポート対象となるiOS 16.1以降で、coarseValue(文字列、可能な引数はlow、medium, high)とlockWindow(真偽値)を更新ポストバックメソッドのパラメーターとして送信できるようになりました。
updatePostbackConversionValue(conversionValue: Integer, coarseValue: String)
updatePostbackConversionValue(conversionValue: Integer, coarseValue: String, lockWindow: Bool)
- SKAdNetwork 4.0に対応したiOSバージョン16.1以降では、このメソッドを何度でも呼び出すことができ、コンバージョンバリューを以前の値よりも低くしたり高くしたりできます。
- 4.0より前のSKAdnetWorkバージョンをサポートする16.1より前のiOSバージョンの場合、このメソッドを呼び出すと、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+広告主向けポストバック #
SKAdNetworkのポストバックにおいて、Tenjinを送信先に設定するためには、下記をご設定ください。
- XCodeのプロジェクトナビゲーターで、
Info.plistを選択します。 - プロパティリストエディタ上で、keyのそばの追加ボタン(+)をクリックし、リターンを押下します。
- キー名を入力:
NSAdvertisingAttributionReportEndpoint. - Typeのカラムで、ポップアップメニューからStringを選択します。
- 次を入力:
https://tenjin-skan.com
これらの手順は、Appleの以下の説明を参考にしています: https://developer.apple.com/documentation/storekit/skadnetwork/configuring_an_advertised_app.
GDPR #
GDPR準拠の一環として、TenjinのSDKを使用すると、デバイス/ユーザーのオプトイン/オプトアウト、またはオプトインまたはオプトアウトする特定のデバイス関連パラメータを選択できます。optOut()はTenjinにAPIリクエストを送信せず、イベントも処理しません。
オプトイン/オプトアウトを実装するには:
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を使用したネットワークでプロモーションを実施する場合は、下記のパラメータが必須となります。
imeioaid
- Google Adsでプロモーションを行う場合は、下記のパラメータが必須となります。
platformos_versionapp_versionlocaledevice_modelbuild_idadvertising_iddeveloper_device_id(for 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)の情報を使用して、Tenjin SDKを自動的にオプトインまたはオプトアウトできます。このメソッドは、オプトインかオプトアウトかを示すブール値を返します。
OptInOutUsingCMP()
BaseTenjin instance = Tenjin.getInstance(" ");
optInOut = instance.OptInOutUsingCMP(); デバイスパラメータ #
| パラメータ | 説明 | プラットフォーム |
|---|---|---|
| ip_address | IP Address | All |
| advertising_id | Google広告ID | All |
| developer_device_id | ID for Vendor | iOS |
| oaid | Open Advertising ID | Android |
| imei | Device IMEI | Android |
| limit_ad_tracking | limit ad tracking enabled | All |
| platform | platform | All |
| referrer | Google Play Install Referrer | Android |
| os_version | OSバージョン | All |
| device | デバイス名 | All |
| device_manufacturer | デバイス製造元 | Android |
| device_model | デバイスモデル | All |
| device_brand | デバイスブランド | Android |
| device_product | デバイスプロダクト | Android |
| device_model_name | デバイスマシン | iOS |
| device_cpu | デバイスCPU名 | iOS |
| carrier | キャリア | Android |
| connection_type | セルラーまたはWifi | Android |
| screen_width | デバイススクリーン幅 | Android |
| screen_height | デバイススクリーン高さ | Android |
| os_version_release | OSバージョン | All |
| build_id | ビルドID | All |
| locale | デバイスロケール | All |
| country | ロケール国 | All |
| タイムゾーン | タイムゾーン | All |
アプリ内課金イベント #
iOSレシート検証 #
iOSのレシート検証には、transactionIdとreceiptが必要です。signatureはnullに設定されます。receiptについては、Unityからレシートペイロード(base64エンコードされたASN.1レシート)を送信するようにしてください。
注:サブスクリプション課金の場合、 Tenjin管理画面よりIAP shared secretを該当のアプリに追加してください。iOSのShared secretは、iTunes Connect ConsoleでSelect your app > Features > In-App Purchases > App-Specific Shared Secretより取得できます。
Androidレシート検証 #
Google Playアプリストア
Google Playのレシート検証では、receiptとsignatureが必要です(transactionIdはnullに設定されます)。
重要: Tenjin管理画面 該当のAndroidアプリ -> Editより、Public Keyを入力してください。Publick KeyはBase64でエンコードされたRSA公開キーで、Google Playデベロッパーコンソールの選択したアプリ > Monetize > Monetization setup > Google Play Billing > Licensing: Base64-encoded RSA public keyの箇所から取得できます。
Tenjinに送る前に必ず課金イベントを「承認」してください。詳しくはこちらをお読みください。
Amazonアプリストア
Amazonアプリストアのレシート検証には、receiptIdパラメータとuserIdパラメータが必要です。
重要:: Amazonアプリの共有キーを Tenjin管理画面に追加する必要があります。共有キーは、Amazonアプリストアの開発者アカウントから取得できます。
実装例 #
以下の例では、JSONデシリアライズに広く使用されているMiniJSONライブラリを使用しています。
Unity IAPバージョン5以降を使用している場合:
For consumable products、レシートはPendingOrderでのみ利用可能です。確定(ConfirmedOrder)されると、レシートは空になります。Consumable Productの場合は、必ずOnPurchasePendingで購入処理を行い、Tenjinに送信してください。
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);
}新しい設定により、アプリストアの収益手数料を0%、15%または30%の間で選択可能です。
- CONFIGURE --> Appsをクリック。
- アプリを選択。
- App Store Commissionのセクションで、Editをクリック
- アプリストア手数料として30%、15%、または0%を選択。
- 開始日と終了日を選択します。 (終了日を指定しない場合は、終了日を空白のままにすることもできます)
- Saveをクリックします (注: 手数料は変更を加えた日付以降に適用され、過去日付には適用されません。そのため、変更を行う日付から以降の開始日を設定してください)。
サブスクリプション課金 #
- サブスクリプション期間中は、サブスクリプショントランザクションを1回送信する必要があります(例えば、月額サブスクリプションの場合は、毎月1回のトランザクションを送信してください)。下記のタイムライン例では、「初回課金」と「更新」のイベントでのみトランザクションイベントを送信してください。トライアル期間中は、Tenjinにトランザクションイベントを送信しないでください。
- Tenjinは重複したトランザクションの重複排除を行いません。
- サブスクリプションイベントの場合、 Tenjin管理画面よりIAP shared secretを該当のアプリに追加してください。shared secretはiTunes Connect Console > Select your app > App Information > App-Specific Shared Secretより取得できます。
- iOSサブスクリプションの詳細については、こちらのドキュメントをご確認下さい: Apple documentation on Working with Subscriptions
- Androidサブスクリプションの詳細については、こちらのドキュメントをご確認下さい: Google Play Billing subscriptions documentation
カスタムイベント #
重要:カスタムイベント名は80文字未満に制限してください。また、固有のカスタムイベント名は500個を超えないようにしてください。
- お使いのUnityプロジェクトにてAssetsフォルダを含めます。
- プロジェクトのカスタムイベントのメソッドで、名前付きイベントの場合は次のコードを記述します。
Tenjin.getInstance("").SendEvent("name")また、整数値を持つ名前付きイベントの場合は次のコードを記述します。Tenjin.getInstance("").SendEvent("nameWithValue","value") - 渡される
valueは整数値(例えば「2000」など、「0.02」などではない)であることを確認してください。valueが整数値でない場合、valueパラメータは省略されます。
下記がコードの例です。
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はサーバー間連携を提供しています。これにより、SDK連携を必要とせずに、インストールイベントとインストール後イベントをサーバーからTenjinサーバーに直接送信できます。
アプリサブバージョン #
A/Bテストを実施する場合、appendAppSubversion() メソッドを用いて、アプリバージョンに固定の数値を付加することが可能です。例えば、アプリのバージョンが1.0.1でappendAppSubversion() : @8888をセットすると、レポートされるアプリバージョンは1.0.1.8888となります。
データボルトを用いれば、このアプリバージョンごとのパフォーマンスを分析することが可能です。
BaseTenjin instance = Tenjin.getInstance(" ");
instance.AppendAppSubversion(8888);
instance.Connect();LiveOpsキャンペーン #
アプリ開発者は、自社サーバーまたはTenjinと連携していないネットワークにカスタムでコールバックを送信できます。これにより、開発者はこれらのユーザーレベルのアトリビューションデータをリアルタイムで収集して分析できます。以下は、Tenjinのカスタムコールバックを使用した使用例です。
- 独自のデータ分析ツールをお持ちの場合は、S2Sコールバックを使用することで、デバイスごとにアトリビューションデータをゲーム内データに紐付けることができます。
- ユーザーのアトリビューションソースに応じて、さまざまなアプリコンテンツを表示します。たとえば、ユーザーAがオーガニックに関連付けられ、ユーザーBが Facebookに関連付けられているとします。ユーザー Bの方がアプリに関心を持っている可能性が高いため、ユーザーがアプリをインストールした後に特別なゲーム内オファーを表示することができます。
LiveOpsの使用方法に関する詳細は、こちらをご覧ください。
カスタマーユーザーID #
イベントのパラメーターとして送信するカスタマーユーザー IDを設定および取得できます。
.SetCustomerUserId("user_id")
.GetCustomerUserId()
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetCustomerUserId("user_id");
string userId = instance.GetCustomerUserId(); Analytics Installation ID #
下記のメソッドを用いて、ランダムに生成され、デバイスのローカルストレージに保存されているユニークなAnalytics IDを取得できます。 GetAnalyticsInstallationId()
BaseTenjin instance = Tenjin.getInstance(" ");
analyticsId = instance.GetAnalyticsInstallationId; リトライ/キャッシュ #
リクエストが失敗した場合、またはユーザーがインターネットに接続していない場合のイベントとIAPの再試行とキャッシュを有効/無効にできます。これらのイベントは、新しいイベントがキューに追加され、ユーザーが接続を回復した後に送信されます。
.SetCacheEventSetting(true)
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetCacheEventSetting(true); Google DMAパラメータ #
すでに CMPが実装されている場合、Google DMAパラメータはTenjin SDKによって自動的に収集されます。 Tenjin SDKでの追加実装は必要ありません。 CMPをオーバーライドしたい場合、または独自の同意メカニズムを使用したい場合は、以下メソッドを使用できます。
SetGoogleDMAParameters(bool, bool)
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetGoogleDMAParameters(adPersonalization, adUserData); Google DMAパラメータの収集を明示的に管理するために、いつでも柔軟にオプトインまたはオプトアウトできます。デフォルト設定はオプトインですが、OptInGoogleDMAまたは OptOutGoogleDMAメソッドを使用して設定を簡単に調整でき、データプライバシー設定を完全に制御できます。
instance.OptInGoogleDMA();
instance.OptOutGoogleDMA(); ユーザープロファイル – LiveOpsメトリクス #
Tenjin SDKは、ユーザーセッションと収益に関する指標を自動的に追跡・集計し、LiveOpsキャンペーン、ユーザーセグメンテーション、および分析に活用できます。ユーザープロファイル機能を使用すると、個々のユーザーに関するこれらの指標にリアルタイムでアクセスできます。
トラックメトリクス #
SDKは、ユーザーごとに以下の指標を自動的に追跡します。
| メトリック | 説明 | 型 |
|---|---|---|
session_count | トータルセッション数 | Integer |
total_session_time | 累積セッション時間 (ミリ秒) | Number |
average_session_length | 平均セッション時間(ミリ秒) | Number |
last_session_length | 最後に完了したセッションの継続時間(ミリ秒) | Number |
iap_transaction_count | Total number of IAP transactions | Integer |
total_ilrd_revenue_usd | ILRDの広告収益総額(USD) | Number |
first_session_date | 最初のセッションのISO8601タイムスタンプ | String |
last_session_date | 直近に完了したセッションのISO8601タイムスタンプ | String |
current_session_length | 現在アクティブなセッションの継続時間(ミリ秒) | Number |
iap_revenue_by_currency | 通貨コード別の収益内訳 | JSON String |
purchased_product_ids | 購入したプロダクトIDの配列 | JSON String |
ilrd_revenue_by_network | ILRDのアドネットワーク別収益 | JSON String |
注: 条件付きフィールド (日付、現在のセッション、収益マップ、プロダクト配列) は、データが存在する場合にのみディクショナリに含まれます。
利用可能なメソッド #
Dictionaryとしてプロファイルを取得 #
現在のユーザーについて追跡されているすべての指標を含む辞書を返します。すべての値は文字列として返されます(数値、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} - プロダクトID配列(
purchased_product_ids)はJSON文字列として返されます:["product1","product2"]
インプレッションレベル広告収益 #
Tenjinでは下記のメディエーションプロバイダにおいて、インプレッションレベルの広告収益(ILRD)をサポートしています。
- AppLovin MAX
- Unity LevelPlay
- HyperBid
- AdMob
- TopOn
- CAS
- TradPlus
この機能を使用すると、ユーザーに表示される各広告によって影響を受ける広告収益に対応するイベントを受信できます。実装ガイドへのアクセスはこちらです。
テスト #
You can verify if the integration is working correctly with our Live Test Device Data Tool. Add your advertising_id や IDFA/GAID to the list of test devices. You can find this under Support -> Test Devices. Go to the Live Event Tool page and send the test events from your app. You should see live events come in:
