واجهة برمجة التطبيقات SafetyNetVerify Apps API

إنّ SafetyNet Verification Apps API عبارة عن مكتبة تدعمها خدمات Google Play تتيح لتطبيقك التفاعل آليًا مع ميزة التحقّق من التطبيقات على الجهاز، ما يحمي الجهاز من التطبيقات التي يُحتمَل أن تكون ضارة.

إذا كان تطبيقك يتعامل مع بيانات المستخدمين الحساسة، مثل المعلومات المالية، من المهم التأكّد من أنّ جهاز المستخدم محمي من التطبيقات الضارة وأنّه لا يتضمّن أي تطبيقات يمكنها انتحال هوية تطبيقك أو تنفيذ إجراءات ضارة أخرى. إذا كان أمان الجهاز لا يفي بالحد الأدنى من الوضع الأمني، يمكنك إيقاف الوظائف داخل تطبيقك لتقليل الخطر على المستخدم.

تراقب Google سلوك تطبيقات Android وتحلّلها كجزء من التزامها المستمر بالحفاظ على أمان منظومة Android المتكاملة قدر الإمكان. وإذا رصدت ميزة "التحقق من التطبيقات" تطبيقًا يُحتمل أن يكون خطيرًا، يتم إبلاغ جميع المستخدمين الذين ثبَّتوا التطبيق وتشجيعهم على إلغاء تثبيت التطبيق على الفور. تحمي هذه العملية أمان هؤلاء المستخدمين وخصوصيتهم.

تتيح لك واجهة برمجة التطبيقات SafetyNet Verification Apps API الاستفادة من هذه الميزة لحماية بيانات تطبيقك. وباستخدام واجهة برمجة التطبيقات هذه، يمكنك تحديد ما إذا كان جهاز المستخدم محميًا بميزة "التحقق من التطبيقات"، وتشجيع المستخدمين الذين لا يستخدمون الميزة على تفعيل ميزة الحماية، وتحديد أي تطبيقات معروفة قد تكون ضارة وتم تثبيتها على الجهاز.

تحذير: على الرغم من أن SafetyNet تنبه المستخدمين بشأن التطبيقات التي قد تكون ضارة، إلا أن بعض المستخدمين قد لا يظهر لهم إشعار التحذير، وقد يختار البعض عدم إلغاء تثبيت التطبيقات التي قد تكون ضارة. ولذلك، قد يحتوي الجهاز على تطبيقات يحتمل أن تكون ضارة، حتى في حال تفعيل ميزة "التحقق من التطبيقات".

بنود الخدمة الإضافية

بالوصول إلى واجهات برمجة تطبيقات SafetyNet أو استخدامها، أنت توافق على بنود خدمة Google APIs وعلى بنود خدمة واجهة برمجة التطبيقات التالية لميزة "التحقّق من التطبيقات". يُرجى قراءة وفهم كل البنود والسياسات السارية قبل الوصول إلى واجهات برمجة التطبيقات.

بنود خدمة واجهة برمجة التطبيقات الخاصة بـ "إثبات ملكية التطبيقات"

وقد تؤدي تحليلات التطبيقات التي تحدد التطبيقات الضارة المحتملة إلى نتائج إيجابية خاطئة ونتائج سلبية خاطئة. يتم تقديم النتائج (أو النقص فيها) التي تم إرجاعها من مجموعة واجهات برمجة التطبيقات هذه على أفضل تقدير. أنت تقرّ وتفهم أنّ النتائج التي تعرضها حزمة SafetyNet API هذه ليست مضمونة في جميع الأوقات.

إضافة واجهة برمجة تطبيقات SafetyNet API

قبل استخدام التحقق من التطبيقات، أضف واجهة برمجة التطبيقات SafetyNet إلى مشروعك. إذا كنت تستخدم "استوديو Android"، أضِف هذه التبعية إلى ملف Gradle على مستوى التطبيق. لمزيد من المعلومات، يُرجى الاطّلاع على إعداد واجهة برمجة تطبيقات SafetyNet.

تفعيل ميزة إثبات ملكية التطبيقات

توفر واجهة برمجة التطبيقات SafetyNet Verification App API طريقتين لتفعيل ميزة "التحقّق من التطبيقات". يمكنك تحديد ما إذا كان قد تم تفعيل عملية إثبات ملكية التطبيقات من خلال isVerifyAppsEnabled()، ويمكنك طلب تفعيل هذه الميزة باستخدام enableVerifyApps().

يكمن الفرق بين هاتين الطريقتين في أنه بينما يطلب isVerifyAppsEnabled() الحالة الحالية لميزة "التحقق من التطبيقات"، يطلب "enableVerifyApps()" صراحةً من المستخدم الموافقة على استخدام الميزة. إذا كنت تريد أن يعرف تطبيقك فقط حالة الميزة لاتخاذ قرار مبني على الأمان، يجب أن يتصل تطبيقك بـ isVerifyAppsEnabled(). ومع ذلك، إذا كنت تريد التأكّد من أنّ تطبيقك يمكنه إدراج التطبيقات المثبّتة التي يُحتمل أن تكون ضارة، عليك الاتصال بـ enableVerifyApps() بدلاً من ذلك.

تحديد ما إذا كانت ميزة التحقُّق من التطبيقات مفعَّلة

تتيح طريقة isVerifyAppsEnabled() غير المتزامنة لتطبيقك تحديد ما إذا كان المستخدم مسجلاً في ميزة "التحقق من التطبيقات" أم لا. تعرِض هذه الطريقة عنصر VerifyAppsUserResponse، الذي يحتوي على معلومات عن جميع الإجراءات التي اتّخذها المستخدم بشأن ميزة "التحقّق من التطبيقات"، بما في ذلك تفعيلها.

يوضّح مقتطف الرمز التالي كيفية إنشاء معاودة الاتصال المرتبطة بهذه الطريقة:

لغة Kotlin

SafetyNet.getClient(this)
        .isVerifyAppsEnabled
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                if (task.result.isVerifyAppsEnabled) {
                    Log.d("MY_APP_TAG", "The Verify Apps feature is enabled.")
                } else {
                    Log.d("MY_APP_TAG", "The Verify Apps feature is disabled.")
                }
            } else {
                Log.e("MY_APP_TAG", "A general error occurred.")
            }
        }

جافا

SafetyNet.getClient(this)
    .isVerifyAppsEnabled()
    .addOnCompleteListener(new OnCompleteListener<VerifyAppsUserResponse>() {
        @Override
        public void onComplete(Task<VerifyAppsUserResponse> task) {
            if (task.isSuccessful()) {
                VerifyAppsUserResponse result = task.getResult();
                if (result.isVerifyAppsEnabled()) {
                    Log.d("MY_APP_TAG", "The Verify Apps feature is enabled.");
                } else {
                    Log.d("MY_APP_TAG", "The Verify Apps feature is disabled.");
                }
            } else {
                Log.e("MY_APP_TAG", "A general error occurred.");
            }
        }
    });

طلب تفعيل التحقق من التطبيقات

تتيح طريقة enableVerifyApps() غير المتزامنة لتطبيقك استدعاء مربّع حوار يطلب من المستخدم تفعيل ميزة "إثبات ملكية التطبيقات". تعرض هذه الطريقة عنصر VerifyAppsUserResponse الذي يحتوي على معلومات بشأن جميع الإجراءات التي اتخذها المستخدم بشأن ميزة "التحقق من التطبيقات"، بما في ذلك ما إذا كان قد وافق على تفعيل هذه الميزة.

يوضّح مقتطف الرمز التالي كيفية إنشاء معاودة الاتصال المرتبطة بهذه الطريقة:

لغة Kotlin

SafetyNet.getClient(this)
        .enableVerifyApps()
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                if (task.result.isVerifyAppsEnabled) {
                    Log.d("MY_APP_TAG", "The user gave consent to enable the Verify Apps feature.")
                } else {
                    Log.d(
                            "MY_APP_TAG",
                            "The user didn't give consent to enable the Verify Apps feature."
                    )
                }
            } else {
                Log.e("MY_APP_TAG", "A general error occurred.")
            }
        }

جافا

SafetyNet.getClient(this)
    .enableVerifyApps()
    .addOnCompleteListener(new OnCompleteListener<VerifyAppsUserResponse>() {
        @Override
        public void onComplete(Task<VerifyAppsUserResponse> task) {
            if (task.isSuccessful()) {
                VerifyAppsUserResponse result = task.getResult();
                if (result.isVerifyAppsEnabled()) {
                    Log.d("MY_APP_TAG", "The user gave consent " +
                          "to enable the Verify Apps feature.");
                } else {
                    Log.d("MY_APP_TAG", "The user didn't give consent " +
                          "to enable the Verify Apps feature.");
                }
            } else {
                Log.e("MY_APP_TAG", "A general error occurred.");
            }
        }
    });

قد يواجه تطبيقك حالةً غير عادية واحدة أو أكثر عند استخدام هذه الطريقة:

  • إذا تم تفعيل ميزة "التحقق من التطبيقات" من قبل، لن يظهر مربع الحوار، وستتصرف واجهة برمجة التطبيقات كما لو كان المستخدم قد وافق على تفعيل هذه الميزة.
  • إذا انتقل المستخدم بعيدًا عن مربّع الحوار، سيتم إتلافه، وتفترض واجهة برمجة التطبيقات أنّ المستخدم لم يوافق على تفعيل هذه الميزة.
  • إذا استدعى تطبيقك وتطبيق آخر هذه الطريقة في الوقت نفسه، سيظهر مربّع حوار واحد فقط، وتتلقّى جميع التطبيقات قيم إرجاع متطابقة من الطريقة.

عرض التطبيقات المثبّتة التي قد تتسبّب بضرر

تتيح لك طريقة listHarmfulApps() غير المتزامنة الحصول على قائمة بأي تطبيقات معروفة قد تكون ضارة ثبّتها المستخدم على جهازه. تتضمن هذه القائمة فئات للتطبيقات التي تم تحديدها والتي قد تكون ضارة حتى يتمكن تطبيقك من اتخاذ الإجراء المناسب.

يوضّح مقتطف الرمز التالي كيفية إنشاء معاودة الاتصال المرتبطة بهذه الطريقة:

لغة Kotlin

SafetyNet.getClient(this)
        .listHarmfulApps()
        .addOnCompleteListener { task ->
            Log.d(TAG, "Received listHarmfulApps() result")

            if (task.isSuccessful) {
                val result = task.result
                val scanTimeMs = result.lastScanTimeMs

                val appList = result.harmfulAppsList
                if (appList?.isNotEmpty() == true) {
                    Log.e("MY_APP_TAG", "Potentially harmful apps are installed!")

                    for (harmfulApp in appList) {
                        Log.e("MY_APP_TAG", "Information about a harmful app:")
                        Log.e("MY_APP_TAG", "  APK: ${harmfulApp.apkPackageName}")
                        Log.e("MY_APP_TAG", "  SHA-256: ${harmfulApp.apkSha256}")

                        // Categories are defined in VerifyAppsConstants.
                        Log.e("MY_APP_TAG", "  Category: ${harmfulApp.apkCategory}")
                    }
                } else {
                    Log.d("MY_APP_TAG", "There are no known potentially harmful apps installed.")
                }
            } else {
                Log.d(
                        "MY_APP_TAG",
                        "An error occurred. Call isVerifyAppsEnabled() to ensure that the user "
                                + "has consented."
                )
            }
        }

جافا

SafetyNet.getClient(this)
    .listHarmfulApps()
    .addOnCompleteListener(new OnCompleteListener<HarmfulAppsResponse>() {
        @Override
        public void onComplete(Task<HarmfulAppsResponse> task) {
            Log.d(TAG, "Received listHarmfulApps() result");

            if (task.isSuccessful()) {
                HarmfulAppsResponse result = task.getResult();
                long scanTimeMs = result.getLastScanTimeMs();

                List<HarmfulAppsData> appList = result.getHarmfulAppsList();
                if (appList.isEmpty()) {
                    Log.d("MY_APP_TAG", "There are no known " +
                          "potentially harmful apps installed.");
                } else {
                    Log.e("MY_APP_TAG",
                          "Potentially harmful apps are installed!");

                    for (HarmfulAppsData harmfulApp : appList) {
                        Log.e("MY_APP_TAG", "Information about a harmful app:");
                        Log.e("MY_APP_TAG",
                              "  APK: " + harmfulApp.apkPackageName);
                        Log.e("MY_APP_TAG",
                              "  SHA-256: " + harmfulApp.apkSha256);

                        // Categories are defined in VerifyAppsConstants.
                        Log.e("MY_APP_TAG",
                              "  Category: " + harmfulApp.apkCategory);
                    }
                }
            } else {
                Log.d("MY_APP_TAG", "An error occurred. " +
                      "Call isVerifyAppsEnabled() to ensure " +
                      "that the user has consented.");
            }
        }
    });