Misurare il coinvolgimento degli utenti

Questa guida spiega come misurare gli indicatori di coinvolgimento per le schede personalizzate di Chrome. Se la tua app mostra regolarmente link a contenuti web agli utenti, ad esempio in un feed di notizie, può essere importante sapere quali link gli utenti trovano utili e quali no. In Schede personalizzate, puoi misurare il coinvolgimento degli utenti specifico per sessione tramite il numero di navigazioni, le modifiche alla direzione di scorrimento e la profondità di scorrimento. Per vedere gli indicatori di coinvolgimento in azione, dai un'occhiata all'app demo di Custom Tabs su GitHub.

Demo degli indicatori di coinvolgimento delle schede personalizzate.

Custom Tabs fornisce due diversi callback per misurare il coinvolgimento degli utenti:

  • CustomTabsCallback per monitorare eventi di navigazione di base, come "NAVIGATION_STARTED" o "NAVIGATION_FINISHED".
  • EngagementSignalsCallback per monitorare il coinvolgimento degli utenti in pagine specifiche, ad esempio la direzione di scorrimento o la percentuale di scorrimento.

Entrambi richiedono un CustomTabsServiceConnection attivo. Consulta la guida precedente su CustomTabsService per informazioni dettagliate su come connetterti a un CustomTabsService.

Per misurare il coinvolgimento degli utenti, devi prima creare un'istanza CustomTabsCallback e un'istanza EngagementSignalsCallback. CustomTabsCallback riceve una costante navigationEvent che descrive il tipo di navigazione che si è verificato:

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 supporta tre diversi callback:

onVerticalScrollEvent()
Chiamato ogni volta che l'utente cambia la direzione di scorrimento, dove isDirectionUp (il primo argomento) indica la direzione.
  1. onGreatestScrollPercentageIncreased: la scheda personalizzata indica la profondità di scorrimento a intervalli del 5% fino al 100% quando l'utente raggiunge la fine della pagina. Il callback viene invocato solo quando l'utente interrompe lo scorrimento. Il valore viene reimpostato su 0% a ogni nuova navigazione.
  2. onSessionEnded: la scheda personalizzata attiva questo evento quando smette di inviare indicatori di coinvolgimento (ad esempio, dopo che l'utente ha chiuso la scheda personalizzata). didUserInteract sarà true se l'utente ha interagito con la pagina in qualsiasi modo (scorrimento, clic sul pulsante e così via).
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");
    }
};

Sia CustomTabsCallback sia EngagementSignalsCallback richiedono una connessione al servizio Schede personalizzate attiva. Una volta collegato il servizio, puoi creare un nuovo CustomTabsSession chiamando CustomTabsClient.newSession() e passando il CustomTabsCallback.

Successivamente, devi chiamare isEngagementSignalsApiAvailable() per verificare se gli indicatori di coinvolgimento sono supportati dal browser corrente. Se sono supportati, puoi registrare il tuo EngagementSignalsCallback tramite 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;
    }
};

Non resta che associare 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);
}