Nutzerinteraktion messen

In diesem Leitfaden erfahren Sie, wie Sie Engagement-Signale für benutzerdefinierte Tabs in Chrome messen. Wenn Ihre App Nutzern regelmäßig Links zu Webinhalten anzeigt, z. B. in einem Nachrichtenfeed, ist es wichtig zu wissen, welche Links für Nutzer relevant sind und welche nicht. Auf benutzerdefinierten Tabs können Sie sitzungsspezifische Nutzerinteraktionen über die Anzahl der Navigationen, Änderungen der Scrollrichtung und die Scrolltiefe messen. In der Demo-App für benutzerdefinierte Tabs auf GitHub können Sie die Engagement-Signale in Aktion sehen.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Demo zu benutzerdefinierten Signalen für Interaktionen mit Tabs.

Benutzerdefinierte Tabs bieten zwei verschiedene Callbacks zum Messen der Nutzerinteraktion:

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

Für beide ist ein aktives CustomTabsServiceConnection erforderlich. Weitere Informationen zum Verbinden mit einem CustomTabsService findest du im vorherigen CustomTabsService-Leitfaden.

Wenn Sie das Nutzer-Engagement messen möchten, erstellen Sie zuerst eine CustomTabsCallback- und eine EngagementSignalsCallback-Instanz. CustomTabsCallback erhält eine navigationEvent-Konstante, die beschreibt, welche Art der 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);
    }
};

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: Auf dem benutzerdefinierten Tab wird die Scrolltiefe in 5-%-Intervallen bis zu 100% signalisiert, wenn der Nutzer das Ende der Seite erreicht hat. Der Callback wird erst aufgerufen, wenn der Nutzer das Scrollen beendet. Der Wert wird bei jeder neuen Navigation auf 0% zurückgesetzt.
  2. onSessionEnded: Auf dem benutzerdefinierten Tab wird dieses Ereignis ausgelöst, wenn keine Interaktionssignale 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 für CustomTabsCallback als auch für EngagementSignalsCallback ist eine aktive Verbindung zum Dienst des benutzerdefinierten Tabs erforderlich. Sobald der Dienst verbunden ist, können Sie eine neue CustomTabsSession erstellen, indem Sie CustomTabsClient.newSession() aufrufen und CustomTabsCallback übergeben.

Anschließend sollten Sie isEngagementSignalsApiAvailable() aufrufen, um zu prüfen, ob vom aktuellen Browser Engagement-Signale unterstützt werden. Wenn diese unterstützt werden, kannst du 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);
}