رسیدگی به خطاهای «درستی‌سنجی شماره تلفن Firebase» در Android

وقتی تماس با کتابخانه Firebase PNV ناموفق باشد، کتابخانه FirebasePhoneNumberVerificationException را گزارش می‌کند. این صفحه همه کدهای خطایی را که استثنا می‌تواند داشته باشد، زمان وقوع هرکدام، و کاری را که برنامه شما باید درقبال آن انجام دهد فهرست می‌کند.

این صفحه فرض می‌کند که شما Firebase PNV را همان‌طور که در شروع به کار با Firebase Phone Number Verification در Android شرح داده شده است ادغام کرده‌اید.

نحوه گزارش شدن خطاها

  • روش‌های ناهمگام (getVerificationSupportInfo()، getVerifiedPhoneNumber()، و روش‌های جریان سفارشی) Task را برمی‌گردانند. وقتی این بررسی‌ها ناموفق باشد، Task با FirebasePhoneNumberVerificationException ناموفق می‌شود که آن را در addOnFailureListener دریافت می‌کنید.

  • enableTestSession() همگام است. مستقیماً FirebasePhoneNumberVerificationException پرتاب می‌کند.

برای اینکه متوجه شوید مشکل چیست، errorCode استثنا را بخوانید. کدهای Firebase PNV ثابت‌هایی در کلاس FirebasePnvStatusCodes هستند. اگر خطا از «خدمات Google Play» باشد، errorCode می‌تواند مقدار CommonStatusCodes نیز باشد، مثل NETWORK_ERROR.

دستگاه یا سیم‌کارت پشتیبانی‌نشده خطا محسوب نمی‌شود. getVerificationSupportInfo() موفق می‌شود و isSupported() را به‌عنوان false برای آن سیم‌کارت گزارش می‌کند، و getReason() دلیل آن را به شما می‌گوید. دستگاه‌ها و سیم‌کارت‌های پشتیبانی‌نشده را ببینید.

کدهای خطا

راه‌اندازی جلسه آزمایشی

این خطاها به‌صورت هم‌زمان توسط enableTestSession() ایجاد می‌شوند.

کد خطا آرمان اقدام توصیه‌شده
TEST_SESSION_ALREADY_ENABLED
(55508)
enableTestSession() بیش‌از یک‌بار در یک فرایند برنامه فراخوانده شده است. FirebasePhoneNumberVerification.getInstance() هربار همان نمونه را برمی‌گرداند، بنابراین این اتفاق زمانی هم می‌افتد که Activity که آن را فراخوانی می‌کند دوباره ایجاد شود. enableTestSession() را یک‌بار در هر فرایند فراخوانی کنید، برای مثال در Application.onCreate(). راه‌اندازی کتابخانه در حالت آزمایشی را ببینید.
INVALID_TEST_NUMBER_ID
(55507)
کد آزمایشی ارسال‌شده به enableTestSession() خالی است. مطمئن شوید ساخت شما توکنی را که در کنسول Firebase تولید کرده‌اید ارسال می‌کند و فقط زمانی enableTestSession() را فراخوانی کنید که توکن خالی نباشد.

درستی‌سنجی

این خطاها باعث رد شدن Task برگردانده‌شده توسط getVerifiedPhoneNumber() می‌شود.

کد خطا آرمان اقدام توصیه‌شده
CREDENTIAL_MANAGER_ERROR
(55506)
«مدیر اطلاعات کاربری Android» شماره تلفن را برنگرداند. اگر cause استثنا GetCredentialCancellationException باشد، احتمالاً کاربر صفحه کسب رضایت را بسته است. روش دیگری برای به‌تأیید رساندن شماره تلفن ارائه دهید، مثلاً پیامک. به‌طور خودکار دوباره امتحان نکنید، زیرا کاربر دوباره صفحه رضایت را خواهد دید.
CARRIER_NOT_SUPPORTED
(55501)
شرکت مخابراتی سیم‌کارت انتخاب‌شده پشتیبانی نمی‌شود، یا دستگاه اطلاعات اشتراک لازم برای درستی‌سنجی آن را ندارد. به روش درستی‌سنجی دیگری، مثل پیامک، برگردید.
UNSUPPORTED_OPERATION
(55505)
Firebase PNV برای این درخواست در دستگاه دردسترس نیست. به روش درستی‌سنجی دیگری، مثل پیامک، برگردید.
PREFLIGHT_CHECK_FAILED
(55504)
بخش پشتیبان Firebase PNV نتوانست درخواست درستی‌سنجی را قبل‌از نمایش صفحه رضایت ایجاد کند. به روش درستی‌سنجی دیگری، مثل پیامک، برگردید. اگر این اتفاق برای همه درخواست‌ها می‌افتد، بررسی کنید که برنامه‌تان به‌درستی راه‌اندازی شده باشد (به ارتقا به حالت تولید مراجعه کنید).
INTEGRITY_CHECK_FAILED
(55503)
دستگاه یا برنامه در بررسی تمامیت رد شد. به روش درستی‌سنجی دیگری، مثل پیامک، برگردید.
INVALID_DIGITAL_CREDENTIAL_RESPONSE
(55502)
پاسخ «مدیر اطلاعات کاربری» خوانده نشد یا با شماره تلفن درستی‌سنجی‌شده مبادله نشد. به روش درستی‌سنجی دیگری، مثل پیامک، برگردید.
INVALID_TEST_NUMBER_ID
(55507)
در حالت آزمایشی، باطن Firebase PNV کد آزمایشی را رد کرد، برای مثال چون منقضی شده بود. ژتون‌های آزمایشی ۷ روز TTL دارند. یک کد تأیید آزمایشی ردشده معمولاً این کد را گزارش می‌کند؛ اگر خطاهای دیگری در حالت آزمایشی مشاهده کردید، همچنین بررسی کنید که کد تأیید شما به‌روز باشد. در کنسول Firebase، یک کد آزمایشی جدید ایجاد کنید و برنامه‌تان را دوباره بسازید.
ACTIVITY_CONTEXT_REQUIRED
(55509)
‫Context ارسال‌شده به getVerifiedPhoneNumber() Activity نیست. این روش برای نشان دادن صفحه رضایت به Activity نیاز دارد. Activity فعلی را رد کنید. این یک اشکال در برنامه شما است، نه شرایطی که باید در زمان اجرا مدیریت شود.

بررسی پشتیبانی

Task برگردانده‌شده توسط getVerificationSupportInfo() فقط درصورتی ناموفق است که خود بررسی نتواند اجرا شود. در این حالت، errorCode یا مقدار «خدمات Google Play» است CommonStatusCodes یا CARRIER_NOT_SUPPORTED. دستگاه را به‌عنوان دستگاه پشتیبانی‌نشده درنظر بگیرید و به روش درستی‌سنجی دیگری، مثل پیامک، برگردید.

وقتی جلسه آزمایشی فعال است، getVerificationSupportInfo() با بخش پشتی Firebase PNV تماس نمی‌گیرد و همیشه سیم‌کارت آزمایشی را به‌عنوان پشتیبانی‌شده گزارش می‌کند، حتی اگر ژتون آزمایشی منقضی شده باشد.

جریان سفارشی

اگر به‌جای getVerifiedPhoneNumber() از جریان سفارشی استفاده می‌کنید:

  • getDigitalCredentialPayload() با PREFLIGHT_CHECK_FAILED ناموفق می‌شود، یا با INVALID_TEST_NUMBER_ID اگر باطن کد آزمایشی شما را رد کند.
  • exchangeCredentialResponseForPhoneNumber() با INVALID_DIGITAL_CREDENTIAL_RESPONSE یا با INVALID_TEST_NUMBER_ID ناموفق می‌شود اگر بخش باطنی کد آزمایشی شما را رد کند.
  • فراخوانی شما به Credential Manager یک GetCredentialException را برمی‌گرداند که شما مستقیماً آن را مدیریت می‌کنید.

دستگاه‌ها و سیم‌کارت‌های پشتیبانی‌نشده

وقتی isSupported() برای سیم‌کارت false باشد، getReason() یکی از مقادیر زیر VerificationSupportStatus را برمی‌گرداند:

مقدار معنی
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED شرکت مخابراتی سیم‌کارت پشتیبانی نمی‌شود. شرکت‌های مخابراتی پشتیبانی‌شده را ببینید.
INCAPABLE_DUE_TO_ANDROID_VERSION دستگاه از نسخه‌ای از Android قدیمی‌تر از Android 9 (سطح میانای برنامه‌سازی کاربردی ۲۸) استفاده می‌کند.
INCAPABLE_DUE_TO_SIM_STATE سیم‌کارت آماده نیست. سیم‌کارتی که قفل است یا هنوز درحال بار شدن است نیز می‌تواند INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED را گزارش کند، زیرا ابتدا اپراتور بررسی می‌شود.

در هر مورد، از روش درستی‌سنجی دیگری، مثل پیامک، برای آن سیم‌کارت استفاده کنید.

مثال

مثال زیر خطاهایی را که یک برنامه معمولی باید هنگام فراخوانی getVerifiedPhoneNumber() تشخیص دهد، مدیریت می‌کند:

Kotlin

import android.util.Log
// Credential Manager is included with the Firebase PNV library.
import androidx.credentials.exceptions.GetCredentialCancellationException
import com.google.firebase.pnv.FirebasePhoneNumberVerification
import com.google.firebase.pnv.FirebasePhoneNumberVerificationException
import com.google.firebase.pnv.FirebasePnvStatusCodes

private const val TAG = "PhoneVerification"

// In your Activity:
private fun verifyPhoneNumber() {
    FirebasePhoneNumberVerification.getInstance()
        .getVerifiedPhoneNumber(this)
        .addOnSuccessListener { result ->
            // Send result.getToken() to your backend.
        }
        .addOnFailureListener { e -> handleFpnvError(e) }
}

private fun handleFpnvError(e: Exception) {
    if (e !is FirebasePhoneNumberVerificationException) {
        Log.w(TAG, "Firebase PNV failed", e)
        showSmsVerification()
        return
    }
    when (e.errorCode) {
        FirebasePnvStatusCodes.CREDENTIAL_MANAGER_ERROR -> {
            if (e.cause is GetCredentialCancellationException) {
                // The user dismissed the consent screen.
            }
            showSmsVerification()
        }
        FirebasePnvStatusCodes.INVALID_TEST_NUMBER_ID -> {
            // Test mode only: generate a new test token.
            Log.e(TAG, "Firebase PNV test token rejected", e)
        }
        FirebasePnvStatusCodes.ACTIVITY_CONTEXT_REQUIRED -> {
            // App bug: pass an Activity to getVerifiedPhoneNumber().
            Log.e(TAG, "Firebase PNV needs an Activity context", e)
        }
        else -> {
            // Carrier not supported, network errors, and other failures.
            Log.w(TAG, "Firebase PNV failed with error code ${e.errorCode}", e)
            showSmsVerification()
        }
    }
}

در این مثال، showSmsVerification() جریان درستی‌سنجی شماره تلفن موجود در برنامه‌تان است.

مراحل بعدی