این راهنما نحوه ادغام نقد و بررسیهای درون برنامهای را در برنامه شما با استفاده از کد بومی (C یا C++) شرح میدهد. اگر از Kotlin یا Java ، Unity یا Unreal Engine استفاده میکنید، راهنماهای ادغام جداگانهای وجود دارد.
مرور کلی SDK بومی
کیت توسعه نرمافزار بومی Play Core بخشی از خانواده کتابخانههای Google Play Core است. کیت توسعه نرمافزار بومی Play Core شامل یک فایل هدر C review.h است که ReviewManager از کتابخانههای نقد و بررسی درونبرنامهای Java Play در خود جای میدهد. این فایل هدر به برنامه شما اجازه میدهد تا API را مستقیماً از کد بومی شما فراخوانی کند. برای مرور کلی توابع عمومی موجود، به مستندات ماژول بومی Play Review مراجعه کنید.
ReviewManager_requestReviewFlow درخواستی را آغاز میکند که اطلاعات مورد نیاز برای راهاندازی جریان بررسی درونبرنامهای را در آینده جمعآوری میکند. میتوانید نتیجه درخواست را با استفاده از ReviewManager_getReviewStatus پیگیری کنید. برای اطلاعات بیشتر در مورد تمام وضعیتهایی که ReviewManager_getReviewStatus میتواند برگرداند، به ReviewErrorCode مراجعه کنید.
هر دو تابع request و launch در صورت موفقیت، مقدار REVIEW_NO_ERROR برمیگردانند.
محیط توسعه خود را تنظیم کنید
دانلود کنید Play Core Native SDK
قبل از دانلود، باید با شرایط و ضوابط زیر موافقت کنید.
شرایط و ضوابط
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.
هر یک از موارد زیر را انجام دهید:
- اندروید استودیو نسخه ۴.۰ یا بالاتر را نصب کنید. از رابط کاربری SDK Manager برای نصب پلتفرم SDK اندروید نسخه ۱۰.۰ (سطح API ۲۹) استفاده کنید.
- ابزارهای خط فرمان Android SDK را نصب کنید و با استفاده از
sdkmanagerپلتفرم Android SDK نسخه 10.0 (سطح API 29) را نصب کنید.
با استفاده از SDK Manager و نصب آخرین نسخه CMake و Android Native Development Kit (NDK)، اندروید استودیو را برای توسعه بومی آماده کنید. برای اطلاعات بیشتر در مورد ایجاد یا وارد کردن پروژههای بومی، به بخش «شروع کار با NDK» مراجعه کنید.
فایل زیپ را دانلود کنید و آن را در کنار پروژه خود استخراج کنید.
لینک دانلود اندازه بررسی SHA-256 ۳۹.۶ مگابایت 92b43246860d4ce4772a3a0786212d9b4781920e112d81b93ca1c5ebd8da89cb فایل
build.gradleبرنامه خود را مطابق شکل زیر بهروزرسانی کنید:گرووی
// 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.3.0' implementation 'com.google.android.play:integrity:1.5.0' implementation 'com.google.android.play:review:2.0.2' // Import these common dependencies. implementation 'com.google.android.gms:play-services-tasks:18.0.2' implementation files("$playcoreDir/playcore-native-metadata.jar") ... }
کاتلین
// 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.3.0") implementation("com.google.android.play:integrity:1.5.0") implementation("com.google.android.play:review:2.0.2") // Import these common dependencies. implementation("com.google.android.gms:play-services-tasks:18.0.2") implementation(files("$playcoreDir/playcore-native-metadata.jar")) ... }
فایلهای
CMakeLists.txtبرنامه خود را مطابق شکل زیر بهروزرسانی کنید: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 ...)
جمعآوری دادهها
کیت توسعه نرمافزار Play Core Native ممکن است دادههای مربوط به نسخه را جمعآوری کند تا به گوگل امکان بهبود محصول را بدهد، از جمله:
- نام بسته برنامه
- نسخه بسته برنامه
- نسخه Core Native SDK را اجرا کنید
این دادهها هنگام آپلود بسته برنامه خود در کنسول Play جمعآوری میشوند. برای انصراف از این فرآیند جمعآوری دادهها، دستور $playcoreDir/playcore-native-metadata.jar در فایل build.gradle حذف کنید.
توجه داشته باشید، این جمعآوری دادهها که مربوط به استفاده شما از Play Core Native SDK و استفاده گوگل از دادههای جمعآوریشده است، جدا و مستقل از مجموعه وابستگیهای کتابخانهای گوگل است که هنگام آپلود بسته برنامه خود در کنسول Play در Gradle اعلام شدهاند.
پس از اینکه Play Core Native SDK را در پروژه خود ادغام کردید، خط زیر را در فایلهایی که حاوی فراخوانیهای API هستند، قرار دهید:
نقد و بررسی را اضافه کنید.h
پس از ادغام Play Core Native SDK در پروژه خود، خط زیر را در فایلهایی که حاوی فراخوانیهای API هستند، قرار دهید:
#include "play/review.h"
مقداردهی اولیه API بررسی
هر زمان که میخواهید از API استفاده کنید، ابتدا باید آن را با فراخوانی تابع ReviewManager_init مقداردهی اولیه کنید، همانطور که در مثال زیر که با 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.
}
}
درخواست جریان بررسی درونبرنامهای
برای تعیین نقاط مثبت در جریان کاربری برنامهتان و درخواست بررسی توسط کاربر (مثلاً پس از اینکه کاربر در پایان یک مرحله از بازی، صفحه خلاصه را رد کرد)، از راهنماییهای مربوط به زمان درخواست بررسی درونبرنامهای پیروی کنید. وقتی برنامه شما به یکی از این نقاط نزدیک میشود، ReviewManager_requestReviewFlow فراخوانی کنید تا به صورت ناهمگام، اطلاعاتی را که برنامه شما برای راهاندازی جریان بررسی درونبرنامهای نیاز دارد، درخواست کنید. پیشرفت عملیات ReviewManager_requestReviewFlow را با فراخوانی ReviewManager_getReviewStatus ، مثلاً هر فریم، رصد کنید. این کار ممکن است تا چند ثانیه طول بکشد، بنابراین باید این فرآیند را قبل از اینکه برنامه شما به نقطهای برسد که میخواهید جریان بررسی درونبرنامهای را نشان دهید، شروع کنید.
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.
}
مدیریت وضعیتها و راهاندازی جریان بررسی درونبرنامهای
هر زمان که یک درخواست شروع شده باشد یا جریان بررسی درون برنامهای راهاندازی شده باشد، میتوانید وضعیت را با استفاده از ReviewManager_getReviewStatus بررسی کنید. این به شما امکان میدهد منطق را بسته به وضعیت API تعریف کنید. یک راه برای دستیابی به این هدف، نگه داشتن وضعیت به عنوان یک متغیر سراسری و بررسی این است که آیا وضعیت REVIEW_REQUEST_FLOW_COMPLETED است یا خیر، همانطور که در مثال زیر نشان داده شده است:
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;
}
وقتی وضعیت REVIEW_REQUEST_FLOW_COMPLETED شد و برنامه شما آماده شد، جریان بررسی درون برنامهای را اجرا کنید:
// 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; }
پس از راهاندازی جریان بررسی درونبرنامهای، وضعیت تکمیل را بررسی کنید و به جریان برنامه خود ادامه دهید. یک روش معمول برای مدیریت این موضوع، پیروی از الگوی حلقه بازی (Game Loop) است.
منابع رایگان
فراموش نکنید که پس از اتمام استفاده از API توسط برنامه (مثلاً پس از اتمام جریان بررسی درون برنامه)، با فراخوانی تابع ReviewManager_destroy منابع را آزاد کنید.
void ReviewManager_destroy();
مراحل بعدی
جریان بررسی درونبرنامهای برنامهتان را آزمایش کنید تا مطمئن شوید که یکپارچهسازی شما به درستی کار میکند.