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