Z tego przewodnika dowiesz się, jak mierzyć sygnały zaangażowania w przypadku kart niestandardowych w Chrome. Jeśli Twoja aplikacja regularnie wyświetla użytkownikom linki do treści internetowych, np. w przeglądarce wiadomości, warto wiedzieć, które linki są dla nich wartościowe, a które nie. W kartach niestandardowych możesz mierzyć zaangażowanie użytkowników w poszczególnych sesjach na podstawie liczby przejść, zmian kierunku przewijania i głębokości przewijania. Aby zobaczyć sygnały zaangażowania w działaniu, skorzystaj z aplikacji demonstracyjnej kart niestandardowych na GitHubie.
Karty niestandardowe udostępniają 2 różne funkcje wywoływane z powrotem służące do pomiaru zaangażowania użytkowników:
CustomTabsCallbackdo śledzenia podstawowych zdarzeń nawigacji, takich jak"NAVIGATION_STARTED"lub"NAVIGATION_FINISHED".EngagementSignalsCallback– do śledzenia zaangażowania użytkowników na konkretnej stronie, np. kierunku przewijania lub odsetka przewinięcia.
Oba wymagają aktywnego CustomTabsServiceConnection. Szczegółowe informacje o nawiązywaniu połączenia z CustomTabsService znajdziesz w poprzednim przewodniku CustomTabsService.
Aby mierzyć zaangażowanie użytkowników, najpierw utwórz instancję CustomTabsCallback i EngagementSignalsCallback. Funkcja CustomTabsCallback otrzymuje stałą wartość navigationEvent, która określa, jaki rodzaj nawigacji miał miejsce:
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 obsługuje 3 różne wywołania zwrotne:
onVerticalScrollEvent()- Wywoływany za każdym razem, gdy użytkownik zmieni kierunek przewijania. Argument
isDirectionUp(pierwszy argument) wskazuje kierunek.
onGreatestScrollPercentageIncreased: karta niestandardowa sygnalizuje głębokość przewijania co 5% do 100%, gdy użytkownik dotrze do dołu strony. Funkcja wywołania zwrotnego jest wywoływana dopiero wtedy, gdy użytkownik przestanie przewijać. Wartość jest resetowana do 0% przy każdej nowej nawigacji.onSessionEnded: karta niestandardowa uruchamia to zdarzenie, gdy przestanie wysyłać sygnały zaangażowania (np. gdy użytkownik ją zamknie).didUserInteractbędzie miał wartość Prawda, jeśli użytkownik w jakikolwiek sposób wejdzie w interakcję ze stroną (przewinie ją, kliknie przycisk itp.).
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"); } }; Zarówno CustomTabsCallback, jak i EngagementSignalsCallback wymagają aktywnego połączenia z usługą kart niestandardowych. Po połączeniu usługi możesz utworzyć nową CustomTabsSession, wywołując funkcję CustomTabsClient.newSession() i przekazując argument CustomTabsCallback.
Następnie zadzwoń pod numer isEngagementSignalsApiAvailable(), aby sprawdzić, czy sygnały zaangażowania są obsługiwane przez bieżącą przeglądarkę. Jeśli są obsługiwane, możesz zarejestrować EngagementSignalsCallback za pomocą 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; } }; Teraz wystarczy powiązać 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); }