É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 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">
</ph> <ph type="x-smartling-placeholder">
</ph> Démonstration des signaux d'engagement avec l'onglet personnalisé.

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