In-App-Überprüfungen einbinden (nativ)

In diesem Leitfaden wird beschrieben, wie du In-App-Rezensionen mithilfe von nativem Code (C oder C++) in deine App einbindest. Für die Verwendung von Kotlin oder Java bzw. Unity sind separate Integrationsanleitungen verfügbar.

Native SDK – Übersicht

Das Play Core Native SDK ist Teil der Google Play Core Library-Familie. Das Play Core Native SDK enthält die C-Header-Datei review.h, die ReviewManager aus den Java Play In-App-Review-Bibliotheken umschließt. Mit dieser Headerdatei kann Ihre Anwendung die API direkt über Ihren nativen Code aufrufen. Eine Übersicht über die verfügbaren öffentlichen Funktionen findest du in der Dokumentation zu nativen Play Review-Modulen.

ReviewManager_requestReviewFlow startet eine Anfrage, mit der die Informationen erfasst werden, die später zum Starten der In-App-Überprüfung erforderlich sind. Sie können das Ergebnis der Anfrage mit ReviewManager_getReviewStatus verfolgen. Weitere Informationen zu allen Status, die ReviewManager_getReviewStatus zurückgeben kann, finden Sie unter ReviewErrorCode.

Sowohl die Anfrage- als auch die Startfunktion geben REVIEW_NO_ERROR zurück, wenn die Funktion erfolgreich ist.

Entwicklungsumgebung einrichten

下载 Play Core Native SDK

您必须先接受以下条款及条件才能下载。

条款及条件

Last modified: September 24, 2020
  1. 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.
  2. For purposes of these terms, "APIs" means Google's APIs, other developer services, and associated software, including any Redistributable Code.
  3. “Redistributable Code” means Google-provided object code or header files that call the APIs.
  4. 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.
  5. 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.
下载 Play Core Native SDK

play-core-native-sdk-1.14.0.zip

  1. Sie haben folgende Möglichkeiten:

    • Installieren Sie Android Studio Version 4.0 oder höher. Installiere die Android SDK Platform-Version 10.0 (API-Level 29) über die SDK-Manager-Benutzeroberfläche.
    • Installiere die Android SDK-Befehlszeilentools und verwende sdkmanager, um die Android SDK Platform Version 10.0 (API-Ebene 29) zu installieren.
  2. Bereiten Sie Android Studio für die native Entwicklung vor. Verwenden Sie dazu den SDK Manager, um das neueste CMake und Android Native Development Kit (NDK) zu installieren. Weitere Informationen zum Erstellen oder Importieren nativer Projekte finden Sie unter Erste Schritte mit dem NDK.

  3. Laden Sie die ZIP-Datei herunter und entpacken Sie sie zusammen mit Ihrem Projekt.

    Downloadlink Größe SHA-256-Prüfsumme
    36 MiB 782a8522d937848c83a715c9a258b95a3ff2879a7cd71855d137b41c00786a5e
  4. Aktualisieren Sie die Datei build.gradle Ihrer App wie unten gezeigt:

    Groovig

        // 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.0.0'
            implementation 'com.google.android.play:asset-delivery:2.0.0'
            implementation 'com.google.android.play:integrity:1.0.1'
            implementation 'com.google.android.play:review:2.0.0'
    
            // 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.0.0")
        implementation("com.google.android.play:asset-delivery:2.0.0")
        implementation("com.google.android.play:integrity:1.0.1")
        implementation("com.google.android.play:review:2.0.0")
    
        // Import these common dependencies.
        implementation("com.google.android.gms:play-services-tasks:18.0.2")
        implementation(files("$playcoreDir/playcore-native-metadata.jar"))
        ...
    }
    
  5. Aktualisieren Sie die CMakeLists.txt-Dateien Ihrer App wie unten gezeigt:

    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
            ...)
    

Datenerhebung

Das Play Core Native SDK kann versionsbezogene Daten erheben, damit Google das Produkt verbessern kann. Dazu gehören:

  • Paketname der App
  • Paketversion der App
  • Version des Play Core Native SDK

Diese Daten werden erhoben, wenn du dein App-Paket in die Play Console hochlädst. Wenn du diese Datenerhebung deaktivieren möchtest, entferne den $playcoreDir/playcore-native-metadata.jar-Import aus der Datei build.gradle.

Hinweis: Diese Datenerhebung im Zusammenhang mit Ihrer Nutzung des Play Core Native SDK und der Verwendung der erhobenen Daten durch Google ist unabhängig von der Sammlung von Bibliotheksabhängigkeiten, die Google beim Hochladen Ihres App-Pakets in die Play Console deklariert und in Gradle deklariert wird.

Nachdem Sie das Play Core Native SDK in Ihr Projekt integriert haben, fügen Sie die folgende Zeile in Dateien mit API-Aufrufen ein:

"review.h" einschließen

Nachdem Sie das Play Core Native SDK in Ihr Projekt eingebunden haben, fügen Sie die folgende Zeile in die Dateien mit API-Aufrufen ein:

#include "play/review.h"

Review API initialisieren

Wenn Sie die API verwenden möchten, müssen Sie sie zuerst initialisieren. Rufen Sie dazu die Funktion ReviewManager_init auf, wie im folgenden mit android_native_app_glue.h erstellten Beispiel gezeigt:

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

In-App-Überprüfung beantragen

Folgen Sie der Anleitung zum Anfordern von In-App-Überprüfungen, um gute Punkte im Nutzerfluss Ihrer App zu ermitteln und Nutzer zur Überprüfung aufzufordern (z. B. nachdem ein Nutzer die Zusammenfassung am Ende eines Levels in einem Spiel geschlossen hat). Wenn sich deine App einem dieser Punkte nähert, rufe ReviewManager_requestReviewFlow auf, um asynchron die Informationen anzufordern, die deine App zum Starten eines In-App-Überprüfungsvorgangs benötigt. Beobachten Sie den Fortschritt des ReviewManager_requestReviewFlow-Vorgangs, indem Sie ReviewManager_getReviewStatus aufrufen, z. B. einmal pro Frame. Dies kann einige Sekunden dauern. Starten Sie den Vorgang daher, bevor Ihre App den Punkt erreicht, an dem Sie den Ablauf der In-App-Überprüfung zeigen möchten.

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

Status verwalten und In-App-Überprüfungsprozess starten

Wenn eine Anfrage begonnen oder der Ablauf der In-App-Überprüfung gestartet wird, kannst du den Status mit ReviewManager_getReviewStatus prüfen. So können Sie die Logik abhängig vom API-Status definieren. Eine Möglichkeit besteht darin, den Status als globale Variable beizubehalten und zu prüfen, ob der Status REVIEW_REQUEST_FLOW_COMPLETED ist, wenn der Nutzer eine bestimmte Aktion ausführt (z. B. auf die Schaltfläche „Nächstes Level“ in einem Spiel tippen), wie im folgenden Beispiel gezeigt:

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

Wenn der Status REVIEW_REQUEST_FLOW_COMPLETED lautet und Ihre App bereit ist, starten Sie die In-App-Überprüfung:

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

Prüfe nach dem Start der In-App-Überprüfung den Status regelmäßig und fahre mit dem Ablauf der App fort. Dazu wird häufig das Spielschleifenmuster verwendet.

Kostenlose Ressourcen

Vergessen Sie nicht, Ressourcen freizugeben. Rufen Sie dazu die Funktion ReviewManager_destroy auf, sobald Ihre App die API nicht mehr verwendet (z. B. nach Abschluss der In-App-Überprüfung).

void ReviewManager_destroy();

Nächste Schritte

Teste den Ablauf der In-App-Überprüfung deiner App, um zu bestätigen, dass die Integration korrekt funktioniert.