Unity SDK実装手順
過去のバージョン履歴については、こちらのリリースノートを御覧ください。
Tenjin Unity プラグイン
- Tenjin Unity SDKでは、iOS及びAndroidの両方をサポートしています。
- お客様の
API_KEY
についてはこちらをご確認ください。 - iOSおよびAndroidのドキュメントをご確認いただき、ビルドに適切なプラットフォーム設定を適用ください。
- iOSについての注意事項:
- v1.12.0以上のバージョンのiOS SDKを使用する場合は、Xcode 12の使用が必要となります。
- iOSのビルドに際し、下記のフレームワークがXcodeのビルドに自動的に追加されていることをご確認ください。もしされていない場合は、マニュアルで不足しているフレームワークを追加してください。
- AdSupport.framework
- AppTrackingTransparency.framework
- iAd.framework
- StoreKit.framework
- AppTrackingTransparencyを使用する場合、
.plist
ファイルのアップデート、Privacy - Tracking Usage Description
(NSUserTrackingUsageDescription)の追加及びユーザに表示するテキストメッセージの追加を行ってください。
- Androidについての注意事項:
- すでにGoogle Play ServiceがインストールされているSDK、またはPlayServiceResolverをお使いの場合、下記のファイルを削除する必要があります。
/Assets/Plugins/Android/play-services-ads-identifier--*.aar
,/Assets/Plugins/Android/play-services-basement---*.aar
- UnityのSDKバージョン1.12.4以下をお使いで、アプリ起動時に下記のエラーが発生した場合、tenjin.aarのファイルを
/Assets/Plugins/Android/Tenjin/libs
から/Assets/Plugins/Android/
に移動してください。
またはAndroidJavaException: java.lang.NoSuchMethodError: no static method with name='setWrapperVersion'
AndroidJavaException: java.lang.ClassNotFoundException: com.tenjin.android.TenjinSDK
- すでにGoogle Play ServiceがインストールされているSDK、またはPlayServiceResolverをお使いの場合、下記のファイルを削除する必要があります。
Tenjin インストール/セッションイベントの実装方法:
- お使いのUnityプロジェクトにアセットフォルダが含まれていることをご確認ください
- プロジェクトの初めに、
Start()
メソッド及びBaseTenjin instance = Tenjin.getInstance("API_KEY")
とinstance.Connect()
メソッドを実装ください。
下記が具体的な実装例です:
using UnityEngine;
using System.Collections;
public class TenjinExampleScript : MonoBehaviour {
// Use this for initialization
void Start () {
BaseTenjin instance = Tenjin.getInstance("API_KEY");
instance.Connect();
}
// Update is called once per frame
void Update () {
}
void OnApplicationPause(bool pauseStatus){
if(pauseStatus){
//do nothing
}
else
{
BaseTenjin instance = Tenjin.getInstance("API_KEY");
instance.Connect();
}
}
}
ATTrackingManagerを使用した場合のTenjinの初期化処理:
iOS 14では、ATTrackingManagerを使用して許可プロンプトを表示し、ユーザをオプトイン/オプトアウトする事が可能です。
デバイスがトラッキングの許可を行わない場合は、IDFAはゼロとなります。デバイスがトラッキングの許可を行った場合、connect()
メソッドを通じてIDFAがサーバ側に送られます。
ATTrackingManagerを使用せずに、Tenjinのconnect()
処理を行うことも可能です。ATTrackingManagerの許可プロンプトの実装は2021年初春のiOS14.5のリリースまでの間は必須ではありません。
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("API_KEY");
#if UNITY_IOS
// Tenjin wrapper for requestTrackingAuthorization
instance.RequestTrackingAuthorizationWithCompletionHandler((status) => {
Debug.Log("===> App Tracking Transparency Authorization Status: " + status);
// Sends install/open event to Tenjin
instance.Connect();
});
#elif UNITY_ANDROID
// Sends install/open event to Tenjin
instance.Connect();
#endif
}
}
SKAdNetworkとコンバージョンバリュー:
SKAdNetworkの導入に従って, TenjinではregisterAppForAdNetworkAttribution()
とupdateConversionValue(_:)
の2種類のラッパーメソッドを用意しています。
これらのメソッドは、該当のSKAdNetworkのメソッドをコールし、コンバージョンバリューをTenjinのサーバに送信します。
updateConversionValue(_:)
の6ビットの値はアプリ内イベントに対応する値で、バイナリ値ではなく0-63の間の整数値である必要があります。これ以外の数値の場合、サーバ側でエラーとなります。
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("API_KEY");
#if UNITY_IOS
// Registers SKAdNetwork app for attribution
instance.RegisterAppForAdNetworkAttribution();
// Sends install/open event to Tenjin
instance.Connect();
// Sets SKAdNetwork Conversion Value
// You will need to use a value between 0-63 for <YOUR 6 bit value>.
instance.UpdateConversionValue(<YOUR 6 bit value>);
#elif UNITY_ANDROID
// Sends install/open event to Tenjin
instance.Connect();
#endif
}
}
Tenjin GDPR対応について:
GDPRへの対応において、Tenjin SDKではデバイス/ユーザのオプトイン, オプトアウトおよび各デバイスパラメータのオプトイン, オプトアウトが可能です。OptOut()
メソッドにより、Tenjinにリクエストが送られることはありません。
オプトイン, オプトアウトの具体例:
void Start () {
BaseTenjin instance = Tenjin.getInstance("API_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()
メソッドにより、指定されたパラーメータ以外のパラメータを送信します。
特定のデバイスパラメータのみを取得するには、OptInParams()
を使用します。下記具体例では、ip_address
, advertising_id
, developer_device_id
, limit_ad_tracking
, referrer
, and iad
のみを取得しています。
void Start () {
BaseTenjin instance = Tenjin.getInstance("API_KEY");
List<string> optInParams = new List<string> {"advertising_id", "developer_device_id", "limit_ad_tracking", "referrer", "device_all", "iad"};
instance.OptInParams(optInParams);
instance.Connect();
}
特定のデバイスパラメータ以外のパラメータを取得するには、OptOutParams()
メソッドを使用します。下記具体例では、locale
, timezone
, and build_id
以外のパラメータを送信ししています。
void Start () {
BaseTenjin instance = Tenjin.getInstance("API_KEY");
List<string> optOutParams = new List<string> {"country", "timezone", "language"};
instance.OptOutParams(optOutParams);
instance.Connect();
}
デバイスパラメータ
パラメータ | 詳細 | プラットフォーム | 参照 |
---|---|---|---|
advertising_id | 広告ID | Android) | |
developer_device_id | ベンダーID | iOS | |
limit_ad_tracking | limit ad tracking enabled | Android) | |
platform | platform | All | |
os_version | OSバージョン | Android | |
device | デバイス名 | Android | |
device_manufacturer | デバイス製造元 | Android | |
device_model | デバイスモデル | Android | |
device_brand | デバイスブランド | Android | |
device_product | デバイスプロダクト | Android | |
carrier | キャリア | Android) | |
connection_type | セルラーまたはWifi | All | Android) |
screen_width | デバイススクリーン幅 | All | Android |
screen_height | デバイススクリーン高さ | All | Android |
os_version_release | リリース時OSバージョン | All | Android |
build_id | ビルドID | All | Android |
locale | デバイスロケール | All | Android) |
Tenjinアプリ内課金実装手順:
iOSレシート検証
iOSのレシート検証には、transactionId
とreceipt
が必要です。(signature
にはnull
がセットされます) receipt
にはUnityから受け取ったレシートのPayload
(base64エンコードのASN.1レシート)を設定してください。
注:サブスクリプション課金の場合、 管理画面よりIAP shared secretを該当のアプリに追加してください。iOSのShared secretは、iTunes Connectのコンソールで > Select your app > Features > In-App Purchases > App-Specific Shared Secret より取得できます。
Androidレシート検証
Androidのレシート検証には、receipt
とsignature
が必要です。(transactionId
にはnull
がセットされます)
注:管理画面のAppsタブ -> 該当のAndroidアプリ -> Editより、Public Keyを入力してください。 Public Keyはお客様のGoogle Play dashboardの"Services & APIs"から取得できます。
実装例:
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 payload = (string)wrapper["Payload"]; // For Apple this will be the base64 encoded ASN.1 receipt
var productId = purchaseEventArgs.purchasedProduct.definition.id;
#if UNITY_ANDROID
var gpDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var gpJson = (string)gpDetails["json"];
var gpSig = (string)gpDetails["signature"];
CompletedAndroidPurchase(productId, currencyCode, 1, lPrice, gpJson, gpSig);
#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("API_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("API_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, TransactionId, Receipt, null);
}
}
Tenjinのカスタムイベント実装:
- お使いのUnityプロジェクトにてAssetsフォルダを含めます
- プロジェクト上で下記のメソッドを実装します。
Tenjin.getInstance("<API_KEY>").SendEvent("name")
イベント名、値を同時に送る場合には下記のメソッドを実装します。
Tenjin.getInstance("<API_KEY>").SendEvent("nameWithValue","value")
value
はinteger型としてください。value
がintejer出ない場合、イベントは送信されません。
下記がコードの例です。
void MethodWithCustomEvent(){
//event with name
BaseTenjin instance = Tenjin.getInstance ("API_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のトラッキングURL経由でユーザがインストールした後、そのユーザをアプリ内の特定ページに遷移させることが可能です。getDeeplink
メソッドとコールバックにより、ディファードディープリンクにアクセスすることが可能です。
詳細なテスト手順はこちらをご確認ください。
public class TenjinExampleScript : MonoBehaviour {
// Use this for initialization
void Start () {
BaseTenjin instance = Tenjin.getInstance("API_KEY");
instance.Connect();
instance.GetDeeplink(DeferredDeeplinkCallback);
}
public void DeferredDeeplinkCallback(Dictionary<string, string> data) {
bool clicked_tenjin_link = false;
bool is_first_session = false;
if (data.ContainsKey("clicked_tenjin_link")) {
//clicked_tenjin_link is a BOOL to handle if a user clicked on a tenjin link
clicked_tenjin_link = (data["clicked_tenjin_link"] == "true");
Debug.Log("===> DeferredDeeplinkCallback ---> clicked_tenjin_link: " + data["clicked_tenjin_link"]);
}
if (data.ContainsKey("is_first_session")) {
//is_first_session is a BOOL to handle if this session for this user is the first session
is_first_session = (data["is_first_session"] == "true");
Debug.Log("===> DeferredDeeplinkCallback ---> is_first_session: " + data["is_first_session"]);
}
if (data.ContainsKey("ad_network")) {
//ad_network is a STRING that returns the name of the ad network
Debug.Log("===> DeferredDeeplinkCallback ---> adNetwork: " + data["ad_network"]);
}
if (data.ContainsKey("campaign_id")) {
//campaign_id is a STRING that returns the tenjin campaign id
Debug.Log("===> DeferredDeeplinkCallback ---> campaignId: " + data["campaign_id"]);
}
if (data.ContainsKey("advertising_id")) {
//advertising_id is a STRING that returns the advertising_id of the user
Debug.Log("===> DeferredDeeplinkCallback ---> advertisingId: " + data["advertising_id"]);
}
if (data.ContainsKey("deferred_deeplink_url")) {
//deferred_deeplink_url is a STRING that returns the deferred_deeplink of the campaign
Debug.Log("===> DeferredDeeplinkCallback ---> deferredDeeplink: " + data["deferred_deeplink_url"]);
}
if (clicked_tenjin_link && is_first_session) {
//use the deferred_deeplink_url to direct the user to a specific part of your app
if (String.IsNullOrEmpty(data["deferred_deeplink_url"]) == false) {
}
}
}
}
iOSでは下記フレームワークが必要です
AdSupport.framework
iAd.framework
StoreKit.framework