احکام صداقت

این صفحه نحوه تفسیر و کار با حکم یکپارچگی برگشتی را شرح می دهد. چه درخواست API استاندارد یا کلاسیک داشته باشید، حکم یکپارچگی در همان قالب با محتوای مشابه برگردانده می‌شود. حکم یکپارچگی اطلاعات مربوط به اعتبار دستگاه‌ها، برنامه‌ها و حساب‌ها را به اشتراک می‌گذارد. سرور برنامه شما می‌تواند از محموله به‌دست‌آمده در یک حکم رمزگشایی و تأیید شده برای تعیین بهترین روش انجام یک اقدام یا درخواست خاص در برنامه شما استفاده کند.

قالب حکم یکپارچگی برگردانده شده

محموله JSON متن ساده است و حاوی سیگنال های یکپارچگی در کنار اطلاعات ارائه شده توسط توسعه دهنده است.

ساختار کلی بار به شرح زیر است:

{
  requestDetails: { ... }
  appIntegrity: { ... }
  deviceIntegrity: { ... }
  accountDetails: { ... }
  environmentDetails: { ... }
}

قبل از بررسی هر حکم یکپارچگی، ابتدا باید بررسی کنید که مقادیر موجود در قسمت requestDetails با مقادیر درخواست اصلی مطابقت داشته باشد. بخش های بعدی هر فیلد را با جزئیات بیشتری توضیح می دهند.

فیلد جزئیات درخواست

فیلد requestDetails حاوی اطلاعاتی درباره درخواست است، از جمله اطلاعات ارائه شده توسط توسعه‌دهنده در requestHash برای درخواست‌های استاندارد و nonce برای درخواست‌های کلاسیک.

برای درخواست های استاندارد API:

requestDetails: {
  // Application package name this attestation was requested for.
  // Note that this field might be spoofed in the middle of the request.
  requestPackageName: "com.package.name"
  // Request hash provided by the developer.
  requestHash: "aGVsbG8gd29scmQgdGhlcmU"
  // The timestamp in milliseconds when the integrity token
  // was requested.
  timestampMillis: "1675655009345"
}

این مقادیر باید با مقادیر درخواست اصلی مطابقت داشته باشد. بنابراین، همانطور که در قطعه کد زیر نشان داده شده است، با اطمینان از مطابقت requestPackageName و requestHash با آنچه در درخواست اصلی ارسال شده است، قسمت requestDetails از بار JSON را تأیید کنید:

کاتلین

val requestDetails = JSONObject(payload).getJSONObject("requestDetails")
val requestPackageName = requestDetails.getString("requestPackageName")
val requestHash = requestDetails.getString("requestHash")
val timestampMillis = requestDetails.getLong("timestampMillis")
val currentTimestampMillis = ...

// Ensure the token is from your app.
if (!requestPackageName.equals(expectedPackageName)
        // Ensure the token is for this specific request
    || !requestHash.equals(expectedRequestHash)
        // Ensure the freshness of the token.
    || currentTimestampMillis - timestampMillis > ALLOWED_WINDOW_MILLIS) {
        // The token is invalid! See below for further checks.
        ...
}

جاوا

RequestDetails requestDetails =
    decodeIntegrityTokenResponse
    .getTokenPayloadExternal()
    .getRequestDetails();
String requestPackageName = requestDetails.getRequestPackageName();
String requestHash = requestDetails.getRequestHash();
long timestampMillis = requestDetails.getTimestampMillis();
long currentTimestampMillis = ...;

// Ensure the token is from your app.
if (!requestPackageName.equals(expectedPackageName)
        // Ensure the token is for this specific request.
    || !requestHash.equals(expectedRequestHash)
        // Ensure the freshness of the token.
    || currentTimestampMillis - timestampMillis > ALLOWED_WINDOW_MILLIS) {
        // The token is invalid! See below for further checks.
        ...
}

برای درخواست های API کلاسیک :

requestDetails: {
  // Application package name this attestation was requested for.
  // Note that this field might be spoofed in the middle of the
  // request.
  requestPackageName: "com.package.name"
  // base64-encoded URL-safe no-wrap nonce provided by the developer.
  nonce: "aGVsbG8gd29scmQgdGhlcmU"
  // The timestamp in milliseconds when the request was made
  // (computed on the server).
  timestampMillis: "1617893780"
}

این مقادیر باید با مقادیر درخواست اصلی مطابقت داشته باشد. بنابراین، همانطور که در قطعه کد زیر نشان داده شده است، با اطمینان از مطابقت requestPackageName و nonce با آنچه در درخواست اصلی ارسال شده است، قسمت requestDetails از payload JSON را تأیید کنید:

کاتلین

val requestDetails = JSONObject(payload).getJSONObject("requestDetails")
val requestPackageName = requestDetails.getString("requestPackageName")
val nonce = requestDetails.getString("nonce")
val timestampMillis = requestDetails.getLong("timestampMillis")
val currentTimestampMillis = ...

// Ensure the token is from your app.
if (!requestPackageName.equals(expectedPackageName)
        // Ensure the token is for this specific request. See 'Generate a nonce'
        // section of the doc on how to store/compute the expected nonce.
    || !nonce.equals(expectedNonce)
        // Ensure the freshness of the token.
    || currentTimestampMillis - timestampMillis > ALLOWED_WINDOW_MILLIS) {
        // The token is invalid! See below for further checks.
        ...
}

جاوا

JSONObject requestDetails =
    new JSONObject(payload).getJSONObject("requestDetails");
String requestPackageName = requestDetails.getString("requestPackageName");
String nonce = requestDetails.getString("nonce");
long timestampMillis = requestDetails.getLong("timestampMillis");
long currentTimestampMillis = ...;

// Ensure the token is from your app.
if (!requestPackageName.equals(expectedPackageName)
        // Ensure the token is for this specific request. See 'Generate a nonce'
        // section of the doc on how to store/compute the expected nonce.
    || !nonce.equals(expectedNonce)
        // Ensure the freshness of the token.
    || currentTimestampMillis - timestampMillis > ALLOWED_WINDOW_MILLIS) {
        // The token is invalid! See below for further checks.
        ...
}

زمینه یکپارچگی برنامه

قسمت appIntegrity حاوی اطلاعات مربوط به بسته است.

appIntegrity: {
  // PLAY_RECOGNIZED, UNRECOGNIZED_VERSION, or UNEVALUATED.
  appRecognitionVerdict: "PLAY_RECOGNIZED"
  // The package name of the app.
  // This field is populated iff appRecognitionVerdict != UNEVALUATED.
  packageName: "com.package.name"
  // The sha256 digest of app certificates (base64-encoded URL-safe).
  // This field is populated iff appRecognitionVerdict != UNEVALUATED.
  certificateSha256Digest: ["6a6a1474b5cbbb2b1aa57e0bc3"]
  // The version of the app.
  // This field is populated iff appRecognitionVerdict != UNEVALUATED.
  versionCode: "42"
}

appRecognitionVerdict می تواند مقادیر زیر را داشته باشد:

PLAY_RECOGNIZED
برنامه و گواهی با نسخه های توزیع شده توسط Google Play مطابقت دارند.
UNRECOGNIZED_VERSION
گواهی یا نام بسته با سوابق Google Play مطابقت ندارد.
UNEVALUATED
یکپارچگی برنامه ارزیابی نشد. یک نیاز ضروری از قلم افتاده بود، مانند دستگاه به اندازه کافی قابل اعتماد نبود.

برای اطمینان از اینکه توکن توسط برنامه ای که توسط شما ایجاد شده است، بررسی کنید که یکپارچگی برنامه مطابق انتظار است، همانطور که در قطعه کد زیر نشان داده شده است:

کاتلین

val appIntegrity = JSONObject(payload).getJSONObject("appIntegrity")
val appRecognitionVerdict = appIntegrity.getString("appRecognitionVerdict")

if (appRecognitionVerdict == "PLAY_RECOGNIZED") {
    // Looks good!
}

جاوا

JSONObject appIntegrity =
    new JSONObject(payload).getJSONObject("appIntegrity");
String appRecognitionVerdict =
    appIntegrity.getString("appRecognitionVerdict");

if (appRecognitionVerdict.equals("PLAY_RECOGNIZED")) {
    // Looks good!
}

همچنین می‌توانید نام بسته برنامه، نسخه برنامه و گواهی‌های برنامه را به صورت دستی بررسی کنید.

زمینه یکپارچگی دستگاه

فیلد deviceIntegrity می‌تواند حاوی یک مقدار واحد باشد، deviceRecognitionVerdict ، که دارای یک یا چند برچسب است که نشان می‌دهد دستگاه چقدر می‌تواند یکپارچگی برنامه را اعمال کند. اگر دستگاهی با معیارهای هیچ یک از برچسب ها مطابقت نداشته باشد، قسمت deviceIntegrity خالی است.

deviceIntegrity: {
  // "MEETS_DEVICE_INTEGRITY" is one of several possible values.
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
}

به طور پیش فرض، deviceRecognitionVerdict می تواند شامل موارد زیر باشد:

MEETS_DEVICE_INTEGRITY
این برنامه روی یک دستگاه مجهز به اندروید با سرویس‌های Google Play اجرا می‌شود. دستگاه بررسی های یکپارچگی سیستم را انجام می دهد و شرایط سازگاری Android را برآورده می کند.
خالی (یک مقدار خالی)
برنامه روی دستگاهی اجرا می‌شود که نشانه‌های حمله (مانند اتصال API) یا به خطر افتادن سیستم (مانند روت شدن) دارد، یا برنامه روی یک دستگاه فیزیکی اجرا نمی‌شود (مانند شبیه‌سازی‌هایی که از یکپارچگی Google Play عبور نمی‌کنند). چک ها).

برای اطمینان از اینکه نشانه از یک دستگاه قابل اعتماد آمده است، همانطور که در قطعه کد زیر نشان داده شده است، تأیید کنید که deviceRecognitionVerdict مطابق انتظار است:

کاتلین

val deviceIntegrity =
    JSONObject(payload).getJSONObject("deviceIntegrity")
val deviceRecognitionVerdict =
    if (deviceIntegrity.has("deviceRecognitionVerdict")) {
        deviceIntegrity.getJSONArray("deviceRecognitionVerdict").toString()
    } else {
        ""
    }

if (deviceRecognitionVerdict.contains("MEETS_DEVICE_INTEGRITY")) {
    // Looks good!
}

جاوا

JSONObject deviceIntegrity =
    new JSONObject(payload).getJSONObject("deviceIntegrity");
String deviceRecognitionVerdict =
    deviceIntegrity.has("deviceRecognitionVerdict")
    ? deviceIntegrity.getJSONArray("deviceRecognitionVerdict").toString()
    : "";

if (deviceRecognitionVerdict.contains("MEETS_DEVICE_INTEGRITY")) {
    // Looks good!
}

اگر مشکلی با یکپارچگی دستگاه ملاقات دستگاه آزمایشی خود دارید، مطمئن شوید که رام کارخانه نصب شده باشد (مثلاً با ریست کردن دستگاه) و بوت لودر قفل شده باشد. همچنین می‌توانید تست‌های Play Integrity API را در Play Console خود ایجاد کنید .

برچسب های دستگاه مشروط

اگر برنامه شما در بازی‌های Google Play برای رایانه شخصی منتشر می‌شود، deviceRecognitionVerdict همچنین می‌تواند دارای برچسب زیر باشد:

MEETS_VIRTUAL_INTEGRITY
این برنامه بر روی یک شبیه ساز مبتنی بر اندروید با خدمات Google Play اجرا می شود. شبیه ساز بررسی های یکپارچگی سیستم را انجام می دهد و الزامات اصلی سازگاری اندروید را برآورده می کند.

اطلاعات دستگاه اختیاری

اگر برای دریافت برچسب‌های اضافی در حکم یکپارچگی شرکت کنید ، deviceRecognitionVerdict می‌تواند حاوی برچسب‌های اضافی زیر باشد:

MEETS_BASIC_INTEGRITY
این برنامه روی دستگاهی اجرا می‌شود که بررسی‌های اولیه یکپارچگی سیستم را انجام می‌دهد. ممکن است دستگاه الزامات سازگاری Android را نداشته باشد و ممکن است برای اجرای خدمات Google Play تأیید نشده باشد. به عنوان مثال، ممکن است دستگاه از یک نسخه ناشناخته اندروید استفاده کند، ممکن است بوت لودر آنلاک شده داشته باشد یا ممکن است توسط سازنده تایید نشده باشد.
MEETS_STRONG_INTEGRITY
این برنامه بر روی یک دستگاه مجهز به اندروید با سرویس‌های Google Play اجرا می‌شود و دارای ضمانت قوی برای یکپارچگی سیستم مانند اثبات یکپارچگی بوت مبتنی بر سخت‌افزار است. دستگاه بررسی های یکپارچگی سیستم را انجام می دهد و شرایط سازگاری Android را برآورده می کند.

اگر هر یک از معیارهای برچسب رعایت شود، یک دستگاه، چندین برچسب دستگاه را در حکم یکپارچگی دستگاه برمی گرداند.

فعالیت اخیر دستگاه

همچنین می‌توانید فعالیت‌های اخیر دستگاه را انتخاب کنید، که به شما می‌گوید چند بار برنامه‌تان در یک ساعت گذشته، یک کد یکپارچگی را در یک دستگاه خاص درخواست کرده است. می‌توانید از فعالیت‌های اخیر دستگاه برای محافظت از برنامه‌تان در برابر دستگاه‌های غیرمنتظره و بیش فعالی که می‌تواند نشانه‌ای از یک حمله فعال باشد، استفاده کنید. بر اساس اینکه انتظار دارید هر ساعت چند بار برنامه نصب شده روی یک دستگاه معمولی درخواست یک توکن یکپارچگی کند، می‌توانید تصمیم بگیرید که چقدر به هر سطح فعالیت اخیر دستگاه اعتماد کنید.

اگر دریافت recentDeviceActivity را انتخاب کنید، فیلد deviceIntegrity دو مقدار خواهد داشت:

deviceIntegrity: {
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
  recentDeviceActivity: {
    // "LEVEL_2" is one of several possible values.
    deviceActivityLevel: "LEVEL_2"
  }
}

تعاریف deviceActivityLevel بین حالت ها متفاوت است و می تواند یکی از مقادیر زیر را داشته باشد:

سطح فعالیت اخیر دستگاه درخواست کد یکپارچگی استاندارد API در این دستگاه در آخرین ساعت در هر برنامه درخواست‌های رمز یکپارچگی API کلاسیک در این دستگاه در آخرین ساعت برای هر برنامه
LEVEL_1 (پایین ترین) 10 یا کمتر 5 یا کمتر
LEVEL_2 بین 11 تا 25 بین 6 تا 10
LEVEL_3 بین 26 تا 50 بین 11 تا 15
LEVEL_4 (بالاترین) بیش از 50 بیش از 15
UNEVALUATED فعالیت اخیر دستگاه ارزیابی نشد. این ممکن است اتفاق بیفتد زیرا:
  • دستگاه به اندازه کافی قابل اعتماد نیست.
  • نسخه برنامه نصب شده شما در دستگاه برای Google Play ناشناخته است.
  • مشکلات فنی دستگاه

ویژگی های دستگاه

همچنین می‌توانید ویژگی‌های دستگاه را انتخاب کنید، که به نسخه Android SDK سیستم عامل Android در حال اجرا بر روی دستگاه می‌گوید. در آینده، ممکن است با سایر ویژگی های دستگاه گسترش یابد.

مقدار نسخه SDK، شماره نسخه Android SDK است که در Build.VERSION_CODES تعریف شده است. نسخه SDK ارزیابی نمی شود اگر یک نیاز ضروری نادیده گرفته شود. در این مورد، فیلد sdkVersion تنظیم نشده است. بنابراین، قسمت deviceAttributes خالی است. این ممکن است اتفاق بیفتد زیرا:

  • دستگاه به اندازه کافی قابل اعتماد نیست.
  • نسخه برنامه نصب شده شما در دستگاه برای Google Play ناشناخته است.
  • مشکلات فنی روی دستگاه وجود داشت.

اگر برای دریافت deviceAttributes شرکت کنید، فیلد deviceIntegrity دارای فیلد اضافی زیر خواهد بود:

deviceIntegrity: {
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
  deviceAttributes: {
    // 33 is one possible value, which represents Android 13 (Tiramisu).
    sdkVersion: 33
  }
}

در صورتی که نسخه SDK ارزیابی نشود، قسمت deviceAttributes به صورت زیر تنظیم می شود:

deviceIntegrity: {
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
  deviceAttributes: {}  // sdkVersion field is not set.
}

فیلد جزئیات حساب

قسمت accountDetails حاوی یک مقدار است، appLicensingVerdict ، که وضعیت مجوز Google Play برنامه را برای حساب کاربری که در دستگاه وارد شده است نشان می‌دهد. اگر حساب کاربری دارای مجوز Play برای برنامه باشد، به این معنی است که آن را دانلود کرده یا از Google Play خریداری کرده است.

accountDetails: {
  // This field can be LICENSED, UNLICENSED, or UNEVALUATED.
  appLicensingVerdict: "LICENSED"
}

appLicensingVerdict می تواند یکی از مقادیر زیر را داشته باشد:

LICENSED
کاربر دارای حق برنامه است. به عبارت دیگر، کاربر برنامه شما را از Google Play روی دستگاه خود نصب یا به روز کرد.
UNLICENSED
کاربر حق برنامه ندارد. این زمانی اتفاق می‌افتد که، برای مثال، کاربر برنامه شما را به صورت جانبی بارگذاری می‌کند یا آن را از Google Play خریداری نمی‌کند. برای رفع این مشکل می‌توانید گفتگوی GET_LICENSED را به کاربران نشان دهید.
UNEVALUATED

جزئیات مجوز مورد ارزیابی قرار نگرفت زیرا یک نیاز ضروری نادیده گرفته شد.

این ممکن است به دلایل مختلفی رخ دهد، از جمله موارد زیر:

  • دستگاه به اندازه کافی قابل اعتماد نیست.
  • نسخه برنامه نصب شده شما در دستگاه برای Google Play ناشناخته است.
  • کاربر وارد Google Play نشده است.

برای بررسی اینکه کاربر دارای حق برنامه برای برنامه شما است، بررسی کنید که appLicensingVerdict مطابق انتظار است، همانطور که در قطعه کد زیر نشان داده شده است:

کاتلین

val accountDetails = JSONObject(payload).getJSONObject("accountDetails")
val appLicensingVerdict = accountDetails.getString("appLicensingVerdict")

if (appLicensingVerdict == "LICENSED") {
    // Looks good!
}

جاوا

JSONObject accountDetails =
    new JSONObject(payload).getJSONObject("accountDetails");
String appLicensingVerdict = accountDetails.getString("appLicensingVerdict");

if (appLicensingVerdict.equals("LICENSED")) {
    // Looks good!
}

فیلد جزئیات محیطی

همچنین می توانید سیگنال های اضافی در مورد محیط را انتخاب کنید. خطر دسترسی به برنامه به برنامه شما می‌گوید که آیا برنامه‌های دیگری در حال اجرا هستند که می‌توان از آنها برای تصویربرداری از صفحه، نمایش پوشش‌ها یا کنترل دستگاه استفاده کرد. حکم Play Protect به شما می گوید که آیا Google Play Protect در دستگاه فعال است و آیا بدافزار شناخته شده ای پیدا کرده است یا خیر.

اگر حکم خطر دسترسی به برنامه یا حکم Play Protect را در کنسول Google Play خود انتخاب کرده‌اید، پاسخ API شما شامل قسمت environmentDetails می‌شود. فیلد environmentDetails می تواند شامل دو مقدار appAccessRiskVerdict و playProtectVerdict باشد.

حکم خطر دسترسی به برنامه

پس از فعال شدن، فیلد environmentDetails در محموله Play Integrity API حاوی حکم جدید خطر دسترسی برنامه خواهد بود.

{
  requestDetails: { ... }
  appIntegrity: { ... }
  deviceIntegrity: { ... }
  accountDetails: { ... }
  environmentDetails: {
      appAccessRiskVerdict: {
          // This field contains one or more responses, for example the following.
          appsDetected: ["KNOWN_INSTALLED", "UNKNOWN_INSTALLED", "UNKNOWN_CAPTURING"]
      }
 }
}

اگر خطر دسترسی به برنامه ارزیابی شد، appAccessRiskVerdict حاوی appsDetected فیلدی است که با یک یا چند پاسخ شناسایی شده اند. این پاسخ ها بسته به منبع نصب برنامه های شناسایی شده در یکی از دو گروه زیر قرار می گیرند:

  • برنامه های Play یا سیستم : برنامه هایی که توسط Google Play نصب شده یا توسط سازنده دستگاه از قبل در پارتیشن سیستم دستگاه بارگذاری شده اند (با FLAG_SYSTEM مشخص شده است). پاسخ‌های چنین برنامه‌هایی با پیشوند KNOWN_ هستند.

  • سایر برنامه‌ها : برنامه‌هایی که توسط Google Play نصب نشده‌اند. این شامل برنامه‌هایی نمی‌شود که توسط سازنده دستگاه از قبل روی پارتیشن سیستم بارگذاری شده‌اند. پاسخ برای چنین برنامه هایی با پیشوند UNKNOWN_ است.

پاسخ های زیر را می توان برگرداند:

KNOWN_INSTALLED ، UNKNOWN_INSTALLED
برنامه‌هایی نصب شده‌اند که با منبع نصب مربوطه مطابقت دارند.
KNOWN_CAPTURING ، UNKNOWN_CAPTURING
برنامه‌هایی در حال اجرا هستند که مجوزهایی فعال دارند و می‌توان از آنها برای مشاهده صفحه هنگام اجرای برنامه استفاده کرد. این شامل هر سرویس دسترسی تأیید شده شناخته شده برای Google Play که در دستگاه اجرا می شود، نمی شود.
KNOWN_CONTROLLING ، UNKNOWN_CONTROLLING
برنامه‌هایی در حال اجرا هستند که دارای مجوزهایی هستند که می‌توانند برای کنترل دستگاه و کنترل مستقیم ورودی‌های برنامه شما استفاده شوند و می‌توانند برای گرفتن ورودی‌ها و خروجی‌های برنامه شما استفاده شوند. این شامل هر سرویس دسترسی تأیید شده شناخته شده برای Google Play که در دستگاه اجرا می شود، نمی شود.
KNOWN_OVERLAYS ، UNKNOWN_OVERLAYS
برنامه‌هایی در حال اجرا هستند که دارای مجوزهایی هستند که می‌توانند برای نمایش هم‌پوشانی‌ها در برنامه شما استفاده شوند. این شامل هر سرویس دسترسی تأیید شده شناخته شده برای Google Play که در دستگاه اجرا می شود، نمی شود.
خالی (یک مقدار خالی)

در صورتی که یک نیاز ضروری از قلم افتاده باشد، خطر دسترسی به برنامه ارزیابی نمی شود. در این حالت فیلد appAccessRiskVerdict خالی است. این ممکن است به دلایل مختلفی رخ دهد، از جمله موارد زیر:

  • دستگاه به اندازه کافی قابل اعتماد نیست.
  • فاکتور فرم دستگاه تلفن، تبلت یا تاشو نیست.
  • دستگاه دارای Android 6 (سطح API 23) یا بالاتر نیست.
  • نسخه برنامه نصب شده شما در دستگاه برای Google Play ناشناخته است.
  • نسخه فروشگاه Google Play در دستگاه قدیمی است.
  • فقط بازی ها : حساب کاربری مجوز Play برای بازی ندارد.
  • یک درخواست استاندارد با پارامتر verdictOptOut استفاده شد.
  • یک درخواست استاندارد با نسخه کتابخانه Play Integrity API استفاده شد که هنوز از خطر دسترسی برنامه برای درخواست‌های استاندارد پشتیبانی نمی‌کند.

خطر دسترسی به برنامه به‌طور خودکار سرویس‌های دسترس‌پذیری تأییدشده را که از طریق بررسی دسترس‌پذیری پیشرفته Google Play (نصب شده توسط هر فروشگاه برنامه روی دستگاه) انجام شده است، حذف می‌کند. «مستثنی» به این معنی است که سرویس‌های دسترس‌پذیری تأییدشده که روی دستگاه اجرا می‌شوند، پاسخ عکسبرداری، کنترل یا همپوشانی را در حکم خطر دسترسی به برنامه نشان نمی‌دهند. برای درخواست بررسی دسترس‌پذیری پیشرفته Google Play برای برنامه دسترس‌پذیری خود، آن را در Google Play منتشر کنید تا مطمئن شوید که برنامه شما پرچم isAccessibilityTool را در مانیفست برنامه‌تان روی true تنظیم کرده باشد، یا درخواست بررسی کنید .

جدول زیر چند نمونه از احکام و معنای آنها را نشان می دهد (این جدول همه نتایج ممکن را فهرست نمی کند):

نمونه پاسخ حکم خطر دسترسی به برنامه تفسیر
appsDetected:
["KNOWN_INSTALLED"]
فقط برنامه‌هایی نصب شده‌اند که توسط Google Play شناسایی شده یا توسط سازنده دستگاه روی پارتیشن سیستم از قبل بارگذاری شده‌اند.
هیچ برنامه‌ای در حال اجرا نیست که منجر به احکام ضبط، کنترل یا همپوشانی شود.
appsDetected:
["KNOWN_INSTALLED",
"UNKNOWN_INSTALLED",
"UNKNOWN_CAPTURING"]
برنامه‌هایی وجود دارند که توسط Google Play نصب شده یا توسط سازنده دستگاه روی پارتیشن سیستم از قبل بارگذاری شده‌اند.
برنامه‌های دیگری در حال اجرا هستند و مجوزهایی فعال دارند که می‌توان از آنها برای مشاهده صفحه یا گرفتن ورودی‌ها و خروجی‌های دیگر استفاده کرد.
appsDetected:
["KNOWN_INSTALLED",
"KNOWN_CAPTURING",
"UNKNOWN_INSTALLED",
"UNKNOWN_CONTROLLING"]
Play یا سیستمی در حال اجرا هستند که دارای مجوزهایی فعال هستند که می توانند برای مشاهده صفحه یا گرفتن ورودی ها و خروجی های دیگر استفاده شوند.
همچنین برنامه های دیگری در حال اجرا هستند که دارای مجوزهای فعال هستند که می توانند برای کنترل دستگاه و کنترل مستقیم ورودی های برنامه شما استفاده شوند.
appAccessRiskVerdict: {} خطر دسترسی به برنامه ارزیابی نمی شود زیرا یک نیاز ضروری از قلم افتاده است. به عنوان مثال، دستگاه به اندازه کافی قابل اعتماد نبود.

بسته به سطح ریسک خود، می توانید تصمیم بگیرید که چه ترکیبی از احکام قابل قبول است و در مورد چه احکامی می خواهید اقدام کنید. قطعه کد زیر نمونه ای از تأیید این موضوع را نشان می دهد که هیچ برنامه ای در حال اجرا نیست که بتواند صفحه نمایش را بگیرد یا برنامه شما را کنترل کند:

کاتلین

val environmentDetails =
    JSONObject(payload).getJSONObject("environmentDetails")
val appAccessRiskVerdict =
    environmentDetails.getJSONObject("appAccessRiskVerdict")

if (appAccessRiskVerdict.has("appsDetected")) {
    val appsDetected = appAccessRiskVerdict.getJSONArray("appsDetected").toString()
    if (!appsDetected.contains("CAPTURING") && !appsDetected.contains("CONTROLLING")) {
        // Looks good!
    }
}

جاوا

JSONObject environmentDetails =
    new JSONObject(payload).getJSONObject("environmentDetails");
JSONObject appAccessRiskVerdict =
    environmentDetails.getJSONObject("appAccessRiskVerdict");

if (appAccessRiskVerdict.has("appsDetected")) {
    String appsDetected = appAccessRiskVerdict.getJSONArray("appsDetected").toString()
    if (!appsDetected.contains("CAPTURING") && !appsDetected.contains("CONTROLLING")) {
        // Looks good!
    }
}
احکام خطر دسترسی به برنامه را اصلاح کنید

بسته به سطح خطر خود، می‌توانید تصمیم بگیرید قبل از اینکه کاربر درخواست یا اقدامی را انجام دهد، تصمیم بگیرید که می‌خواهید در مورد چه برنامه‌هایی اقدام کنید. درخواست‌های اختیاری Google Play وجود دارد که می‌توانید پس از بررسی حکم خطر دسترسی برنامه به کاربر نشان دهید. می‌توانید CLOSE_UNKNOWN_ACCESS_RISK را نشان دهید تا از کاربر بخواهید برنامه‌های ناشناخته‌ای را که باعث خطر دسترسی به برنامه می‌شوند ببندد یا می‌توانید CLOSE_ALL_ACCESS_RISK را نشان دهید تا از کاربر بخواهید همه برنامه‌ها (معروف و ناشناخته) را که باعث حکم خطر دسترسی به برنامه می‌شوند ببندد.

حکم Play Protect

پس از فعال شدن، فیلد environmentDetails در محموله Play Integrity API حاوی حکم Play Protect خواهد بود:

environmentDetails: {
  playProtectVerdict: "NO_ISSUES"
}

playProtectVerdict می تواند یکی از مقادیر زیر را داشته باشد:

NO_ISSUES
Play Protect روشن است و هیچ مشکلی در برنامه در دستگاه پیدا نکرد.
NO_DATA
Play Protect روشن است اما هنوز هیچ اسکنی انجام نشده است. ممکن است دستگاه یا برنامه Play Store اخیراً بازنشانی شده باشد.
POSSIBLE_RISK
Play Protect خاموش است.
MEDIUM_RISK
Play Protect روشن است و برنامه‌های بالقوه مضر را روی دستگاه نصب کرده است.
HIGH_RISK
Play Protect روشن است و برنامه‌های خطرناکی را روی دستگاه نصب کرده است.
UNEVALUATED

حکم Play Protect ارزیابی نشد.

این ممکن است به دلایل مختلفی رخ دهد، از جمله موارد زیر:

  • دستگاه به اندازه کافی قابل اعتماد نیست.
  • فقط بازی ها : حساب کاربری مجوز Play برای بازی ندارد.

راهنمای استفاده از حکم Play Protect

سرور پشتیبان برنامه شما می تواند تصمیم بگیرد که بر اساس حکم بر اساس میزان تحمل ریسک شما چگونه عمل کند. در اینجا چند پیشنهاد و اقدامات بالقوه کاربر آورده شده است:

NO_ISSUES
Play Protect روشن است و هیچ مشکلی پیدا نکرده است، بنابراین نیازی به اقدام کاربر نیست.
POSSIBLE_RISK و NO_DATA
هنگام دریافت این احکام، از کاربر بخواهید بررسی کند که Play Protect روشن است و اسکن انجام داده است. NO_DATA باید فقط در شرایط نادر ظاهر شود.
MEDIUM_RISK و HIGH_RISK
بسته به میزان تحمل ریسک، می‌توانید از کاربر بخواهید که Play Protect را راه‌اندازی کند و نسبت به هشدارهای Play Protect اقدام کند. اگر کاربر نمی تواند این الزامات را برآورده کند، می توانید آنها را از عملکرد سرور مسدود کنید.