Questa guida descrive come integrare le recensioni in-app nella tua app utilizzando gli annunci nativi (C o C++). Se utilizzi Kotlin, esistono guide all'integrazione separate o Java oppure Unity.
Panoramica di Native SDK
L'SDK nativo di Play Core fa parte delle librerie di base di Google Play
famiglia. L'SDK nativo principale di Play include un file di intestazione C, review.h
, che
aggrega ReviewManager
dalle librerie In-App Review di Java Play. Questo file di intestazione consente all'app
chiamare l'API direttamente dal codice nativo. Per una panoramica del pubblico
disponibili, consulta il modulo nativo di Play Review
documentazione.
ReviewManager_requestReviewFlow
avvia una richiesta che raccoglie le informazioni necessarie per avviare
la procedura di revisione in-app in un secondo momento. Puoi monitorare il risultato della richiesta utilizzando
ReviewManager_getReviewStatus
Per ulteriori informazioni su tutti gli stati che ReviewManager_getReviewStatus
può restituire, consulta ReviewErrorCode
.
Entrambe le funzioni di richiesta e di avvio restituiscono REVIEW_NO_ERROR
se
correttamente.
Configura l'ambiente di sviluppo
Scarica Play Core Native SDK
Prima di eseguire il download, devi accettare i seguenti termini e condizioni.
Termini e condizioni
Last modified: September 24, 2020- By using the Play Core Software Development Kit, you agree to these terms in addition to the Google APIs Terms of Service ("API ToS"). If these terms are ever in conflict, these terms will take precedence over the API ToS. Please read these terms and the API ToS carefully.
- For purposes of these terms, "APIs" means Google's APIs, other developer services, and associated software, including any Redistributable Code.
- “Redistributable Code” means Google-provided object code or header files that call the APIs.
- Subject to these terms and the terms of the API ToS, you may copy and distribute Redistributable Code solely for inclusion as part of your API Client. Google and its licensors own all right, title and interest, including any and all intellectual property and other proprietary rights, in and to Redistributable Code. You will not modify, translate, or create derivative works of Redistributable Code.
- Google may make changes to these terms at any time with notice and the opportunity to decline further use of the Play Core Software Development Kit. Google will post notice of modifications to the terms at https://developer.android.com/guide/playcore/license. Changes will not be retroactive.
Esegui una delle seguenti operazioni:
- Installa Android Studio versione 4.0 o successive. Utilizza l'SDK UI di Manager per installare Android SDK Platform versione 10.0 (livello API 29).
- Installare gli strumenti a riga di comando dell'SDK per Android
e usa
sdkmanager
per installare Android SDK Platform versione 10.0 (livello API 29).
Prepara Android Studio per lo sviluppo nativo utilizzando Gestore SDK per installare la versione più recente CMake e Android Native Development Kit (NDK). Per ulteriori informazioni creazione o importazione di progetti nativi, consulta Introduzione all'NDK.
Scarica il file ZIP ed estrailo insieme al tuo progetto.
Link di download Dimensioni Checksum SHA-256 36 MiB 782a8522d937848c83a715c9a258b95a3ff2879a7cd71855d137b41c00786a5e Aggiorna il file
build.gradle
dell'app come mostrato di seguito:Alla moda
// App build.gradle plugins { id 'com.android.application' } // Define a path to the extracted Play Core SDK files. // If using a relative path, wrap it with file() since CMake requires absolute paths. def playcoreDir = file('../path/to/playcore-native-sdk') android { defaultConfig { ... externalNativeBuild { cmake { // Define the PLAYCORE_LOCATION directive. arguments "-DANDROID_STL=c++_static", "-DPLAYCORE_LOCATION=$playcoreDir" } } ndk { // Skip deprecated ABIs. Only required when using NDK 16 or earlier. abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } buildTypes { release { // Include Play Core Library proguard config files to strip unused code while retaining the Java symbols needed for JNI. proguardFile '$playcoreDir/proguard/common.pgcfg' proguardFile '$playcoreDir/proguard/gms_task.pgcfg' proguardFile '$playcoreDir/proguard/per-feature-proguard-files' ... } debug { ... } } externalNativeBuild { cmake { path 'src/main/CMakeLists.txt' } } } dependencies { // Import these feature-specific AARs for each Google Play Core library. implementation 'com.google.android.play:app-update:2.1.0' implementation 'com.google.android.play:asset-delivery:2.2.2' implementation 'com.google.android.play:integrity:1.4.0' implementation 'com.google.android.play:review:2.0.1' // Import these common dependencies. implementation 'com.google.android.gms:play-services-tasks:18.0.2' implementation files("$playcoreDir/playcore-native-metadata.jar") ... }
Kotlin
// App build.gradle plugins { id("com.android.application") } // Define a path to the extracted Play Core SDK files. // If using a relative path, wrap it with file() since CMake requires absolute paths. val playcoreDir = file("../path/to/playcore-native-sdk") android { defaultConfig { ... externalNativeBuild { cmake { // Define the PLAYCORE_LOCATION directive. arguments += listOf("-DANDROID_STL=c++_static", "-DPLAYCORE_LOCATION=$playcoreDir") } } ndk { // Skip deprecated ABIs. Only required when using NDK 16 or earlier. abiFilters.clear() abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") } } buildTypes { release { // Include Play Core Library proguard config files to strip unused code while retaining the Java symbols needed for JNI. proguardFile("$playcoreDir/proguard/common.pgcfg") proguardFile("$playcoreDir/proguard/gms_task.pgcfg") proguardFile("$playcoreDir/proguard/per-feature-proguard-files") ... } debug { ... } } externalNativeBuild { cmake { path = "src/main/CMakeLists.txt" } } } dependencies { // Import these feature-specific AARs for each Google Play Core library. implementation("com.google.android.play:app-update:2.1.0") implementation("com.google.android.play:asset-delivery:2.2.2") implementation("com.google.android.play:integrity:1.4.0") implementation("com.google.android.play:review:2.0.1") // Import these common dependencies. implementation("com.google.android.gms:play-services-tasks:18.0.2") implementation(files("$playcoreDir/playcore-native-metadata.jar")) ... }
Aggiorna i file
CMakeLists.txt
dell'app come mostrato di seguito:cmake_minimum_required(VERSION 3.6) ... # Add a static library called “playcore” built with the c++_static STL. include(${PLAYCORE_LOCATION}/playcore.cmake) add_playcore_static_library() // In this example “main” is your native code library, i.e. libmain.so. add_library(main SHARED ...) target_include_directories(main PRIVATE ${PLAYCORE_LOCATION}/include ...) target_link_libraries(main android playcore ...)
Raccolta dei dati
L'SDK nativo principale di Play potrebbe raccogliere dati relativi alla versione per consentire a Google di migliorare il prodotto, ad esempio:
- Nome pacchetto dell'app
- Versione pacchetto dell'app
- Versione di Core Native SDK di Play
Questi dati verranno raccolti al momento del caricamento del pacchetto dell'app
a Play Console. Per disattivare questa procedura di raccolta dei dati, rimuovi il
Importazione di $playcoreDir/playcore-native-metadata.jar
nel file build.gradle.
Tieni presente che questa raccolta di dati riguarda l'utilizzo dell'SDK nativo di base di Play e L'utilizzo da parte di Google dei dati raccolti è separato e indipendente dai suoi raccolta di dipendenze di libreria dichiarate in Gradle quando carichi la tua app alla Play Console.
Dopo aver integrato l'SDK nativo di base di Play nel progetto, includi il parametro seguente nei file che contengono chiamate API:
Includi review.h
Dopo aver integrato l'SDK nativo di base di Play nel tuo progetto, includi: seguente nei file che conterranno chiamate API:
#include "play/review.h"
Inizializzare l'API Review
Ogni volta che vuoi utilizzare l'API, devi prima inizializzarla chiamando il metodo
ReviewManager_init
, come mostrato nell'esempio seguente, creata con
android_native_app_glue.h
:
void android_main(android_app* app) {
app->onInputEvent = HandleInputEvent;
ReviewErrorCode error_code = ReviewManager_init(app->activity->vm, app->activity->clazz);
if (error_code == REVIEW_NO_ERROR) {
// You can use the API.
}
}
Richiedi il flusso di revisione in-app
Segui le indicazioni su quando richiedere l'accesso in-app
revisioni per stabilire i punti positivi
nel flusso utente della tua app per chiedere all'utente una recensione (ad esempio, dopo una
l'utente chiude la schermata di riepilogo al termine di un livello in un gioco). Quando
l'app si avvicina a uno di questi punti, richiama
ReviewManager_requestReviewFlow
per richiedere in modo asincrono le informazioni necessarie all'app per avviare un
flusso di revisione in-app. Monitora l'avanzamento del
Operazione ReviewManager_requestReviewFlow
mediante la chiamata
ReviewManager_getReviewStatus
,
ad esempio una volta ogni frame. L'operazione potrebbe richiedere fino a un paio di secondi, quindi
devi avviare la procedura prima che l'app raggiunga il punto in cui vuoi
che mostrano il flusso di revisione in-app.
ReviewErrorCode error_code = ReviewManager_requestReviewFlow();
if (error_code == REVIEW_NO_ERROR) {
// The request has successfully started, check the status using
// ReviewManager_getReviewStatus.
} else {
// Error such as REVIEW_PLAY_STORE_NOT_FOUND indicating that the in-app
// review isn't currently possible.
}
Gestire gli stati e avviare il flusso di revisione in-app
Ogni volta che viene avviata una richiesta o il flusso di revisione in-app, puoi
controlla lo stato utilizzando
ReviewManager_getReviewStatus
Ciò ti consente di definire la logica in base allo stato dell'API. Sola andata
l'approccio è mantenere lo stato come variabile globale e verificare se
lo stato è REVIEW_REQUEST_FLOW_COMPLETED
quando l'utente esegue una determinata
(ad es. toccare il pulsante "Livello successivo" in un gioco), come mostrato nell'app
nell'esempio seguente:
ReviewStatus status;
ReviewErrorCode error_code = ReviewManager_getReviewStatus(&status);
if (error_code != REVIEW_NO_ERROR) {
// There was an error with the most recent operation.
return;
}
switch (status) {
case REVIEW_REQUEST_FLOW_PENDING:
// Request is ongoing. The flow can't be launched yet.
break;
case REVIEW_REQUEST_FLOW_COMPLETED:
// Request completed. The flow can be launched now.
break;
case REVIEW_LAUNCH_FLOW_PENDING:
// The review flow is ongoing, meaning the dialog might be displayed.
break;
case REVIEW_LAUNCH_FLOW_COMPLETED:
// The review flow has finished. Continue with your app flow (for
// example, move to the next screen).
break;
default:
// Unknown status.
break;
}
Quando lo stato è REVIEW_REQUEST_FLOW_COMPLETED
e l'app è pronta, avvia
il flusso di revisione in-app:
// This call uses android_native_app_glue.h. ReviewErrorCode error_code = ReviewManager_launchReviewFlow(app->activity->clazz); if (error_code != REVIEW_NO_ERROR) { // There was an error while launching the flow. return; }
Dopo aver avviato il flusso di revisione in-app, continua a controllare lo stato di completamento e continuare con il flusso dell'app. Un modo comune per gestire questo problema è che seguendo lo schema Ciclo di gioco.
Risorse senza costi
Non dimenticare di utilizzare le risorse senza costi chiamando il ReviewManager_destroy
una volta che l'app ha finito di usare l'API (ad esempio, dopo
flusso di revisione completo).
void ReviewManager_destroy();
Passaggi successivi
Testare il flusso di revisione in-app dell'app per: verificare il corretto funzionamento dell'integrazione.