Kullanıcı etkileşimini ölçme

Bu kılavuzda, Chrome Özel sekmeleri için etkileşim sinyallerinin nasıl ölçüleceği açıklanmaktadır. Uygulamanız kullanıcılarına düzenli olarak web içeriğine yönlendiren bağlantılar sunuyorsa (ör. bir haber feed'inde) kullanıcıların hangi bağlantıları değerli bulup hangilerinin olmadığını bilmek önemli olabilir. Özel Sekmelerde gezinme sayısı, kaydırma yönü değişiklikleri ve kaydırma derinliği aracılığıyla oturuma özel kullanıcı etkileşimini ölçebilirsiniz. Etkileşim sinyallerini çalışırken görmek için GitHub'daki Özel Sekmeler demo uygulamasına göz atın.

Özel Sekme etkileşim sinyalleri demosu.

Özel Sekmeler, kullanıcı etkileşimini ölçmek için iki farklı geri çağırma sağlar:

  • "NAVIGATION_STARTED" veya "NAVIGATION_FINISHED" gibi temel gezinme etkinliklerini izlemek için CustomTabsCallback.
  • Kaydırma yönü veya kaydırma yüzdesi gibi sayfaya özel kullanıcı etkileşimini izlemek için EngagementSignalsCallback.

Her ikisi için de etkin bir CustomTabsServiceConnection gerekir. Bir CustomTabsService cihazına nasıl bağlanacağınızla ilgili ayrıntılar için önceki CustomTabsService kılavuzuna bakın.

Kullanıcı etkileşimini ölçmek için önce CustomTabsCallback ve EngagementSignalsCallback örneği oluşturun. CustomTabsCallback, ne tür gezinme olduğunu açıklayan navigationEvent sabit değeri alır:

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, üç farklı geri çağırmayı destekler:

onVerticalScrollEvent()
Kullanıcı kaydırma yönünü her değiştirdiğinde çağrılır. Burada isDirectionUp (ilk bağımsız değişken) yönü belirtir.
  1. onGreatestScrollPercentageIncreased: Kullanıcı sayfanın en altına ulaştığında Özel Sekme, %5'lik aralıklarda en fazla% 100 olacak şekilde kaydırma derinliğini gösterir. Geri çağırma yalnızca kullanıcı kaydırmayı durdurduktan sonra çağrılır. Değer, her yeni gezinmede% 0'a sıfırlanır.
  2. onSessionEnded: Özel Sekme, etkileşim sinyalleri göndermeyi durdurduğunda (örneğin, kullanıcı Özel Sekmeyi kapattıktan sonra) bu etkinliği tetikler. Kullanıcı sayfayla herhangi bir şekilde (kaydırma, düğmeyi tıklama vb.) etkileşimde bulunursa didUserInteract doğru olacaktır.
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");
    }
};

Hem CustomTabsCallback hem de EngagementSignalsCallback için etkin bir Özel Sekme hizmeti bağlantısı gerekir. Hizmet bağlandıktan sonra CustomTabsClient.newSession() yöntemini çağırıp CustomTabsCallback öğesini ileterek yeni bir CustomTabsSession oluşturabilirsiniz.

Ardından, etkileşim sinyallerinin mevcut tarayıcı tarafından desteklenip desteklenmediğini kontrol etmek için isEngagementSignalsApiAvailable() numaralı telefonu aramalısınız. Destekleniyorsa EngagementSignalsCallback cihazınızı CustomTabsSession.setEngagementSignalsCallback() üzerinden kaydedebilirsiniz.

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;
    }
};

Tek yapmanız gereken CustomTabsService öğesini bağlamaktır:

@Override
protected void onStart() {
    super.onStart();
    bindCustomTabsService();
}

private void bindCustomTabsService() {
    String packageName = CustomTabsHelper.getPackageNameToUse(this);
    if (packageName == null) return;
    CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}