قياس تفاعل المستخدمين

يوضّح هذا الدليل كيفية قياس إشارات التفاعل لعلامات التبويب المخصّصة في Chrome. إذا كان تطبيقك يعرض بانتظام روابط تؤدي إلى محتوى الويب للمستخدمين، مثلاً في خلاصة أخبار، قد يكون من المهم معرفة الروابط التي يجدها المستخدمون قيّمة وتلك التي لا يجدها المستخدمون. في "علامات التبويب المخصَّصة"، يمكنك قياس تفاعل المستخدِمين المحدّد في جلسة من خلال عدد عمليات التنقّل وتغييرات اتجاه التمرير وعمق التنقّل في الصفحة. للاطِّلاع على إشارات التفاعل أثناء تنفيذها، يمكنك الاطّلاع على تطبيق "علامات التبويب المخصَّصة" التجريبي على GitHub.

عرض توضيحي لإشارات التفاعل في علامة التبويب المخصَّصة.

توفّر "علامات التبويب المخصَّصة" طريقتَين مختلفتَين لمعاودة الاتصال لقياس تفاعل المستخدِم:

  • 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% عند وصول المستخدم إلى أسفل الصفحة. ولا يتم استدعاء معاودة الاتصال إلا بعد أن يتوقف المستخدم عن الانتقال. وتتم إعادة ضبط القيمة على% 0 مع كل عملية تنقّل جديدة.
  2. 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);
}