מדידת מעורבות המשתמשים

במדריך הזה מוסבר איך למדוד אותות התעניינות בכרטיסיות מותאמות אישית ב-Chrome. אם באפליקציה שלכם מוצגים למשתמשים באופן קבוע קישורים לתוכן באינטרנט, למשל בפיד חדשות, יכול להיות שחשוב לדעת אילו קישורים המשתמשים מתייחסים אליהם כחשובים ואילו לא. בכרטיסיות בהתאמה אישית, אפשר למדוד את המעורבות של המשתמשים בסשן ספציפי באמצעות מספר הניווטים, השינויים בכיוון הגלילה ועומק הגלילה. כדי לראות איך אותות התעניינות פועלים, אפשר להיכנס לאפליקציית הדגמה של כרטיסיות בהתאמה אישית ב-GitHub.

דוגמה לשימוש באותות התעניינות בכרטיסייה מותאמת אישית.

בכרטיסיות בהתאמה אישית יש שתי פונקציות חזרה (callbacks) שונות למדידת ההתעניינות של המשתמשים:

  • 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 תומכת בשלושה קריאות חזרה שונות:

onVerticalScrollEvent()
הקריאה מתבצעת בכל פעם שהמשתמש משנה את כיוון הגלילה, כאשר isDirectionUp (הארגומנט הראשון) מציין את הכיוון.
  1. onGreatestScrollPercentageIncreased: הכרטיסייה המותאמת אישית מסמנת את עומק הגלילה במרווחים של 5% עד 100% כשהמשתמש מגיע לתחתית הדף. קריאת החזרה (callback) מופעלת רק אחרי שהמשתמש מפסיק לגלול. הערך מתאפס ל-0% בכל פעם שמבצעים ניווט חדש.
  2. onSessionEnded: הכרטיסייה בהתאמה אישית מפעילה את האירוע הזה כשהיא מפסיקה לשלוח אותות התעניינות (לדוגמה, אחרי שהמשתמש סוגר את הכרטיסייה בהתאמה אישית). הערך של didUserInteract יהיה true אם המשתמש יצר אינטראקציה עם הדף בכל צורה שהיא (גלילה, לחיצה על לחצן וכו').
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);
}