במדריך הזה מוסבר איך למדוד את האותות לגבי ההתעניינות בכרטיסיות בהתאמה אישית ב-Chrome. אם האפליקציה מציגה למשתמשים שלה באופן קבוע קישורים לתוכן מהאינטרנט, למשל בפיד חדשות, חשוב לדעת אילו קישורים חשובים למשתמשים ואילו לא. בכרטיסיות מותאמות אישית ניתן למדוד את התעניינות המשתמשים הספציפיים לסשן על סמך מספר הניווטים, השינויים בכיוון הגלילה ועומק הגלילה. כדי לראות את האותות התעניינות בפעולה, צריך לעבור לאפליקציית ההדגמה של כרטיסיות מותאמות אישית ב-GitHub.
כרטיסיות מותאמות אישית מספקות שתי קריאות חוזרות (callback) שונות למדידת מעורבות המשתמשים:
CustomTabsCallback
למעקב אחר אירועי ניווט בסיסיים, כמו"NAVIGATION_STARTED"
או"NAVIGATION_FINISHED"
.EngagementSignalsCallback
למעקב אחרי התעניינות משתמשים ספציפיים בדף, כמו כיוון הגלילה או אחוז הגלילה.
בשניהם נדרש CustomTabsServiceConnection
פעיל. במדריך הקודם של CustomTabsService
מוסבר איך להתחבר אל CustomTabsService
.
כדי למדוד את התעניינות המשתמשים, קודם צריך ליצור CustomTabsCallback
ומכונה EngagementSignalsCallback
. CustomTabsCallback
מקבל קבוע navigationEvent
שמתאר את סוג הניווט שהתרחש:
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
יש תמיכה בשלוש קריאות חוזרות (callback):
onVerticalScrollEvent()
- נשלחת קריאה בכל פעם שהמשתמש משנה את כיוון הגלילה, כאשר
isDirectionUp
(הארגומנט הראשון) מציין את הכיוון.
onGreatestScrollPercentageIncreased
: הכרטיסייה המותאמת אישית מציינת את עומק הגלילה במרווחי זמן של 5% עד 100% כשהמשתמש הגיע לתחתית הדף. הקריאה החוזרת מופעלת רק כשהמשתמש מפסיק לגלול. הערך מתאפס ל-0% בכל ניווט חדש.onSessionEnded
: הכרטיסייה 'בהתאמה אישית' מפעילה את האירוע הזה כשהיא מפסיקה לשלוח אותות התעניינות (לדוגמה, אחרי שהמשתמש סגר את הכרטיסייה 'מותאם אישית'). הערךdidUserInteract
יהיה תקף אם למשתמש הייתה אינטראקציה עם הדף באופן כלשהו (גלילה, לחיצה על לחצן וכו').
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");
}
};
גם ב-CustomTabsCallback
וגם ב-EngagementSignalsCallback
נדרש חיבור פעיל לשירות 'כרטיסייה מותאמת אישית'. לאחר חיבור השירות, ניתן ליצור CustomTabsSession
חדש על ידי קריאה ל-CustomTabsClient.newSession()
והעברת CustomTabsCallback
.
לאחר מכן, צריך להפעיל את isEngagementSignalsApiAvailable()
כדי לבדוק אם הדפדפן הנוכחי תומך באותות של מעורבות. אם הם נתמכים, אפשר לרשום את EngagementSignalsCallback
דרך 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;
}
};
כל מה שצריך לעשות הוא לקשר את 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);
}