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 strumieniach 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 działań związanych z przemieszczaniem się po stronie, 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:
CustomTabsCallback
do ś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).didUserInteract
bę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);
}