Klasik API isteği yapma

Yalnızca geliştiricilerin çoğu için uygun olan standart API istekleri göndermeyi planlıyorsanız bütünlük kararları bölümüne geçebilirsiniz. Bu sayfada, Android 4.4 (API düzeyi 19) veya sonraki sürümlerde desteklenen bütünlük kararları için klasik API isteklerinin nasıl yapılacağı açıklanmaktadır.

Dikkat edilmesi gereken noktalar

Standart ve klasik istekleri karşılaştırma

Uygulamanızın güvenliğini sağlamak ve kötüye kullanımını önlemek için gerekirse standart istekleri veya klasik istekleri seçebilir ya da bu ikisini birlikte kullanmayı tercih edebilirsiniz. Standart istekler tüm uygulamalar ve oyunlar için uygun olup herhangi bir işlemin veya sunucu çağrısının gerçekliğini kontrol etmek amacıyla kullanılabilir. Aynı zamanda, tekrar oynanabilirliğe ve veri sızıntısına karşı koruma sağlama yetkisini Google Play'e verir. Klasik istekler daha maliyetli olup veri sızıntısına ve belirli saldırı türlerine karşı koruma sağlamak için bu isteklerin doğru şekilde uygulanması sizin sorumluluğunuzdadır. Klasik istekler, standart isteklere kıyasla daha az sıklıkta yapılmalıdır. Örneğin, yüksek değere sahip veya hassas bir işlemin gerçek olup olmadığını kontrol etmek için ara sıra tek seferlik olarak yapılabilir.

Aşağıdaki tabloda, iki istek türü arasındaki temel farklar vurgulanmaktadır:

Standart API isteği Klasik API isteği
Ön koşullar
Gereken minimum Android SDK sürümü Android 5.0 (API düzeyi 21) veya sonraki sürümler Android 4.4 (API düzeyi 19) veya sonraki sürümler
Google Play şartları Google Play Store ve Google Play Hizmetleri Google Play Store ve Google Play Hizmetleri
Entegrasyon ayrıntıları
API ısınma şartı ✔️ (birkaç saniye)
İsteğin normal gecikme süresi Birkaç yüz milisaniye Birkaç saniye
Olası istek sıklığı Sık (herhangi bir işlem veya istek için talep üzerine kontrol) Nadir (en yüksek değere sahip işlemler veya en hassas istekler için tek seferlik kontrol)
Engelleme Çoğu ısınma işlemi 10 saniyeden kısa sürer ancak sunucu çağrısı içerdiğinden uzun bir zaman aşımı önerilir (ör. 1 dakika). Karar istekleri istemci tarafında gerçekleşir. Çoğu istek 10 saniyeden kısadır ancak sunucu çağrısı içerdiğinden uzun bir zaman aşımı önerilir (ör.1 dakika).
Bütünlük değerlendirmesi jetonu
Cihaz, uygulama ve hesap ayrıntılarını içerir. ✔️ ✔️
Jeton önbelleğe alma Google Play tarafından korunan cihaz üzerinde önbelleğe alma Önerilmez
Google Play sunucusu aracılığıyla jetonun şifresini çözme ve jetonu doğrulama ✔️ ✔️
Normal şifre çözme sunucudan sunucuya istek gecikmesi Üç dokuz kullanılabilirlik ile 10 milisaniye Üç dokuz kullanılabilirlik ile 10 milisaniye
Jetonu güvenli bir sunucu ortamında yerel olarak şifre çözme ve doğrulama ✔️
Jetonun istemci tarafında şifresini çözme ve jetonu doğrulama
Bütünlük değerlendirmesi güncelliği Google Play tarafından otomatik olarak yapılan bazı önbelleğe alma ve yenileme işlemleri Her istekte tüm kararlar yeniden hesaplanır.
Sınırlar
Günlük uygulama başına istek sayısı Varsayılan olarak 10.000 (artış talep edilebilir) Varsayılan olarak 10.000 (artış isteğinde bulunulabilir)
Dakikada uygulama örneği başına istek sayısı Isınma: Dakikada 5
Bütünlük jetonları: Herkese açık sınır yok*
Bütünlük jetonları: Dakikada 5
Koruma
Kurcalama ve benzer saldırılara karşı çözüm requestHash alanını kullanma İstek verilerine göre içerik bağlama ile nonce alanını kullanma
Tekrar oynama ve benzer saldırılara karşı çözüm Google Play'den otomatik çözüm nonce alanını sunucu tarafı mantığıyla kullanın

* Herkese açık sınırları olmayanlar da dahil olmak üzere tüm istekler, yüksek değerlerde herkese açık olmayan savunma sınırlarına tabidir.

Klasik istekleri seyrek yapın

Integrity jetonu oluşturmak için zaman, veri ve pil gerekir. Ayrıca her uygulamanın günlük olarak yapabileceği maksimum klasik istek sayısı vardır. Bu nedenle, standart bir isteğe ek garanti istediğinizde yalnızca en yüksek değere sahip veya en hassas işlemlerin gerçek olup olmadığını kontrol etmek için klasik istekte bulunmalısınız. Yüksek sıklıkta veya düşük değerli işlemler için klasik istekler göndermemelisiniz. Uygulama her ön plana geldiğinde veya arka planda birkaç dakikada bir klasik istek göndermeyin ve aynı anda çok sayıda cihazdan arama yapmaktan kaçının. Çok fazla klasik istek çağrısı yapan uygulamaların, kullanıcıları yanlış uygulamalardan korumak için istek sayısı sınırlandırılabilir.

Önbelleğe alınan kararlardan kaçınma

Bir kararın önbelleğe alınması, güvenilmeyen bir ortamda iyi bir kararın yeniden kullanıldığı sızdırma ve yeniden oynatma gibi saldırıların riskini artırır. Klasik bir istekte bulunup daha sonra kullanmak üzere önbelleğe almayı düşünüyorsanız bunun yerine isteğe bağlı olarak standart bir istekte bulunmanız önerilir. Standart istekler cihazda bir miktar önbelleğe alma işlemi içerir ancak Google Play, tekrar oynatma saldırıları ve veri sızıntısı riskini azaltmak için ek koruma teknikleri kullanır.

Klasik istekleri korumak için nonce alanını kullanma

Play Integrity API, nonce adlı bir alan sunar. Bu alan, uygulamanızı yeniden oynatma ve izinsiz değişiklik saldırıları gibi belirli saldırılara karşı daha iyi korumak için kullanılabilir. Play Integrity API, bu alanda ayarladığınız değeri imzalı bütünlük yanıtında döndürür. Uygulamanızı saldırılardan korumak için nonce oluşturma ile ilgili talimatları dikkatlice uygulayın.

Eksponansiyel geri yüklemeyle klasik istekleri yeniden deneme

Kararsız internet bağlantısı veya aşırı yüklenmiş cihaz gibi çevresel koşullar, cihaz bütünlüğü kontrollerinin başarısız olmasına neden olabilir. Bu durum, aksi takdirde güvenilir olan bir cihaz için etiket oluşturulmamasına neden olabilir. Bu senaryoları azaltmak için eksponansiyel geri yüklemeyle yeniden deneme seçeneğini ekleyin.

Genel Bakış

1.şekil Play Integrity API'nin üst düzey tasarımını gösteren sıralama şeması.

Kullanıcı, uygulamanızda bütünlük kontrolüyle korumak istediğiniz yüksek değerli bir işlem gerçekleştirdiğinde aşağıdaki adımları tamamlayın:

  1. Uygulamanızın sunucu tarafı arka ucu, istemci tarafı mantığına benzersiz bir değer oluşturup gönderir. Kalan adımlarda bu mantık "uygulamanız" olarak adlandırılır.
  2. Uygulamanız, yüksek değerli işleminizin benzersiz değeri ve içeriğinden nonce oluşturur. Ardından, Play Integrity API'yi çağırarak nonce değerini iletir.
  3. Uygulamanız, Play Integrity API'den imzalı ve şifrelenmiş bir karar alır.
  4. Uygulamanız, imzalı ve şifrelenmiş kararı uygulamanızın arka ucuna iletir.
  5. Uygulamanızın arka ucu, kararı bir Google Play sunucusuna gönderir. Google Play sunucusu, değerlendirmenin şifresini çözüp doğrular ve sonuçları uygulamanızın arka ucuna döndürür.
  6. Uygulamanızın arka ucu, jeton yükünde yer alan sinyallere göre nasıl devam edeceğini belirler.
  7. Uygulamanızın arka ucu, karar sonuçlarını uygulamanıza gönderir.

Nonce oluşturma

Uygulamanızdaki bir işlemi Play Integrity API ile koruduğunuzda, nonce alanından yararlanarak ortadaki adam (PITM) saldırıları ve yeniden oynatma saldırıları gibi belirli saldırı türlerini azaltabilirsiniz. Play Integrity API, bu alanda ayarladığınız değeri imzalı bütünlük yanıtında döndürür.

nonce alanında ayarlanan değer doğru şekilde biçimlendirilmelidir:

  • String
  • URL'de güvenli
  • Base64 olarak kodlanmış ve sarmalanmamış
  • En az 16 karakter
  • Maksimum 500 karakterdir

Play Integrity API'de nonce alanını kullanmanın yaygın yollarından bazıları aşağıda verilmiştir. nonce'dan en güçlü korumayı elde etmek için aşağıdaki yöntemleri birleştirebilirsiniz.

Kurcalamaya karşı korumak için istek karması ekleyin

İsteğin içeriğini kurcalamaya karşı korumak için klasik API isteğinde nonce parametresini standart API isteğindeki requestHash parametresine benzer şekilde kullanabilirsiniz.

Bütünlük değerlendirmesi istediğinizde:

  1. Gerçekleşen kullanıcı işleminden veya sunucu isteğinden tüm kritik istek parametrelerinin (ör. sabit bir istek serileştirmesinin SHA256'sı) özetini hesaplayın.
  2. setNonce alanını hesaplanan özetin değerine ayarlamak için nonce öğesini kullanın.

Bütünlük değerlendirmesi aldığınızda:

  1. Bütünlük jetonunun kodunu çözüp doğrulayın ve özet değerini nonce alanından alın.
  2. İsteğin özetini uygulamadakiyle aynı şekilde hesaplayın (ör. kararlı bir istek serileştirmesinin SHA256'sı).
  3. Uygulama tarafı ve sunucu tarafı özetlerini karşılaştırın. Eşleşmemeleri durumunda istek güvenilir değildir.

Yeniden oynatma saldırılarına karşı korunmak için benzersiz değerler ekleyin

Kötü amaçlı kullanıcıların Play Integrity API'den gelen önceki yanıtları yeniden kullanmasını önlemek için nonce alanını kullanarak her mesajı benzersiz şekilde tanımlayabilirsiniz.

Bütünlük değerlendirmesi istediğinizde:

  1. Kötü niyetli kullanıcıların tahmin edemeyeceği şekilde genel olarak benzersiz bir değer elde edin. Örneğin, sunucu tarafında oluşturulan kriptografik olarak güvenli bir rastgele sayı veya oturum ya da işlem kimliği gibi önceden var olan bir kimlik bu tür bir değer olabilir. Daha basit ve daha az güvenli bir varyant, cihazda rastgele bir sayı oluşturmaktır. 128 bit veya daha büyük değerler oluşturmanızı öneririz.
  2. nonce alanını 1. adımdaki benzersiz değere ayarlamak için setNonce() işlevini çağırın.

Bütünlük değerlendirmesi aldığınızda:

  1. Bütünlük jetonunun kodunu çözüp doğrulayın ve nonce alanından benzersiz değeri alın.
  2. 1. adımdaki değer sunucuda oluşturulduysa alınan benzersiz değerin, oluşturulan değerlerden biri olduğunu ve ilk kez kullanıldığını kontrol edin (sunucunuzun, oluşturulan değerlerin kaydını uygun bir süre boyunca tutması gerekir). Alınan benzersiz değer daha önce kullanılmışsa veya kayıtta görünmüyorsa isteği reddedin.
  3. Aksi takdirde, benzersiz değer cihazda oluşturulduysa alınan değerin ilk kez kullanıldığını kontrol edin (sunucunuz, uygun bir süre boyunca daha önce görülen değerlerin kaydını tutmalıdır). Alınan benzersiz değer daha önce kullanıldıysa isteği reddedin.

Hem kurcalamaya hem de tekrar oynatma saldırılarına karşı korumayı birleştirin (önerilir).

nonce alanı, hem kurcalama hem de yeniden oynatma saldırılarına karşı aynı anda korunmak için kullanılabilir. Bunu yapmak için yukarıda açıklandığı gibi benzersiz değeri oluşturun ve isteğinize ekleyin. Ardından, benzersiz değeri karma oluşturma işlemine dahil ettiğinizden emin olarak istek karmasını hesaplayın. Her iki yaklaşımı birleştiren bir uygulama şu şekildedir:

Bütünlük değerlendirmesi istediğinizde:

  1. Kullanıcı, yüksek değerli işlemi başlatır.
  2. Yeniden oynatma saldırılarına karşı korumak için benzersiz değerler ekleme bölümünde açıklandığı gibi bu işlem için benzersiz bir değer alın.
  3. Korumak istediğiniz iletiyi hazırlayın. İletiye 2. adımda elde edilen benzersiz değeri ekleyin.
  4. Uygulamanız, Kurcalamaya karşı korumak için istek karması ekleme bölümünde açıklandığı gibi, korumak istediği mesajın özetini hesaplar. İleti benzersiz değeri içerdiğinden benzersiz değer, karma oluşturma işlemine dahil edilir.
  5. nonce alanını önceki adımda hesaplanan özet olarak ayarlamak için setNonce() kullanın.

Bütünlük değerlendirmesi aldığınızda:

  1. İstekten benzersiz değeri alma
  2. Bütünlük jetonunun kodunu çözüp doğrulayın ve özet değerini nonce alanından alın.
  3. Kurcalamaya karşı korumak için istek karması ekleme bölümünde açıklandığı gibi, özet değerini sunucu tarafında yeniden hesaplayın ve bütünlük jetonundan elde edilen özet değeriyle eşleştiğini kontrol edin.
  4. Yeniden oynatma saldırılarına karşı korunmak için benzersiz değerler ekleme bölümünde açıklandığı gibi, benzersiz değerin geçerliliğini kontrol edin.

Aşağıdaki sıra şeması, bu adımları sunucu tarafı nonce ile gösterir:

Şekil 2. Hem kurcalama hem de yeniden oynatma saldırılarına karşı nasıl korunulacağını gösteren sıralı diyagram.

Bütünlük değerlendirmesi isteğinde bulunma

nonce oluşturduktan sonra Google Play'den bütünlük değerlendirmesi isteyebilirsiniz. Bunun için aşağıdaki adımları uygulayın:

  1. Aşağıdaki örneklerde gösterildiği gibi bir IntegrityManager oluşturun.
  2. İlişkili oluşturucudaki setNonce() yöntemiyle nonce değerini sağlayarak bir IntegrityTokenRequest oluşturun. Yalnızca Google Play dışında dağıtılan uygulamalar ve SDK'lar da setCloudProjectNumber() yöntemiyle Google Cloud proje numaralarını belirtmelidir. Google Play'deki uygulamalar Play Console'da bir Cloud projesine bağlıdır ve istekte Cloud proje numarasının ayarlanması gerekmez.
  3. requestIntegrityToken() adlı işlevi çağırmak için yöneticiyi kullanın ve IntegrityTokenRequest değerini sağlayın.

Kotlin

// Receive the nonce from the secure server.
val nonce: String = ...

// Create an instance of a manager.
val integrityManager =
    IntegrityManagerFactory.create(applicationContext)

// Request the integrity token by providing a nonce.
val integrityTokenResponse: Task<IntegrityTokenResponse> =
    integrityManager.requestIntegrityToken(
        IntegrityTokenRequest.builder()
             .setNonce(nonce)
             .build())

Java

import com.google.android.gms.tasks.Task; ...

// Receive the nonce from the secure server.
String nonce = ...

// Create an instance of a manager.
IntegrityManager integrityManager =
    IntegrityManagerFactory.create(getApplicationContext());

// Request the integrity token by providing a nonce.
Task<IntegrityTokenResponse> integrityTokenResponse =
    integrityManager
        .requestIntegrityToken(
            IntegrityTokenRequest.builder().setNonce(nonce).build());

Unity

IEnumerator RequestIntegrityTokenCoroutine() {
    // Receive the nonce from the secure server.
    var nonce = ...

    // Create an instance of a manager.
    var integrityManager = new IntegrityManager();

    // Request the integrity token by providing a nonce.
    var tokenRequest = new IntegrityTokenRequest(nonce);
    var requestIntegrityTokenOperation =
        integrityManager.RequestIntegrityToken(tokenRequest);

    // Wait for PlayAsyncOperation to complete.
    yield return requestIntegrityTokenOperation;

    // Check the resulting error code.
    if (requestIntegrityTokenOperation.Error != IntegrityErrorCode.NoError)
    {
        AppendStatusLog("IntegrityAsyncOperation failed with error: " +
                requestIntegrityTokenOperation.Error);
        yield break;
    }

    // Get the response.
    var tokenResponse = requestIntegrityTokenOperation.GetResult();
}

Unreal Engine

// .h
void MyClass::OnRequestIntegrityTokenCompleted(
  EIntegrityErrorCode ErrorCode,
  UIntegrityTokenResponse* Response)
{
  // Check the resulting error code.
  if (ErrorCode == EIntegrityErrorCode::Integrity_NO_ERROR)
  {
    // Get the token.
    FString Token = Response->Token;
  }
}

// .cpp
void MyClass::RequestIntegrityToken()
{
  // Receive the nonce from the secure server.
  FString Nonce = ...

  // Create the Integrity Token Request.
  FIntegrityTokenRequest Request = { Nonce };

  // Create a delegate to bind the callback function.
  FIntegrityOperationCompletedDelegate Delegate;

  // Bind the completion handler (OnRequestIntegrityTokenCompleted) to the delegate.
  Delegate.BindDynamic(this, &MyClass::OnRequestIntegrityTokenCompleted);

  // Initiate the integrity token request, passing the delegate to handle the result.
  GetGameInstance()
    ->GetSubsystem<UIntegrityManager>()
    ->RequestIntegrityToken(Request, Delegate);
}

Yerel

/// Create an IntegrityTokenRequest opaque object.
const char* nonce = RequestNonceFromServer();
IntegrityTokenRequest* request;
IntegrityTokenRequest_create(&request);
IntegrityTokenRequest_setNonce(request, nonce);

/// Prepare an IntegrityTokenResponse opaque type pointer and call
/// IntegerityManager_requestIntegrityToken().
IntegrityTokenResponse* response;
IntegrityErrorCode error_code =
        IntegrityManager_requestIntegrityToken(request, &response);

/// ...
/// Proceed to polling iff error_code == INTEGRITY_NO_ERROR
if (error_code != INTEGRITY_NO_ERROR)
{
    /// Remember to call the *_destroy() functions.
    return;
}
/// ...
/// Use polling to wait for the async operation to complete.
/// Note, the polling shouldn't block the thread where the IntegrityManager
/// is running.

IntegrityResponseStatus response_status;

/// Check for error codes.
IntegrityErrorCode error_code =
        IntegrityTokenResponse_getStatus(response, &response_status);
if (error_code == INTEGRITY_NO_ERROR
    && response_status == INTEGRITY_RESPONSE_COMPLETED)
{
    const char* integrity_token = IntegrityTokenResponse_getToken(response);
    SendTokenToServer(integrity_token);
}
/// ...
/// Remember to free up resources.
IntegrityTokenRequest_destroy(request);
IntegrityTokenResponse_destroy(response);
IntegrityManager_destroy();

Bütünlük değerlendirmesini şifre çözme ve doğrulama

Bütünlük değerlendirmesi istediğinizde Play Integrity API, imzalı bir yanıt jetonu sağlar. İsteğinize eklediğiniz nonce, yanıt jetonunun bir parçası olur.

Jeton biçimi

Jeton, JSON Web Token (JWT) olan iç içe yerleştirilmiş bir JSON Web Encryption (JWE)'dir. Bu da JSON Web Signature (JWS)'dir. JWE ve JWS bileşenleri, compact serialization kullanılarak gösterilir .

Şifreleme / imzalama algoritmaları, çeşitli JWT uygulamalarında iyi bir şekilde desteklenir:

  • JWE, alg için A256KW, enc için A256GCM kullanır.

  • JWS, ES256'yı kullanır.

Google'ın sunucularında şifre çözme ve doğrulama (önerilir)

Play Integrity API, Google'ın sunucularında bütünlük değerlendirmesinin şifresini çözmenize ve doğruluğunu kontrol etmenize olanak tanır. Bu da uygulamanızın güvenliğini artırır. Bunun için aşağıdaki adımları uygulayın:

  1. Uygulamanıza bağlı Google Cloud projesinde hizmet hesabı oluşturun.
  2. Uygulamanızın sunucusunda, playintegrity kapsamını kullanarak hizmet hesabı kimlik bilgilerinizden erişim jetonunu getirin ve şu isteği gönderin:

    playintegrity.googleapis.com/v1/PACKAGE_NAME:decodeIntegrityToken -d \
    '{ "integrity_token": "INTEGRITY_TOKEN" }'
  3. JSON yanıtını okuyun.

Yerel olarak şifre çözme ve doğrulama

Yanıt şifreleme anahtarlarınızı yönetip indirmeyi seçerseniz döndürülen jetonun şifresini kendi güvenli sunucu ortamınızda çözebilir ve jetonu doğrulayabilirsiniz. IntegrityTokenResponse#token() yöntemini kullanarak döndürülen jetonu alabilirsiniz.

Aşağıdaki örnekte, Play Console'dan imza doğrulaması için AES anahtarının ve DER kodlu genel EC anahtarının, uygulamanın arka ucundaki dile özgü (örneğimizde Java programlama dili) anahtarlara nasıl kodunun çözüleceği gösterilmektedir. Anahtarların varsayılan işaretler kullanılarak Base64 kodlu olduğunu unutmayın.

Kotlin

// base64OfEncodedDecryptionKey is provided through Play Console.
var decryptionKeyBytes: ByteArray =
    Base64.decode(base64OfEncodedDecryptionKey, Base64.DEFAULT)

// Deserialized encryption (symmetric) key.
var decryptionKey: SecretKey = SecretKeySpec(
    decryptionKeyBytes,
    /* offset= */ 0,
    AES_KEY_SIZE_BYTES,
    AES_KEY_TYPE
)

// base64OfEncodedVerificationKey is provided through Play Console.
var encodedVerificationKey: ByteArray =
    Base64.decode(base64OfEncodedVerificationKey, Base64.DEFAULT)

// Deserialized verification (public) key.
var verificationKey: PublicKey = KeyFactory.getInstance(EC_KEY_TYPE)
    .generatePublic(X509EncodedKeySpec(encodedVerificationKey))

Java

// base64OfEncodedDecryptionKey is provided through Play Console.
byte[] decryptionKeyBytes =
    Base64.decode(base64OfEncodedDecryptionKey, Base64.DEFAULT);

// Deserialized encryption (symmetric) key.
SecretKey decryptionKey =
    new SecretKeySpec(
        decryptionKeyBytes,
        /* offset= */ 0,
        AES_KEY_SIZE_BYTES,
        AES_KEY_TYPE);

// base64OfEncodedVerificationKey is provided through Play Console.
byte[] encodedVerificationKey =
    Base64.decode(base64OfEncodedVerificationKey, Base64.DEFAULT);
// Deserialized verification (public) key.
PublicKey verificationKey =
    KeyFactory.getInstance(EC_KEY_TYPE)
        .generatePublic(new X509EncodedKeySpec(encodedVerificationKey));

Ardından, bu anahtarları kullanarak önce bütünlük jetonunun (JWE bölümü) şifresini çözün, ardından iç içe yerleştirilmiş JWS bölümünü doğrulayıp çıkarın.

Kotlin

val jwe: JsonWebEncryption =
    JsonWebStructure.fromCompactSerialization(integrityToken) as JsonWebEncryption
jwe.setKey(decryptionKey)

// This also decrypts the JWE token.
val compactJws: String = jwe.getPayload()

val jws: JsonWebSignature =
    JsonWebStructure.fromCompactSerialization(compactJws) as JsonWebSignature
jws.setKey(verificationKey)

// This also verifies the signature.
val payload: String = jws.getPayload()

Java

JsonWebEncryption jwe =
    (JsonWebEncryption)JsonWebStructure
        .fromCompactSerialization(integrityToken);
jwe.setKey(decryptionKey);

// This also decrypts the JWE token.
String compactJws = jwe.getPayload();

JsonWebSignature jws =
    (JsonWebSignature) JsonWebStructure.fromCompactSerialization(compactJws);
jws.setKey(verificationKey);

// This also verifies the signature.
String payload = jws.getPayload();

Elde edilen yük, bütünlük kararlarını içeren düz metin biçiminde bir jetondur.

Google Play istemiyle karar sorunlarını düzeltme (isteğe bağlı)

Sunucunuz bütünlük kararı aldıktan sonra nasıl devam edeceğine karar verebilir. Kararda, uygulamanın lisanssız olması, değiştirilmesi veya cihazın güvenliğinin ihlal edilmesi gibi bir sorun olduğu belirtiliyorsa kullanıcılara sorunu kendilerinin düzeltmesi için şans verebilirsiniz.

Play Integrity API, kullanıcıdan işlem yapmasını (ör. uygulamanızın resmi sürümünü Google Play'den edinmesini) isteyen bir Google Play iletişim kutusu gösterme seçeneği sunar.

Bu iletişim kutularını sunucunun yanıtına göre uygulamanızdan nasıl tetikleyeceğinizi öğrenmek için Düzeltme iletişim kutuları bölümüne bakın.

Cihaz bütünlüğüyle ilgili bir sorunu gidermede yardıma ihtiyaç duyarlarsa kullanıcılarınızı bu destek sayfasına yönlendirebilirsiniz.