Nutzerinteraktion messen

In diesem Leitfaden wird erläutert, wie Sie Signale zur Interaktion auf benutzerdefinierten Chrome-Tabs messen. Wenn Nutzern in Ihrer App regelmäßig Links zu Webinhalten präsentiert werden, z. B. in einem Nachrichtenfeed, ist es unter Umständen wichtig zu wissen, welche Links Nutzer wertvoll finden und welche nicht. Auf benutzerdefinierten Tabs lassen sich sitzungsspezifische Nutzerinteraktionen über die Anzahl der Navigationen, Änderungen der Scrollrichtung und die Scrolltiefe messen. Wenn Sie Signale zur Interaktion in Aktion sehen möchten, rufen Sie die Demo-App für benutzerdefinierte Tabs auf GitHub auf.

Demo zu Signalen zur Interaktion auf dem benutzerdefinierten Tab.

Benutzerdefinierte Tabs bieten zwei verschiedene Callbacks zur Messung der Nutzerinteraktion:

  • CustomTabsCallback zum Erfassen grundlegender Navigationsereignisse wie "NAVIGATION_STARTED" oder "NAVIGATION_FINISHED"
  • EngagementSignalsCallback zum Erfassen seitenspezifischer Nutzerinteraktionen, z. B. Scrollrichtung oder Scrollprozentsatz

Beide erfordern eine aktive CustomTabsServiceConnection. Weitere Informationen zum Herstellen einer Verbindung mit einem CustomTabsService findest du im vorherigen CustomTabsService-Leitfaden.

Erstellen Sie zuerst eine CustomTabsCallback- und eine EngagementSignalsCallback-Instanz, um das Nutzer-Engagement zu messen. Der CustomTabsCallback empfängt eine navigationEvent-Konstante, die beschreibt, welche Art von Navigation stattgefunden hat:

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

Das EngagementSignalsCallback unterstützt drei verschiedene Callbacks:

onVerticalScrollEvent()
Wird jedes Mal aufgerufen, wenn der Nutzer die Scrollrichtung ändert, wobei isDirectionUp (das erste Argument) die Richtung angibt.
  1. onGreatestScrollPercentageIncreased: Der benutzerdefinierte Tab signalisiert die Scrolltiefe in 5 %-Intervallen bis zu 100 %, wenn der Nutzer den unteren Bereich der Seite erreicht. Der Callback wird erst aufgerufen, wenn der Nutzer das Scrollen beendet. Der Wert wird bei jeder neuen Navigation auf 0% zurückgesetzt.
  2. onSessionEnded: Dieses Ereignis wird auf dem benutzerdefinierten Tab ausgelöst, wenn keine weiteren Interaktionsdaten mehr gesendet werden (z. B. nachdem der Nutzer den benutzerdefinierten Tab geschlossen hat). didUserInteract ist „true“, wenn der Nutzer mit der Seite interagiert hat (Scrollen, Klicken auf eine Schaltfläche usw.).
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");
    }
};

Sowohl CustomTabsCallback als auch EngagementSignalsCallback erfordern eine aktive Verbindung zum benutzerdefinierten Tab. Sobald der Dienst verbunden ist, können Sie ein neues CustomTabsSession erstellen, indem Sie CustomTabsClient.newSession() aufrufen und das CustomTabsCallback-Objekt übergeben.

Anschließend kannst du isEngagementSignalsApiAvailable() aufrufen, um zu prüfen, ob Signale zur Interaktion vom aktuellen Browser unterstützt werden. Wenn sie unterstützt werden, kannst du dein EngagementSignalsCallback über CustomTabsSession.setEngagementSignalsCallback() registrieren.

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

Jetzt müssen Sie nur noch CustomTabsService binden:

@Override
protected void onStart() {
    super.onStart();
    bindCustomTabsService();
}

private void bindCustomTabsService() {
    String packageName = CustomTabsHelper.getPackageNameToUse(this);
    if (packageName == null) return;
    CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}