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 agli utenti link a contenuti web, ad esempio in un feed di notizie, può essere importante sapere quali link sono ritenuti utili dagli utenti e quali no. Nelle schede personalizzate puoi misurare il coinvolgimento degli utenti in base alla sessione tramite il numero di navigazioni, le variazioni della direzione di scorrimento e la profondità di scorrimento. Per vedere gli indicatori di coinvolgimento in azione, controlla l'app demo Schede personalizzate su GitHub.

Demo sugli indicatori di coinvolgimento della Scheda personalizzata.

Le schede personalizzate offrono due diversi callback per misurare il coinvolgimento degli utenti:

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

Entrambi richiedono una CustomTabsServiceConnection attiva. Per informazioni dettagliate su come effettuare il collegamento a un CustomTabsService, consulta la guida precedente di 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 effettuata:

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()
Richiamato 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 con intervalli del 5% fino al 100% quando l'utente raggiunge la fine della pagina. Il callback viene attivato solo quando l'utente smette di scorrere. Il valore viene reimpostato sullo 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 si verifica 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 che EngagementSignalsCallback richiedono una connessione al servizio Scheda personalizzata attiva. Una volta che il servizio è connesso, puoi creare un nuovo CustomTabsSession chiamando CustomTabsClient.newSession() e trasmettendo il CustomTabsCallback.

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