사용자 참여도 측정

이 가이드에서는 Chrome 맞춤 탭의 참여도 신호를 측정하는 방법을 설명합니다. 앱이 정기적으로 웹 콘텐츠 링크를 사용자에게 표시하는 경우(예: 뉴스 피드) 사용자가 가치 있다고 생각하는 링크와 그렇지 않은 링크를 파악하는 것이 중요할 수 있습니다. 맞춤 탭에서는 탐색 횟수, 스크롤 방향 변경, 스크롤 심도를 통해 세션별 사용자 참여도를 측정할 수 있습니다. 실제 참여도 신호를 확인하려면 GitHub의 맞춤 탭 데모 앱을 확인하세요.

맞춤 탭 참여도 신호 데모.

맞춤 탭은 사용자 참여를 측정하는 두 가지 콜백을 제공합니다.

  • CustomTabsCallback: "NAVIGATION_STARTED" 또는 "NAVIGATION_FINISHED"와 같은 기본 탐색 이벤트를 추적합니다.
  • EngagementSignalsCallback: 스크롤 방향이나 스크롤 비율과 같은 페이지별 사용자 참여를 추적합니다.

둘 다 활성 CustomTabsServiceConnection가 필요합니다. CustomTabsService에 연결하는 방법에 관한 자세한 내용은 이전 CustomTabsService 가이드를 참고하세요.

사용자 참여도를 측정하려면 먼저 CustomTabsCallbackEngagementSignalsCallback 인스턴스를 만듭니다. 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: 맞춤 탭 신호는 사용자가 페이지 하단에 도달했을 때 최대 100% 까지 5% 의 간격으로 스크롤 깊이를 표시합니다. 콜백은 사용자가 스크롤을 중지한 후에만 호출됩니다. 이 값은 새로 탐색할 때마다 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");
    }
};

CustomTabsCallbackEngagementSignalsCallback 모두 활성화된 맞춤 탭 서비스 연결이 필요합니다. 서비스가 연결되면 CustomTabsClient.newSession()를 호출하고 CustomTabsCallback를 전달하여 새 CustomTabsSession를 만들 수 있습니다.

그런 다음 isEngagementSignalsApiAvailable()를 호출하여 현재 브라우저에서 참여 신호를 지원하는지 확인해야 합니다. 지원되는 경우 CustomTabsSession.setEngagementSignalsCallback()를 통해 EngagementSignalsCallback를 등록할 수 있습니다.

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