Ce guide explique comment mesurer les signaux d'engagement pour les onglets personnalisés Chrome. Si votre application affiche régulièrement des liens vers du contenu Web à ses utilisateurs, par exemple dans un flux d'actualités, il peut être important d'identifier les liens qui leur sont utiles et ceux qui ne les intéressent pas. 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.
<ph type="x-smartling-placeholder">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 (par exemple, la direction ou le pourcentage de défilement).
Les deux nécessitent un CustomTabsServiceConnection
actif. Consultez le guide CustomTabsService
précédent pour savoir comment vous connecter à un CustomTabsService
.
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 rappels différents:
onVerticalScrollEvent()
- Appelée chaque fois que l'utilisateur change le sens de défilement, où
isDirectionUp
(le premier argument) indique la direction.
onGreatestScrollPercentageIncreased
: l'onglet personnalisé indique une profondeur de défilement par intervalles de 5 %, jusqu'à 100% lorsque l'utilisateur a atteint le bas de la page. Le rappel n'est invoqué que lorsque l'utilisateur arrête le défilement. 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
a la valeur "true" si l'utilisateur a interagi avec la page d'une manière quelconque (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 active au service d'onglets personnalisés. 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 prises en charge, 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 vous reste plus qu'à lier 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);
}