Uygulama içi güncellemeleri destekleme (Yerel)

Bu kılavuzda, uygulama içi reklamların güncellemelerini yerel kod (C veya C++). Uygulamanızda Kotlin programlama dili veya Java programlama ve dilbilginizin uygulama Unity'yi kullanır.

Yerel SDK'ya genel bakış

Play Core Yerel SDK'sı, Play Core'un bir parçasıdır. SDK ailesi. Yerel SDK, sarmalayan bir C başlık dosyası (app_update.h) içeriyor AppUpdateManager Java Play Uygulama İçi Güncelleme Kitaplığı'ndan. Bu başlık dosyası, uygulamanızın şunu yapmasına olanak tanır: uygulama içi güncellemeler için API'yi doğrudan yerel kodunuzdan çağırın.

Geliştirme ortamınızı ayarlama

İndir Play Core Native SDK

İndirmeden önce aşağıdaki şartlar ve koşulları kabul etmeniz gerekir.

Hükümler ve Koşullar

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.
İndirin: Play Core Native SDK

play-core-native-sdk-1.14.0.zip

  1. Aşağıdakilerden birini yapın:

    • Android Studio'nun 4.0 veya sonraki bir sürümünü yükleyin. SDK'yı kullanma Android SDK Platformu 10.0 (API düzeyi 29) sürümünü yüklemek için Yönetici kullanıcı arayüzü.
    • Android SDK komut satırı araçlarını yükleme ve yüklemek için sdkmanager'ı kullanın Android SDK Platform 10.0 sürümü (API düzeyi 29).
  2. Şunu kullanarak Android Studio'yu yerel geliştirme için hazırlayın: En yeni sürümü yüklemek için SDK Yöneticisi CMake ve Android Yerel Geliştirme Kiti (NDK). Daha fazla bilgi için yerel projeler oluşturmayı veya içe aktarmayı öğrenmek için NDK'yı Kullanmaya Başlama.

  3. ZIP dosyasını indirin ve projenizle birlikte çıkarın.

    Bağlantıyı İndir Boyut SHA-256 Sağlaması
    36 MiB 782a8522d937848c83a715c9a258b95a3ff2879a7cd71855d137b41c00786a5e
  4. Uygulamanızın build.gradle dosyasını aşağıda gösterildiği gibi güncelleyin:

    Eski

        // 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"))
        ...
    }
    
  5. Uygulamanızın CMakeLists.txt dosyalarını aşağıda gösterildiği gibi güncelleyin:

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

Veri Toplama

Play Core Yerel SDK'sı, Google'ın şunları yapmasına izin vermek için sürümle ilgili verileri toplayabilir: Aşağıdakiler dahil olmak üzere ürünü iyileştirmek için:

  • Uygulamanın paket adı
  • Uygulamanın paket sürümü
  • Play Core Yerel SDK sürümü

Bu veriler, uygulama paketinizi yüklediğinizde toplanır. Play Console'a yükleyebilirsiniz. Bu veri toplama işlemini devre dışı bırakmak için Build.gradle dosyasında $playcoreDir/playcore-native-metadata.jar içe aktarması yapın.

Bu veri toplama işlemi, Play Core Yerel SDK ve Google'ın toplanan verileri kullanımı Google'ın uygulamanızı yüklediğinizde Gradle'da tanımlanan kitaplık bağımlılıkları koleksiyonu Play Console'a geri yükleyebilirsiniz.

Play Core Yerel SDK'sını projenize entegre ettikten sonra API çağrıları içeren dosyalarda aşağıdaki satırı ekleyin:

#include "play/app_update.h"

Uygulama içi güncelleme API'sini başlatma

Uygulama içi güncelleme API'sini her kullanışınızda ilk olarak AppUpdateManager_init() aşağıdaki örnekte gösterildiği gibi, android_native_app_glue.h:

void android_main(android_app* app) {
  app->onInputEvent = HandleInputEvent;

  AppUpdateErrorCode error_code =
    AppUpdateManager_init(app->activity->vm, app->activity->clazz);
  if (error_code == APP_UPDATE_NO_ERROR) {
    // You can use the API.
  }
}

Güncelleme kullanılabilirliğini kontrol etme

Güncelleme isteğinde bulunmadan önce uygulamasını indirin. AppUpdateManager_requestInfo() lansmanını yapmak için gereken bilgileri toplayan, eş zamansız bir istek başlatır daha sonra tekrar kontrol edebilirsiniz. APP_UPDATE_NO_ERROR isteği başarıyla başlatılır.

AppUpdateErrorCode error_code = AppUpdateManager_requestInfo()

if (error_code == APP_UPDATE_NO_ERROR) {
    // The request has successfully started, check the result using
    // AppUpdateManager_getInfo.
}

Devam eden süreci ve isteğin sonucunu AppUpdateManager_getInfo(). Bu işlev, hata koduna ek olarak, AppUpdateInfo güncelleme hakkında bilgi almak için kullanabileceğiniz opaque struct: isteği gönderin. Örneğin, her oyun döngüsünde bu işlevi info için null olmayan bir sonuç döndürene kadar devam eder:

AppUpdateInfo* info;
GameUpdate() {

   // Keep calling this in every game loop until info != nullptr
   AppUpdateErrorCode error_code = AppUpdateManager_getInfo(&info);


   if (error_code == APP_UPDATE_NO_ERROR && info != nullptr) {
       // Successfully started, check the result in the following functions
   }
...
}

Güncelleme eskiliğini kontrol etme

Bir güncelleme olup olmadığını kontrol etmenin yanı sıra, kullanıcıya bir güncellemenin bildirilmesinden bu yana ne kadar süre geçtiğini kontrol etme Play Store üzerinden satın alabilirsiniz. Bu, bir risk yönetimi planı başlatmanız gerekip gerekmediğine Esnek güncelleme veya anında güncelleme. Örneğin, proje ekibinin Kullanıcıya esnek bir güncellemeyle bildirmeden önce ve bunun ardından birkaç gün ve hemen bir güncelleme gerektirmeden çalışır.

Tekliflerinizi otomatikleştirmek ve optimize etmek için AppUpdateInfo_getClientVersionStalenessDays() güncellemenin Play üzerinden kullanıma sunulmasından bu yana geçen gün sayısını kontrol etmek için Sakla:

int32_t staleness_days = AppUpdateInfo_getClientVersionStalenessDays(info);

Güncelleme önceliğini kontrol edin

Google Play Developer API, her güncellemenin önceliğini belirlemenize olanak tanır. Bu, uygulamanızın kullanıcıya ne kadar önemli bir güncelleme önereceğine karar vermesine olanak tanır. Örneğin, güncelleme önceliğini ayarlamak için aşağıdaki stratejiyi göz önünde bulundurun:

  • Kullanıcı arayüzünde küçük iyileştirmeler: Düşük öncelikli güncelleme; ne esnek ne de veya hemen bir güncelleme olması gerekir. Yalnızca kullanıcı etkileşim kurmadığında güncelle nasıl sağlayabileceğini de öğreneceksiniz.
  • Performans iyileştirmeleri: Orta öncelikli güncelleme; esnek bir şekilde güncelleyin.
  • Kritik güvenlik güncellemesi: Yüksek öncelikli güncelleme; derhal istekte bulunma güncelleyin.

Google Play, önceliği belirlemek için 0 ile 5 arasında bir tam sayı değeri (0) kullanır 5 en yüksek önceliğe sahiptir. Bir güncellemek için inAppUpdatePriority alanını kullanın Edits.tracks.releases inceleyebilirsiniz. Bu sürüme eklenen tüm yeni sürümler yayınla aynı önceliğe sahip olduğunu kabul eder. Öncelik yalnızca şu durumlarda ayarlanabilir: ve daha sonra değiştirilemez.

Önceliği Google Play Geliştirici API'sini kullanarak Play Geliştirici API'sı dokümanlarına göz atın. Şurada uygulama içi güncelleme önceliğini belirtin: Edit.tracks kaynak Edit.tracks: update yöntemidir. Aşağıdaki örnekte, bir uygulamanın sürüm koduyla yayınlanması gösterilmektedir 88 ve inAppUpdatePriority 5:

{
  "releases": [{
      "versionCodes": ["88"],
      "inAppUpdatePriority": 5,
      "status": "completed"
  }]
}

Uygulamanızın kodunda, belirli bir güncellemenin öncelik düzeyini kontrol etmek için aşağıdakileri kullanabilirsiniz: AppUpdateInfo_getPriority():

int32_t priority = AppUpdateInfo_getPriority(info);

Güncelleme başlatın

Bir güncellemenin olduğunu onayladıktan sonra, şunu kullanarak güncelleme isteğinde bulunabilirsiniz: AppUpdateManager_requestStartUpdate(). Güncelleme isteğinde bulunmadan önce güncel bir AppUpdateInfo nesnesini alın ve oluştur AppUpdateOptions nesnesini tanımlayın. AppUpdateOptions nesnesi, uygulama içi güncelleme akışı seçenekleri de dahil olmak üzere veya ihtiyaca anında cevap verir.

Aşağıdaki örnek, esnek bir güncelleme için bir AppUpdateOptions nesnesi oluşturur akış:

// Creates an AppUpdateOptions configuring a flexible in-app update flow.
AppUpdateOptions* options;
AppUpdateErrorCode error_code = AppUpdateOptions_createOptions(APP_UPDATE_TYPE_FLEXIBLE, &options);

Aşağıdaki örnekte, hemen kullanmak için bir AppUpdateOptions nesnesi güncelleme akışı:

// Creates an AppUpdateOptions configuring an immediate in-app update flow.
AppUpdateOptions* options;
AppUpdateErrorCode error_code = AppUpdateOptions_createOptions(APP_UPDATE_TYPE_IMMEDIATE, &options);

AppUpdateOptions nesnesi ayrıca bir AllowAssetPackDeletion alanı içeriyor güncellemenin öğe silmesine izin verilip verilmediğini tanımlayan paketlerini kullanıma sunmaya dikkat edin. Bu alanı varsayılan olarak false değerine ayarlanır, ancak AppUpdateOptions_setAssetPackDeletionAllowed() yöntemini kullanarak bunu true olarak ayarlayın:

bool allow = true;
AppUpdateErrorCode error_code = AppUpdateOptions_setAssetPackDeletionAllowed(options, allow);

Güncel bir AppUpdateInfo nesneniz ve uygun şekilde yapılandırılmış bir öğeniz olduğunda AppUpdateOptions nesnesi, için AppUpdateManager_requestStartUpdate() öğesini çağırın bir Android Etkinliği jobject ileterek eşzamansız olarak güncelleme akışı isteğinde bulunma nihai parametre için.

AppUpdateErrorCode request_error_code =
AppUpdateManager_requestStartUpdate(info, options, app->activity->clazz);

Kaynakları yer açmak için AppUpdateInfo ve Artık ihtiyacınız olmayan AppUpdateOptions numaralı telefonu arayarak AppUpdateInfo_destroy() ve AppUpdateOptions_destroy(), tıklayın.

AppUpdateInfo_destroy(info);
AppUpdateOptions_destroy(options);

Google Play, anında güncelleme akışı için bir kullanıcı onay sayfası gösterir. Kullanıcı isteği kabul ettiğinde Google Play otomatik olarak indirme işlemini ve Güncellemeyi ön planda yükler, ardından uygulamayı güncellenmiş sürümünü de yükleyebilirsiniz.

Esnek güncelleme akışı için güncel AppUpdateInfo isteğinde bulunmaya devam edebilirsiniz. kullanıcı güncelleme işlemine devam ederken geçerli güncelleme uygulamayla etkileşim kurabilir. İndirme işlemi başarıyla tamamlandıktan sonra öğesini çağırarak güncellemenin tamamlanmasını tetiklemek AppUpdateManager_requestCompleteUpdate(), aşağıdaki örnekte gösterildiği gibi:

AppUpdateStatus status = AppUpdateInfo_getStatus(info);
if (status == APP_UPDATE_DOWNLOADED) {
    AppUpdateErrorCode error_code = AppUpdateManager_requestCompleteUpdate();
    if (error_code != APP_UPDATE_NO_ERROR)
    {
      // There was an error while completing the update flow.
    }
}

Şu numarayı arayarak kaynakları serbest bırakın: AppUpdateManager_destroy() işlevini kullanın.

Hata işleme

Bu bölümde, belirli yapılandırmalar tarafından belirtilen yaygın hataların çözümleri AppUpdateErrorCode değerleri:

  • -110, APP_UPDATE_INITIALIZATION_NEEDED hata kodu, API başarıyla başlatılamadı. AppUpdateManager_init() numaralı telefonu arayın: API'yi başlatın.
  • -4, APP_UPDATE_INVALID_REQUEST hata kodu, bazı durumlarda güncelleme akışı isteğinin parametreleri hatalı biçimlendirilmiş. Kontrol ederek AppUpdateInfo ve AppUpdateOptions nesneleri boş değil ve doğru biçimlendirilmiş olmalıdır.
  • -5, APP_UPDATE_UNAVAILABLE hata kodu, geçerli güncelleme mevcut. Hedef sürümün paket adı, uygulama kimliğini, ve imzalama anahtarı. Güncelleme varsa uygulamanın önbelleğini temizleyin ve AppUpdateManager_requestAppUpdateInfo() öğesini tekrar çağırarak sayfayı yenile AppUpdateInfo.
  • -6, APP_UPDATE_NOT_ALLOWED hata kodu, güncelleme türünü belirtir öğesi ile belirtilen AppUpdateOption nesnesine izin verilmiyor. Doğrulamanın AppUpdateInfo nesnesi, güncelleme türüne güncelleme akışını başlatın.

Sonraki adımlar

Uygulamanızın uygulama içi güncellemelerini test ederek entegrasyonunuzun düzgün çalıştığını doğrulayın.