يوضّح هذا الدليل كيفية قياس إشارات التفاعل لعلامات التبويب المخصّصة في Chrome. إذا كان تطبيقك يعرض روابط لمحتوى الويب بشكل منتظم للمستخدمين، على سبيل المثال في خلاصة أخبار، قد يكون من المهم معرفة الروابط التي يجد المستخدمون أنها ذات قيمة والروابط التي لا يجدونها ذات قيمة. في ميزة "علامات التبويب المخصّصة"، يمكنك قياس تفاعل المستخدِم الخاص بالجلسة من خلال عدد عمليات التنقّل وتغييرات اتجاه التمرير وعمق التمرير. للاطّلاع على إشارات التفاعل أثناء استخدام علامات التبويب المخصّصة، يمكنك الاطّلاع على تطبيق Custom Tabs التجريبي على 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
(الوسيطة الأولى) إلى الاتجاه.
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);
}