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 per una sessione specifica tramite il numero di navigazioni, le modifiche alla direzione di scorrimento e la profondità di scorrimento. Per vedere gli indicatori di coinvolgimento in azione, vai all'app demo sulle schede personalizzate su GitHub.

Demo degli indicatori di coinvolgimento della scheda personalizzata.
di Gemini Advanced.
.

Le schede personalizzate offrono 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 specifici con una pagina, ad esempio la direzione di scorrimento o la percentuale di scorrimento.

Entrambi richiedono una CustomTabsServiceConnection attiva. Per informazioni dettagliate su come eseguire il collegamento a un CustomTabsService, consulta la guida precedente a CustomTabsService.

Per misurare il coinvolgimento degli utenti, crea prima un'istanza CustomTabsCallback e un'istanza EngagementSignalsCallback. CustomTabsCallback riceve una costante navigationEvent che descrive il tipo di navigazione avvenuta:

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 a intervalli del 5%, fino al 100% quando l'utente raggiunge la parte inferiore della pagina. Il callback viene attivato solo quando l'utente smette di scorrere. 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 Scheda personalizzata attiva. Una volta connesso il servizio, puoi creare un nuovo CustomTabsSession chiamando CustomTabsClient.newSession() e trasmettendo 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 devi fare altro 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);
}