Évaluer l'intérêt des utilisateurs

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.

Démonstration des signaux d'engagement des onglets personnalisés.

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.
  1. 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.
  2. 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);
}