[AEP Mobile SDK × EdgeNetwork]アプリのAdobeAnalytics計測 Android編

catch-img

1. はじめに

アプリにおける AdobeAnalyticsの設定はそこまで複雑ではありませんが、世の中にあまり情報がありません。

また、設定方法も複数あるため、情報が古かったり、「この解説はどの方法での設定だ?」となることも少なくありません。

英語になりますが Adobeのこちらのページを見ると現在3つの方法が存在することが分かります。

https://developer.adobe.com/client-sdks/solution/adobe-analytics/migrate-to-edge-network

出典:Migrate from Analytics mobile extension to Adobe Experience Platform Edge Network

上図の一番下の「Analytics extension」を使う方法は弊社の過去のブログをご覧ください。(ReactNative/Android)
※古い方法ですので今から新しく設定する場合はこの方法はお勧めいたしません。

今回は最新かつAdobeも推奨している 「Edge Network extension」を使用した方法を紹介します。

何回かに分けて、Android(Kotlin) / iOS(Swift)/ Flutter(dart)/ ReactNative(JavaScript) の場合で書いていきたいと思います。今回は Android(Kotlin)になります。

以下、UIの設定はすべて共通になります。

2. UIの設定

2-1. AdobeDataCollectionでプロパティを作成

まずはmobile用のプロパティを作成します。

Platformで 「Mobile」を選びましょう。

2-2. extensinsを追加

初期段階で「Mobile Core」と「Profile」という Extensionが入っています。

EdgeNetworkの方法ではここに

  • Adobe Experience Platform Edge Network
  • AEP Assurance
  • Identity

を追加します。(必要なら Consent も)

※本記事では Identity, Assurance, Consentの説明はいたしません。

この時点では中身は何も設定しなくてOKなので、初期Buildだけしておきましょう。

2-3. Datastreamの設定

2-3-1. そもそもDatastreamとはなにか?

ざっくりいうと「交通整理係」です。

アプリのSDKから送信されたデータは EdgeNetworkを通って運ばれます。
そしてDatastreamに到着すると、Datastreamが「このデータは AdobeAnalyticsに送るね」「こっちのデータはAdobeTargetに送るね」などの交通整理をしてデータを飛ばし先を決めていきます。

本記事は設定方法にフォーカスしているので、座学の詳細は省きますが、上記のようなイメージを持っていれば大丈夫だと思います。

2-3-2. Datastreamの設定

AdobeDataCollectionもしくは、AdobeExperiencePlatformのUIからデータストリームに進みます。

右上の「New Datastream」からDatastream作成画面に進みます。

この画面では Name だけ入力すればOKです。(Adobe Analyticsで使うだけなら)
Name入力して「Save」を押しましょう。

「Add Service」をクリック

Serviceで AdobeAnalytics を選び、Report Suite IDを入力します。
そして、「Save」。

最終的にこんな画面になったら完了です。

本番環境と開発環境などでレポートスイート分かれている、などの場合はそれぞれでDatastreamを複数作りましょう。

一覧画面に戻ると作成したDatastreamが表示されています。

2-4. AEP ExtensionのDatastreams設定

DataCollectionに戻り、「Adobe Experience Platform Edge Network」のExtensionの Configureを開き、Datastreamの設定をします。

先程作成した Datastreamを設定します。
環境ごとに設定したい場合はそれぞれでDatastreamを変更してください。

これで、DataCollectionおよび Datastreamの設定は完了です。

最後に、EnvironmentsのFileIDは後々使うのでメモしておきましょう。

3. コードの記載

最初に述べたように本記事は、Android(Kotlin)を想定しています。

3-1. build.gradle.kts(:app)

必要なものをインプリメントします。
ひとまず全部盛りであれば以下のような感じになると思います。

// Adobe Experience Platform Mobile SDK
 // BOM (Bill of Materials) to manage all Adobe SDK versions
 implementation(platform("com.adobe.marketing.mobile:sdk-bom:3.+"))
 
 // Required extensions for Edge Network implementation
 implementation("com.adobe.marketing.mobile:core")
 implementation("com.adobe.marketing.mobile:edge")
 implementation("com.adobe.marketing.mobile:edgeidentity")
 implementation("com.adobe.marketing.mobile:lifecycle")
 implementation("com.adobe.marketing.mobile:signal")
 implementation("com.adobe.marketing.mobile:userprofile")
 
 // Recommended for debugging
 implementation("com.adobe.marketing.mobile:assurance")

3-2. AndroidManifest.xml

AEP ADK はライフサイクルも追跡するので、Applicationクラスでの設定が必要です。
MainApplicationのクラスが存在しない場合は、新規に作成することになるので
AndroidManifest.xml も編集します。

具体的には application タグに android:name を追加します。

<application 
    android:name=".MainApplication" 
    android:allowBackup="true" 
    android:dataExtractionRules="@xml/data_extraction_rules" 
    android:fullBackupContent="@xml/backup_rules" 

3-2. Import と 初期化

3-2-1. Import

必要なものを import します

import com.adobe.marketing.mobile.Assurance 
import com.adobe.marketing.mobile.Edge 
import com.adobe.marketing.mobile.ExperienceEvent 
import com.adobe.marketing.mobile.Extension 
import com.adobe.marketing.mobile.LoggingMode 
import com.adobe.marketing.mobile.MobileCore 
import com.adobe.marketing.mobile.edge.identity.AuthenticatedState 
import com.adobe.marketing.mobile.edge.identity.Identity 
import com.adobe.marketing.mobile.edge.identity.IdentityItem 
import com.adobe.marketing.mobile.edge.identity.IdentityMap 

3-2-2. MainApplication

ここで初期化を行います。

古い方法では MobileCore.setApplication() を実行し、さらに MobileCore.registerExtensions() で1つ1つ extensionを登録していたり、 MobileCore.lifecycleStart() など個別に記載していましたが、それは不要です。

MobileCore.initialize() ですべて勝手にやってくれます。(SDKのバージョンが 3.8以上で使えます)

class MainApplication : Application() { 
    private val ENVIRONMENT_FILE_ID = "<<2-4 でコピーした Environment の FileID >>"
  
    override fun onCreate() { 
        super.onCreate() 
 
        MobileCore.setLogLevel(LoggingMode.DEBUG) 
        MobileCore.initialize(this, ENVIRONMENT_FILE_ID) { 
            Log.d("MainApplication", "AEP Mobile SDK is initialized") 
        } 
    } 
} 

3-3. イベントを送信するコード

3-3-1. コードを書く前に

コードを書く前にすこーーーしだけ軽く座学を。

EdgeNetworkを利用する方法ではパラメータの持ち方が特殊です。
WEBのAdobeAnalyticsを WebSDKで設定したことがある方なら聞いたことはあると思いますが
基本的には「XDM スキーマ」という形式に則りイベントデータを生成します。

WebSDKやMobileSDK は AdobeAnalyticsだけではなく、CustomerJourneyAnalytics(CJA)や Real-Time CDP(RTCDP) などでも共通して使用されるため、統一した形式を整備しています。

※Adobeの思想としては、様々な業界や業種に渡って顧客体験データを共通のルール(モデル)で標準化して Adobe Experience Platform全体で意味を持つようにする仕組みを作ろうといった感じです。

詳細はAdobeのドキュメントを参照ください。

https://experienceleague.adobe.com/ja/docs/experience-platform/xdm/home

https://experienceleague.adobe.com/ja/docs/analytics/implementation/aep-edge/xdm-var-mapping

・・・

と、ここまでXDMの話をしていたのですが、AdobeAnalytics(とAdobeTarget)は特殊で
XDMを意識しなくても、 WebSDKや MobileSDK を使いEdgeNetwork経由で計測が可能です。

具体的には「dataオブジェクト」を使うことで、Appmeasurement.js での記述に近しい書き方で定義することができます。

https://experienceleague.adobe.com/ja/docs/analytics/implementation/aep-edge/data-var-mapping

XDM と dataオブジェクトの両方を併用することも可能です。

以下、せっかくですので両方を使用したパターンで記述してみます。

3-3-2. ページビュー(スクリーンビュー)を送るコード例

fun trackScreenView(screenName: String) { 
    val xdmData: MutableMap<String, Any> = mutableMapOf( 
        "eventType" to "web.webpagedetails.pageViews", 
        "web" to mapOf( 
            "webPageDetails" to mapOf( 
                "name" to screenName, 
                "pageViews" to mapOf("value" to 1) 
            ) 
        ) 
    ) 
  
    val dataObj: MutableMap<String, Any> = mutableMapOf( 
        "__adobe" to mapOf( 
            "analytics" to mapOf( 
                "events" to "event1,event2", 
                "prop1" to "data-prop1", 
                "prop5" to "data-prop5", 
                "eVar1" to "data-eVar1", 
                "eVar5" to "data-eVar5"
            ) 
        ), 
    ) 
  
    val event = ExperienceEvent.Builder().setXdmSchema(xdmData).setData(dataObj).build() 
    Edge.sendEvent(event) { 
        Log.d("AdobeScreenView", "screen view event sent") 
    } 
} 

3-3-3. リンクトラックを送るコード例

fun trackAction() {  
    val xdmData: MutableMap<String, Any> = mutableMapOf(  
        "eventType" to "web.webinteraction.linkClicks",  
        "web" to mapOf(  
            "webInteraction" to mapOf(  
                "name" to "My Custom Link",  
                "type" to "other",  
            )  
        ),  
    )  
   
    val dataObj: MutableMap<String, Any> = mutableMapOf(  
        "__adobe" to mapOf(  
            "analytics" to mapOf(  
                "events" to "event1,event2",  
                "prop1" to "click prop1",  
                "prop2" to "click prop2",  
                "eVar1" to "click eVar1",  
                "eVar2" to "click eVar2" 
            )  
        )  
    )  
   
    val event = ExperienceEvent.Builder().setXdmSchema(xdmData).setData(dataObj).build()  
    Edge.sendEvent(event) {  
        Log.d("AdobeScreenView", "add to cart event sent")  
    }  
}

3-3-4. 解説

上記の xdmData で定義しているオブジェクトが 「XDMスキーマ」
dataObj で定義しているオブジェクトが「dataオブジェクト」になります。

「dataオブジェクト」は Appmeasurement.js で sオブジェクトに eVar や prop を定義する形に近いですね。

さて、ここで疑問に思う人もいるかもしれません。

WEBの Appmeasurement.js であれば「 s.t() 」と「 s.tl() 」がありました。
旧来のアプリ実装でも「 trackState() 」と「 trackAction() 」のメソッドが用意されていました。

しかし、上記の例を見てみると、screen_view であってもリンクトラックであっても
最終的に使っているメソッドは同じで「 Edge.sendEvent(event) 」になっています。

「メソッドが同じなのにどうやって2種の分類をしているのか?」

と当然気になるところかと思います。

Adobe:「メソッド分かれてないです」

我々:「えっ!?」

Adobe:「ないです!」

我々:「Oh…」

・・・

となるところですが安心してください。
これにはルールが決まっており、詳しくはAdobeのドキュメントをご覧ください。
Adobe Analytics の Edge Network イベントタイプ | Adobe Analytics

簡単に説明します。

XDMの場合

①『 xdm.web.webPageDetails.nameor xdm.web.webPageDetails.URL が存在し
かつ
xdm.web.webInteraction.typeが存在しない』

⇒ ページビュー( s.t() , trackState() 相当)になります。


②『 xdm.eventType に web.webpagedetails.pageViews を設定している』

⇒ ページビュー( s.t() , trackState() 相当)になります。


③『 xdm.web.webInteraction.type が存在する』

⇒ リンクトラック( s.tl() , trackAction() 相当)になります。


④『 xdm.web.webPageDetails.name、xdm.web.webPageDetails.URL 、xdm.web.webInteraction.type のいずれも存在ない』

⇒ データは無視されます

dataオブジェクトの場合

⑤『 data.__adobe.analytics.pageName or  data . __adobe . analytics . pageURL が存在し』
かつ
『 data.__adobe.analytics.linkType が存在しない』

⇒ ページビュー( s.t() , trackState() 相当)になります。


⑥『 data.__adobe.analytics.linkType が存在する』

⇒ リンクトラック( s.tl() , trackAction() 相当)になります。


⑦『 data.__adobe.analytics.pageName 、data . __adobe . analytics . pageURL、data.__adobe.analytics.linkType のいずれも存在しない』

⇒データは無視されます

つまり、 オブジェクトを構成するペイロードの中身によって
scree_viewとして扱われるか、リンクトラックとして扱われるか、破棄されるかが変わるということ
です。

ここは意識して設定をするようにしましょう。(※これはWebSDKによるウェブの実装でも同様です)

上記の例では・・・

スクリーンビューのコードでは ①、②を満たしているので s.t() , trackState() 相当になります。

リンクトラックのコードは ③ を満たしているので s.tl() , trackAction() 相当になります。

4. まとめ

以上となります。

ライフサイクルなどを追う場合は、DataCollectionの方でも追加の設定が必要だったりしますが、
基本的な設定は本記事で出来ていて計測ができるようになると思います。

XDMの話などは深く知ろうとすると沼にハマる部分もあるのですが
設定自体はそこまで複雑ではなく実装できそうですよね!

実際は、設定したあとに「検証」のフェーズになると思います。
検証方法としては、てっとり早いのはAdobeAnalyticsのリアルタイムレポートを見ることです。

細かいリクエストヒットなどを見たい場合は「Experience Platform Assurance」を使うことをお勧めします。
(実は、本記事の設定でも Assurance はインストールしています)

Assuranceの設定をすると、以下のようにEdgeNetwork経由でのヒットや AdobeAnalyticsへ実際に送信されるときのヒットなど細かくみることができます。

MobileSDKで使用するにあたっては、アプリ側でディープリンクの挙動制御の設定などが必要ですので
本記事での説明は割愛させていただきます。

Assuranceについても詳しく知りたいなどのご要望があればぜひ教えてください。

弊社ではAdobeAnalyticsやGoogleAnalyticsのカスタム実装をはじめKarte、ContentSquare、サーバーサイドGTMなどマーケティングツールを幅広く扱っております。
お問い合わせは こちらからどうぞ。


Tomonaga
Tomonaga

人気記事ランキング

タグ一覧