Ce guide explique comment mesurer les signaux d'engagement pour les onglets personnalisés Chrome. Si votre application présente régulièrement des liens vers du contenu Web à ses utilisateurs, par exemple dans un flux d'actualités, il peut être important de savoir quels liens les utilisateurs trouvent utiles et lesquels non. Dans les onglets personnalisés, vous pouvez mesurer l'engagement utilisateur spécifique à la session via le nombre de navigations, les changements de direction de défilement et la profondeur de défilement. Pour voir concrètement les signaux d'engagement, consultez l'application de démonstration des onglets personnalisés sur GitHub.
Les onglets personnalisés fournissent deux rappels différents pour mesurer l'engagement utilisateur:
CustomTabsCallback
pour suivre les événements de navigation de base, tels que"NAVIGATION_STARTED"
ou"NAVIGATION_FINISHED"
.EngagementSignalsCallback
pour suivre l'engagement utilisateur spécifique à la page, comme la direction de défilement ou le pourcentage de défilement.
Les deux nécessitent un CustomTabsServiceConnection
actif. Pour savoir comment vous connecter à un CustomTabsService
, consultez le guide CustomTabsService
précédent.
Pour mesurer l'engagement utilisateur, créez d'abord une instance CustomTabsCallback
et une instance EngagementSignalsCallback
. CustomTabsCallback
reçoit une constante navigationEvent
décrivant le type de navigation qui s'est produit:
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
accepte trois types de rappels différents:
onVerticalScrollEvent()
- Appelé chaque fois que l'utilisateur modifie la direction de défilement, où
isDirectionUp
(premier argument) indique la direction.
onGreatestScrollPercentageIncreased
: l'onglet personnalisé signale la profondeur de défilement par incréments de 5% jusqu'à 100% lorsque l'utilisateur a atteint le bas de la page. Le rappel n'est appelé que lorsque l'utilisateur arrête de faire défiler l'écran. La valeur est réinitialisée à 0% à chaque nouvelle navigation.onSessionEnded
: l'onglet personnalisé déclenche cet événement lorsqu'il cesse d'envoyer des signaux d'engagement (par exemple, après que l'utilisateur a fermé l'onglet personnalisé).didUserInteract
est vrai si l'utilisateur a interagi avec la page de quelque manière que ce soit (défilement, clic sur un bouton, etc.).
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
et EngagementSignalsCallback
nécessitent une connexion de service d'onglet personnalisé active. Une fois le service connecté, vous pouvez créer un CustomTabsSession
en appelant CustomTabsClient.newSession()
et en transmettant le CustomTabsCallback
.
Vous devez ensuite appeler isEngagementSignalsApiAvailable()
pour vérifier si les signaux d'engagement sont compatibles avec le navigateur actuel. Si elles sont compatibles, vous pouvez enregistrer votre EngagementSignalsCallback
via CustomTabsSession.setEngagementSignalsCallback()
.
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;
}
};
Il ne reste plus qu'à lier le 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);
}