このガイドでは、Chrome カスタムタブのエンゲージメント シグナルを測定する方法について説明します。ニュース フィードなどで、ウェブ コンテンツへのリンクを定期的にユーザーに表示するアプリの場合は、どのリンクが有益で、どのリンクが有用でないかを把握することが重要になります。カスタムタブでは、ナビゲーションの回数、スクロール方向の変化、スクロール距離を通じて、セッション固有のユーザー エンゲージメントを測定できます。実際のエンゲージメント シグナルを確認するには、GitHub で Custom Tabs デモアプリをご覧ください。
<ph type="x-smartling-placeholder">カスタムタブには、ユーザー エンゲージメントを測定するためのコールバックが 2 種類用意されています。
CustomTabsCallback
:"NAVIGATION_STARTED"
や"NAVIGATION_FINISHED"
などの基本的なナビゲーション イベントをトラッキングします。EngagementSignalsCallback
: スクロールの方向やスクロールの割合など、ページの特定のユーザー エンゲージメントをトラッキングします。
どちらもアクティブな CustomTabsServiceConnection
が必要です。CustomTabsService
に接続する方法については、前の CustomTabsService
ガイドをご覧ください。
ユーザー エンゲージメントを測定するには、まず CustomTabsCallback
インスタンスと EngagementSignalsCallback
インスタンスを作成します。CustomTabsCallback
は、どのようなナビゲーションが行われたかを表す navigationEvent
定数を受け取ります。
private CustomTabsCallback mCustomTabsCallback = new CustomTabsCallback() {
@Override
public void onNavigationEvent(int navigationEvent, @Nullable Bundle extras) {
String event;
switch (navigationEvent) {
case CustomTabsCallback.NAVIGATION_ABORTED:
event = "NAVIGATION_ABORTED";
break;
case CustomTabsCallback.NAVIGATION_FAILED:
event = "NAVIGATION_FAILED";
break;
case CustomTabsCallback.NAVIGATION_FINISHED:
event = "NAVIGATION_FINISHED";
break;
case CustomTabsCallback.NAVIGATION_STARTED:
event = "NAVIGATION_STARTED";
break;
case CustomTabsCallback.TAB_SHOWN:
event = "TAB_SHOWN";
break;
case CustomTabsCallback.TAB_HIDDEN:
event = "TAB_HIDDEN";
break;
default:
event = String.valueOf(navigationEvent);
}
Log.d(TAG, "onNavigationEvent (navigationEvent=" + event + ')');
mTextNavigation.setText("onNavigationEvent " + event);
}
};
EngagementSignalsCallback
は、次の 3 種類のコールバックをサポートしています。
onVerticalScrollEvent()
- ユーザーがスクロール方向を変更するたびに呼び出されます。
isDirectionUp
(最初の引数)は方向を示します。
onGreatestScrollPercentageIncreased
: ユーザーがページの一番下に達すると、カスタムタブのスクロール距離を 5% 間隔で最大 100% までシグナルします。コールバックはユーザーがスクロールを停止したときにのみ呼び出されます。値は、新しいナビゲーションごとに 0% にリセットされます。onSessionEnded
: カスタムタブでは、エンゲージメント シグナルの送信が停止したとき(ユーザーがカスタムタブを閉じた後など)に、このイベントが発生します。didUserInteract
は、ユーザーがなんらかの操作(スクロールやボタンのクリックなど)を行っていた場合、true になります。
private EngagementSignalsCallback mEngagementSignalsCallback = new EngagementSignalsCallback() {
@Override
public void onVerticalScrollEvent(boolean isDirectionUp, @NonNull Bundle extras) {
Log.d(TAG, "onVerticalScrollEvent (isDirectionUp=" + isDirectionUp + ')');
mTextVerticalScroll.setText("vertical scroll " + (isDirectionUp ? "UP️" : "DOWN"));
}
@Override
public void onGreatestScrollPercentageIncreased(int scrollPercentage, @NonNull Bundle extras) {
Log.d(TAG, "scroll percentage: " + scrollPercentage + "%");
mTextGreatestPercentage.setText("scroll percentage: " + scrollPercentage + "%");
}
@Override
public void onSessionEnded(boolean didUserInteract, @NonNull Bundle extras) {
Log.d(TAG, "onSessionEnded (didUserInteract=" + didUserInteract + ')');
mTextSessionEnd.setText(didUserInteract ? "session ended with user interaction" : "session ended without user interaction");
}
};
CustomTabsCallback
と EngagementSignalsCallback
の両方ともアクティブなカスタムタブ サービス接続が必要です。サービスが接続されたら、CustomTabsClient.newSession()
を呼び出して CustomTabsCallback
を渡すことで、新しい CustomTabsSession
を作成できます。
その後、isEngagementSignalsApiAvailable()
を呼び出して、現在のブラウザがエンゲージメント シグナルに対応しているかどうかを確認する必要があります。サポートされている場合は、CustomTabsSession.setEngagementSignalsCallback()
から EngagementSignalsCallback
を登録できます。
private CustomTabsClient mCustomTabsClient;
private CustomTabsSession mCustomTabsSession;
private final CustomTabsServiceConnection mServiceConnectionCallback = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(@NonNull ComponentName name, @NonNull CustomTabsClient client) {
mCustomTabsClient = client;
mCustomTabsSession = mCustomTabsClient.newSession(mCustomTabsCallback);
try {
boolean engagementSignalsApiAvailable = mCustomTabsSession.isEngagementSignalsApiAvailable(Bundle.EMPTY);
if (!engagementSignalsApiAvailable) {
Log.d(TAG, "CustomTab Engagement signals not available, make sure to use the " +
"latest Chrome version and enable via chrome://flags/#cct-real-time-engagement-signals");
return;
}
mCustomTabsSession.setEngagementSignalsCallback(mEngagementSignalsCallback, Bundle.EMPTY);
} catch (RemoteException e) {
Log.w(TAG, "The Service died while responding to the request.", e);
} catch (UnsupportedOperationException e) {
Log.w(TAG, "Engagement Signals API isn't supported by the browser.", e);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
mCustomTabsClient = null;
mConnection = null;
mCustomTabsSession = null;
}
};
あとは CustomTabsService
をバインドするだけです。
@Override
protected void onStart() {
super.onStart();
bindCustomTabsService();
}
private void bindCustomTabsService() {
String packageName = CustomTabsHelper.getPackageNameToUse(this);
if (packageName == null) return;
CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}