عند تعذُّر إجراء مكالمة إلى مكتبة 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.
لا يُعدّ الجهاز أو شريحة SIM غير المتوافقَين خطأً. getVerificationSupportInfo()
بنجاح، ويتم الإبلاغ عن isSupported() على أنّه false لشريحة SIM هذه، ويخبرك getReason()
بالسبب. يُرجى الاطّلاع على الأجهزة وشرائح SIM غير المتوافقة.
رموز الخطأ
إعداد جلسة الاختبار
يتم عرض هذه الأخطاء بشكل متزامن من خلال 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 Credential Manager رقم الهاتف. إذا كان
cause الاستثناء هو
GetCredentialCancellationException، من المرجّح أنّ المستخدم
رفض شاشة طلب الموافقة. |
توفير طريقة أخرى لتأكيد رقم الهاتف، مثل الرسائل القصيرة لا تُعِد المحاولة تلقائيًا، لأنّ المستخدم سيظهر له شاشة طلب الموافقة مرة أخرى. |
CARRIER_NOT_SUPPORTED(55501) |
مشغّل شبكة الجوّال لشريحة SIM المحدّدة غير متوافق، أو لا يتوفّر في الجهاز معلومات الاشتراك اللازمة لإثبات ملكيتها. | استخدِم طريقة أخرى لإثبات الهوية، مثل الرسائل القصيرة. |
UNSUPPORTED_OPERATION(55505) |
لا يتوفّر تطبيق Firebase PNV لتنفيذ هذا الطلب على الجهاز. | استخدِم طريقة أخرى لإثبات الهوية، مثل الرسائل القصيرة. |
PREFLIGHT_CHECK_FAILED(55504) |
تعذّر على الخلفية في Firebase PNV إنشاء طلب التحقّق قبل عرض شاشة طلب الموافقة. | استخدِم طريقة أخرى لإثبات الهوية، مثل الرسائل القصيرة. إذا حدث ذلك لكل طلب، تأكَّد من إعداد تطبيقك بشكل صحيح (راجِع الترقية إلى وضع الإنتاج). |
INTEGRITY_CHECK_FAILED(55503) |
لم يجتَز الجهاز أو التطبيق فحص السلامة. | استخدِم طريقة أخرى لإثبات الهوية، مثل الرسائل القصيرة. |
INVALID_DIGITAL_CREDENTIAL_RESPONSE(55502) |
تعذّرت قراءة الردّ من Credential Manager أو تعذّر استبداله برقم هاتف تم تأكيده. | استخدِم طريقة أخرى لإثبات الهوية، مثل الرسائل القصيرة. |
INVALID_TEST_NUMBER_ID(55507) |
في وضع الاختبار، رفضت الخلفية Firebase PNV الرمز المميّز التجريبي، على سبيل المثال بسبب انتهاء صلاحيته. تبلغ مدة صلاحية الرموز المميّزة الاختبارية 7 أيام. عادةً ما يظهر هذا الرمز عند رفض رمز مميّز اختباري. إذا ظهرت لك أخطاء أخرى في وضع الاختبار، تحقَّق أيضًا من أنّ الرمز المميّز حديث. | أنشئ رمزًا مميزًا جديدًا للاختبار في وحدة تحكّم Firebase وأعِد إنشاء تطبيقك. |
ACTIVITY_CONTEXT_REQUIRED(55509) |
Context الذي تم تمريره إلى getVerifiedPhoneNumber()
ليس Activity. تتطلّب الطريقة Activity لعرض شاشة طلب الموافقة. |
تخطّي Activity الحالي هذا خطأ في تطبيقك، وليس
حالة يجب التعامل معها في وقت التشغيل. |
التحقّق من الدعم
لا يتعذّر تنفيذ Task الذي تعرضه getVerificationSupportInfo() إلا إذا تعذّر إجراء عملية التحقّق نفسها. في هذه الحالة، تكون قيمة errorCode إما قيمة CommonStatusCodes في "خدمات Google Play" أو CARRIER_NOT_SUPPORTED. يجب التعامل مع الجهاز على أنّه غير متوافق والرجوع إلى طريقة التحقق (من البطاقة) أخرى، مثل الرسائل القصيرة SMS.
عند تفعيل جلسة اختبار، لا يتواصل تطبيق "getVerificationSupportInfo()" مع الخلفية في "Firebase PNV"، ويُبلغ دائمًا بأنّ شريحة SIM التجريبية متوافقة، حتى إذا انتهت صلاحية الرمز المميّز التجريبي.
مسار مخصّص
إذا كنت تستخدم التدفق المخصّص بدلاً من
getVerifiedPhoneNumber():
- يتعذّر تنفيذ
getDigitalCredentialPayload()مع ظهور الخطأPREFLIGHT_CHECK_FAILEDأوINVALID_TEST_NUMBER_IDإذا رفضت الخلفية الرمز المميّز التجريبي. - يؤدي استخدام
exchangeCredentialResponseForPhoneNumber()إلى ظهور الخطأINVALID_DIGITAL_CREDENTIAL_RESPONSEأوINVALID_TEST_NUMBER_IDإذا رفضت الخلفية الرمز المميّز التجريبي. - يؤدي طلبك إلى Credential Manager إلى ظهور الخطأ
GetCredentialException، والذي يمكنك معالجته مباشرةً.
الأجهزة وشرائح SIM غير المتوافقة
عندما تكون قيمة isSupported() هي false لشريحة SIM، تعرض السمة getReason() إحدى قيم
VerificationSupportStatus
التالية:
| القيمة | الهدف وراء طلب البحث |
|---|---|
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED |
مشغّل شبكة الجوّال لشريحة SIM غير متوافق. يُرجى الاطّلاع على مشغّلو شبكة الجوّال المعتمدون. |
INCAPABLE_DUE_TO_ANDROID_VERSION |
يعمل الجهاز بإصدار Android أقدم من Android 9 (المستوى 28 لواجهة برمجة التطبيقات). |
INCAPABLE_DUE_TO_SIM_STATE |
شريحة SIM غير جاهزة. يمكن أن تظهر الحالة INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED أيضًا في حال كانت شريحة SIM مقفلة أو لا تزال قيد التحميل، لأنّه يتم التحقّق من مشغّل شبكة الجوّال أولاً. |
في كلتا الحالتَين، استخدِم طريقة التحقق (من البطاقة) أخرى، مثل رسالة SMS، لشريحة SIM هذه.
مثال
يتعامل المثال التالي مع الأخطاء التي يحتاج تطبيق عادي إلى تمييزها عند طلب 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() عملية تأكيد رقم الهاتف الحالية في تطبيقك.
الخطوات التالية
- للحصول على تفاصيل حول كل فئة وثابت، يُرجى الاطّلاع على مرجع واجهة برمجة التطبيقات Firebase PNV.
- للتحقّق من الرمز المميّز على خادمك، يُرجى الاطّلاع على مقالة التحقّق من رموز Firebase PNV المميّزة.