Google에서는 사용자의 앱을 카테고리별로 정리하고 맞춤형 앱 콘텐츠 소비와 검색을 위한 새로운 몰입형 환경을 제공하는 기기 내 표시 경로를 구축하고 있습니다. 이 전체 화면 환경은 개발자 파트너에게
외부 전용 채널에 최고의 리치 콘텐츠를 선보일 수 있는 기회를
이 가이드에는 개발자 파트너가
Engage SDK를 사용하여 데이트 콘텐츠를 통합하고
표면적이 될 수 있습니다.
통합 세부정보
용어
이 통합에는 맞춤 콘텐츠,
추천, 연속입니다.
맞춤 콘텐츠 클러스터에는 맞춤형 데이트 추천이 표시됩니다.
개발자에게 문의하세요 이러한 추천은
맞춤설정됩니다.
맞춤 콘텐츠 클러스터는 ArticleEntity, PersonEntity,
또는 EventEntity일 수 있지만 서로 다른 항목 유형이 혼합되어 있으면 안 됩니다.
맞춤 콘텐츠의 구조는 다음과 같습니다.
맞춤 콘텐츠 클러스터: 동일한 개발자 파트너의 맞춤 콘텐츠 그룹이 포함된 UI 뷰입니다.
항목: 클러스터에 있는 단일 항목을 나타내는 객체입니다. 이
통합은
맞춤 콘텐츠 클러스터:
ArticleEntity: ArticleEntity는 다음에 관한 권장사항을 나타냅니다.
텍스트 기반 콘텐츠를 말합니다. ArticleEntity 항목
개발자는 다양한 텍스트 및 이미지 콘텐츠를
더 많은 메타데이터를 추가하여 사용자에게 정보를 명확히 전달할 수 있습니다.
<ph type="x-smartling-placeholder"></ph>
그림 1: 맞춤 콘텐츠 클러스터 내의 단일 ArticleEntity를 보여주는 UI
PersonEntity: PersonEntity를 의미합니다. 이
예를 들어 데이트 상대를 강조하는 것이
알게 되었습니다.
<ph type="x-smartling-placeholder"></ph>
그림 2: 내부의 단일 PersonEntity를 보여주는 UI
맞춤 콘텐츠 클러스터
EventEntity: EventEntity는
있습니다. 이벤트 시작 시간은
사용자에게 전달되어야 합니다
<ph type="x-smartling-placeholder"></ph>
그림 3: 단일 EventEntity를 보여주는 UI
맞춤 동영상 클러스터 내에서 이루어집니다
연속 클러스터에는 다음에서 최근 사용자가 참여한 콘텐츠가 표시됩니다.
여러 개발자 파트너를 하나의 UI 그룹으로 구성할 수 있습니다. 각 개발자 파트너
는 지속 기간 중에 최대 10개의 항목을 브로드캐스트할 수 있습니다.
kube-APIserver입니다
연속 콘텐츠의 구조는 다음과 같습니다.
ArticleEntity: ArticleEntity는 다음에 관한 권장사항을 나타냅니다.
텍스트 기반 콘텐츠를 말합니다. 이 항목을 사용하여
사용자가 볼 만한 미완성 뉴스 기사 또는 기타 콘텐츠
계속 소비하고 싶어하는 사람들입니다
그림 6. 다음의 단일 ArticleEntity를 보여주는 UI
연속 클러스터입니다
EventreservationEntity: EventBookingEntity는 다음을 나타냅니다.
사용자가 예정되어 있거나 진행 중인 이벤트를 추적할 수 있게 해 줍니다
즉석 만남 및 모임 이벤트 예약이 있습니다.
그림 8. 단일 이미지를 보여주는 UI
연속 클러스터 내의 EventBookingEntity입니다.
추천 클러스터는 선택한 히어로를 보여주는 UI 뷰입니다.
여러 개발자 파트너의 GenericFeaturedEntity가 하나의 UI 그룹으로 묶여 있습니다.
1개의 추천 클러스터가
모든 맞춤 콘텐츠 클러스터보다 높은 우선순위로 배치되는 UI 각
개발자 파트너는 지원되는
여러 항목 (다양한 유형일 수 있음)과 함께
추천 클러스터에 있는 여러 앱 개발자를 만나볼 수 있습니다.
GenericFeaturedEntity: GenericFeaturedEntity의 차이점
해당 추천 항목의 추천 항목은 단일
가장 높은 수익을 올릴 수 있는
사용자에게 흥미롭고 관련성 있는 중요한 콘텐츠를 제공하세요.
<ph type="x-smartling-placeholder"></ph>
그림 12:
GenericFeaturedEntity 목록
사전 작업
최소 API 수준: 19
다음과 같이 com.google.android.engage:engage-core 라이브러리를 앱에 추가합니다.
dependencies {
// Make sure you also include that repository in your project's build.gradle file.
implementation 'com.google.android.engage:engage-core:1.5.2'
}
이미지가 어두운 테마 설정과 밝은 테마 설정에서 제대로 표시될 수 있도록 투명한 배경을 사용합니다.
콘텐츠 카테고리
콘텐츠 카테고리를 사용하면 앱이 여러 개인
카테고리 이렇게 하면 콘텐츠가 다음과 같이 사전 정의된 카테고리 중 일부와 매핑됩니다.
TYPE_EDUCATION
TYPE_SPORTS
TYPE_MOVIES_AND_TV_SHOWS
TYPE_BOOKS
TYPE_AUDIOBOOKS
TYPE_MUSIC
TYPE_DIGITAL_GAMES
TYPE_TRAVEL_AND_LOCAL
TYPE_HOME_AND_AUTO
TYPE_BUSINESS
TYPE_NEWS
TYPE_FOOD_AND_DRINK
TYPE_SHOPPING
TYPE_HEALTH_AND_FITENESS
TYPE_MEDICAL
TYPE_PARENTING
TYPE_DATING
Google이 액세스할 수 있도록 공개 CDN에 이미지를 호스팅해야 합니다.
콘텐츠 카테고리 사용 가이드라인
ArticleEntity 및 GenericFeaturedEntity와 같은 항목은
모든 콘텐츠 카테고리를 사용할 수 있습니다. 다음과 같은 기타 항목의 경우
EventEntity, EventBookingEntity, PersonEntity, 하위 집합만
개 카테고리 중에서 사용할 수 있습니다. 광고를 게재할 수 있는 카테고리 목록 확인
항목 유형을 먼저 채워야 합니다
조합 대신 일부 콘텐츠 카테고리에 특정 항목 유형 사용
두 가지 유형이 있습니다.
TYPE_MovieS_AND_TV_SHOWS - 다음에서 항목 확인
사용하기 전에 통합 가이드를 시청하세요.
일반 항목이 포함됩니다.
TYPE_FOOD_AND_DRINK - 다음에서 항목 체크아웃
음식 통합 가이드를
일반 항목이 포함됩니다.
ContentCategory 입력란은 선택사항이며
콘텐츠가 앞서 언급한 어느 카테고리에도 속하지 않는 것으로 확인되었습니다.
여러 콘텐츠 카테고리가 제공된 경우 순서대로 입력하세요.
콘텐츠와의 관련성이 높은 콘텐츠 카테고리를 배치
표시됩니다
2단계: 클러스터 데이터 제공
콘텐츠 게시 작업을 백그라운드에서 실행하고(예: WorkManager 사용) 정기적으로 또는 이벤트를 기반으로 예약하는 것이 좋습니다(예: 사용자가 앱을 열 때마다 또는 사용자가 장바구니에 상품을 추가했을 때).
AppEngagePublishClient는 클러스터 게시를 담당합니다.
클라이언트에서 클러스터를 게시하는 API는 다음과 같습니다.
isServiceAvailable
publishRecommendationClusters
publishFeaturedCluster
publishContinuationCluster
publishUserAccountManagementRequest
updatePublishStatus
deleteRecommendationsClusters
deleteFeaturedCluster
deleteContinuationCluster
deleteUserManagementCluster
deleteClusters
isServiceAvailable
이 API는 서비스를 통합에 사용할 수 있는지, 콘텐츠를 기기에 표시할 수 있는지 확인하는 데 사용됩니다.
Kotlin
client.isServiceAvailable.addOnCompleteListener { task ->
if (task.isSuccessful) {
// Handle IPC call success
if(task.result) {
// Service is available on the device, proceed with content publish
// calls.
} else {
// Service is not available, no further action is needed.
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
}
Java
client.isServiceAvailable().addOnCompleteListener(task - > {
if (task.isSuccessful()) {
// Handle success
if(task.getResult()) {
// Service is available on the device, proceed with content publish
// calls.
} else {
// Service is not available, no further action is needed.
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
});
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
new RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Top Picks For You")
.build())
.build());
client.publishFeaturedCluster(
new PublishFeaturedClustersRequest.Builder()
.addFeaturedCluster(
new FeaturedCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build());
client.publishContinuationCluster(
new PublishContinuationClusterRequest.Builder()
.setContinuationCluster(
new ContinuationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build());
서비스가 요청을 수신하면 다음 작업이 한 트랜잭션 내에서 발생합니다.
개발자 파트너의 기존 ContinuationCluster 데이터가 삭제됩니다.
요청 데이터가 파싱되어, 업데이트된 연속 클러스터에 저장됩니다.
오류가 발생하면 전체 요청이 거부되고 기존 상태가 유지됩니다.
publishUserAccountManagementRequest
이 API는 로그인 카드를 게시하는 데 사용됩니다. 로그인 작업은 앱이 콘텐츠를 게시하거나 더 맞춤설정된 콘텐츠를 제공할 수 있도록 사용자를 앱의 로그인 페이지로 안내합니다.
SignInCardEntity SIGN_IN_CARD_ENTITY =
new SignInCardEntity.Builder()
.addPosterImage(
new Image.Builder()
.setImageUri(Uri.parse("http://www.x.com/image.png"))
.setImageHeightInPixel(500)
.setImageWidthInPixel(500)
.build())
.setActionText("Sign In")
.setActionUri(Uri.parse("http://xx.com/signin"))
.build();
client.publishUserAccountManagementRequest(
new PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
서비스가 요청을 수신하면 다음 작업이 한 트랜잭션 내에서 발생합니다.
개발자 파트너의 기존 UserAccountManagementCluster 데이터가 삭제됩니다.
요청 데이터가 파싱되어, 업데이트된 UserAccountManagementCluster 클러스터에 저장됩니다.
오류가 발생하면 전체 요청이 거부되고 기존 상태가 유지됩니다.
updatePublishStatus
내부적인 이유로 어떠한 클러스터도 게시되지 않는 경우
권장:
updatePublishStatus API의 여러 Cloud UI API에서 사용할 수 있습니다. 이는 다음과 같은 이유로 중요합니다.
콘텐츠가 게시되는 경우에도(STATUS == PUBLISHED) 모든 시나리오에서 상태를 제공하는 것은 이 명시적 상태를 사용하여 통합의 상태 및 기타 측정항목을 전달하는 대시보드를 채우는 데 중요합니다.
게시된 콘텐츠는 없지만 통합 상태가 손상되지 않은 경우(STATUS == NOT_PUBLISHED) Google은 앱 상태 대시보드에서 알림을 트리거하지 않을 수 있습니다. 이는 제공업체의 관점에서 예상되는 상황으로 인해 콘텐츠가 게시되지 않음을 확인합니다.
이를 통해 개발자는 데이터가 게시되는 시점과 게시 시점이
아닙니다.
Google은 상태 코드를 사용하여 사용자가 다음에서 특정 작업을 하도록 유도할 수 있습니다.
앱 콘텐츠를 보거나 극복할 수 있습니다.
적합한 게시 상태 코드 목록은 다음과 같습니다.
// Content is published
AppEngagePublishStatusCode.PUBLISHED,
// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,
// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,
// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,
// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,
// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,
// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,
// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,
// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER
로그인하지 않은 사용자로 인해 콘텐츠가 게시되지 않은 경우 Google은
로그인 카드를 게시하는 것이 좋습니다. 어떤 이유로든 제공업체가
먼저
updatePublishStatus API에 상태 코드 포함
NOT_PUBLISHED_REQUIRES_SIGN_IN
client.deleteClusters(
new DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_CONTINUATION)
.addClusterType(ClusterType.TYPE_FEATURED)
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
.build());
서비스가 요청을 수신하면 지정된 클러스터 유형과 일치하는 모든 클러스터에서 기존 데이터가 삭제됩니다. 클라이언트는 하나 이상의 클러스터 유형을 전달하도록 선택할 수 있습니다. 오류가 발생하면 전체 요청이 거부되고 기존 상태가 유지됩니다.
오류 처리
후속 작업을 실행하여 성공적인 작업을 복구하고 다시 제출할 수 있도록 게시 API의 작업 결과를 수신 대기하는 것이 좋습니다.
Kotlin
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(..)
.build())
.addOnCompleteListener { task ->
if (task.isSuccessful) {
// do something
} else {
val exception = task.exception
if (exception is AppEngageException) {
@AppEngageErrorCode val errorCode = exception.errorCode
if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
// do something
}
}
}
}
Java
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(...)
.build())
.addOnCompleteListener(
task -> {
if (task.isSuccessful()) {
// do something
} else {
Exception exception = task.getException();
if (exception instanceof AppEngageException) {
@AppEngageErrorCode
int errorCode = ((AppEngageException) exception).getErrorCode();
if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
// do something
}
}
}
});
오류는 AppEngageException으로 반환되며 원인은 오류 코드로 포함됩니다.
오류 코드
참고
SERVICE_NOT_FOUND
지정된 기기에서 서비스를 사용할 수 없습니다.
SERVICE_NOT_AVAILABLE
서비스는 특정 기기에서 사용할 수 있지만 호출 시점에는 사용할 수 없습니다(예: 명시적으로 사용 중지됨).
SERVICE_CALL_EXECUTION_FAILURE
스레딩 문제로 인해 작업을 실행할 수 없습니다. 이 경우 재시도할 수 있습니다.
SERVICE_CALL_PERMISSION_DENIED
호출자가 서비스를 호출할 수 없습니다.
SERVICE_CALL_INVALID_ARGUMENT
요청에 잘못된 데이터가 포함되어 있습니다(예: 허용된 클러스터 수를 초과함).
SERVICE_CALL_INTERNAL
서비스 측에 오류가 있습니다.
SERVICE_CALL_RESOURCE_EXHAUSTED
서비스 호출이 너무 자주 이루어집니다.
3단계: 브로드캐스트 인텐트 처리
작업을 통해 게시 콘텐츠 API를 호출하는 것 외에도 콘텐츠 게시 요청을 수신하도록 BroadcastReceiver를 설정해야 합니다.
브로드캐스트 인텐트의 목표는 주로 앱 재활성화 및 데이터 동기화 강제입니다. 브로드캐스트 인텐트는 자주 전송되지 않도록 설계되었습니다. 이는 참여 서비스에서 콘텐츠가 오래되었을 수 있다고 판단할 때만(예: 1주일) 트리거됩니다. 이렇게 하면 애플리케이션이 장기간 실행되지 않은 경우에도 사용자에게 새로운 콘텐츠 환경을 제공할 수 있습니다.
BroadcastReceiver는 다음 두 가지 방법으로 설정해야 합니다.
Context.registerReceiver()를 사용하여 BroadcastReceiver 클래스의 인스턴스를 동적으로 등록합니다. 이렇게 하면 여전히 메모리에 있는 애플리케이션의 통신이 가능해집니다.
Kotlin
class AppEngageBroadcastReceiver : BroadcastReceiver(){
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received
// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
// Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
// received
}
fun registerBroadcastReceivers(context: Context){
var context = context
context = context.applicationContext
// Register Recommendation Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION))
// Register Featured Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_FEATURED))
// Register Continuation Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION))
}
Java
class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received
// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
// Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
// received
}
public static void registerBroadcastReceivers(Context context) {
context = context.getApplicationContext();
// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION));
// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED));
// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION));
}
AndroidManifest.xml 파일에서 <receiver> 태그를 사용하여 구현을 정적으로 선언합니다. 이를 통해 애플리케이션이 실행 중이 아닐 때 브로드캐스트 인텐트를 수신할 수 있고, 애플리케이션이 콘텐츠를 게시할 수 있습니다.
Google은 내부적으로 인증 및 검토를 실행하여 통합이 예상대로 작동하는지 확인합니다. 변경이 필요한 경우 Google에서는 필요한 세부정보와 함께 연락을 드립니다.
테스트가 완료되고 변경할 필요가 없으면 Google에서
업데이트된 통합 APK를 게시하여
Play 스토어로 이동합니다.
업데이트된 APK가 Play 스토어에 게시되었음을 Google에서 확인한 후에는 맞춤 콘텐츠, 추천, 연속 클러스터가 게시되고 사용자에게 표시될 수 있습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2024-08-29(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2024-08-29(UTC)"],[],[]]