بعد إيقاف Google Sign-In API نهائيًا، سنزيل الإصدار v1 من حزمة تطوير البرامج (SDK) الخاصة بـ "خدمات ألعاب Play". في عام 2026. بعد فبراير 2025، لن يكون بإمكانك نشر الألعاب التي تتكامل مع الإصدار v2 من حزمة SDK الخاصة بـ "خدمات ألعاب Play". ننصحك باستخدام الإصدار v2 حزمة SDK الخاصة بـ "خدمات ألعاب Play". بدلاً من ذلك.
مع أنّ التطبيقات الحالية التي تتكامل مع الإصدار v1 من حزمة SDK الخاصة بـ "خدمات ألعاب Play" ستستمر في العمل لعدّة سنوات، ننصحك
بالانتقال إلى الإصدار v2
بدءًا من يونيو 2025.
هذا الدليل مخصّص لاستخدام الإصدار v1 من حزمة SDK الخاصة بـ "خدمات ألعاب Play". للحصول على معلومات حول أحدث إصدار من حزمة SDK، يمكنك الاطّلاع على مستندات الإصدار 2.
للوصول إلى وظائف "خدمات ألعاب Google Play"، يجب أن توفّر لعبتك حساب اللاعب الذي سجّل الدخول. إذا لم يتم إثبات هوية اللاعب، قد تحدث أخطاء في لعبتك عند إجراء طلبات إلى واجهات برمجة التطبيقات في "خدمات ألعاب Google Play". توضّح هذه المستندات كيفية توفير تجربة تسجيل دخول سلسة في لعبتك.
تنفيذ عملية تسجيل الدخول إلى المشغّل
فئة GoogleSignInClient هي نقطة الدخول الرئيسية لاسترداد حساب اللاعب الذي سجّل الدخول حاليًا، ولتسجيل دخول اللاعب إذا لم يسبق له إجراء ذلك على تطبيقك على الجهاز.
لإنشاء برنامج تسجيل دخول، اتّبِع الخطوات التالية:
أنشئ عميل تسجيل دخول من خلال العنصر
GoogleSignInOptionsكما هو موضّح في مقتطف الرمز البرمجي التالي. فيGoogleSignInOptions.Builderلضبط إعدادات تسجيل الدخول، عليك تحديدGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN.GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
إذا كنت تريد استخدام
SnapshotsClient، أضِف.requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)إلىGoogleSignInOptions.Builderكما هو موضّح في مقتطف الرمز التالي:GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) .build();استدعِ طريقة
GoogleSignIn.getClient()وأدخِل الخيارات التي ضبطتها في الخطوات السابقة. إذا كان الطلب ناجحًا، تعرض واجهة برمجة التطبيقات "تسجيل الدخول باستخدام Google" مثيلاً منGoogleSignInClient.
التحقّق مما إذا كان اللاعب قد سجّل الدخول
يمكنك التحقّق مما إذا كان هناك حساب مسجّل الدخول حاليًا على الجهاز الحالي باستخدام GoogleSignIn.getLastSignedInAccount()،
وما إذا كان هذا الحساب يملك الأذونات المطلوبة باستخدام GoogleSignIn.hasPermissions().
إذا كان الشرطان صحيحَين، أي أنّ getLastSignedInAccount() تعرض قيمة غير فارغة وأنّ hasPermissions() تعرض true، يمكنك استخدام الحساب الذي تعرضه getLastSignedInAccount() بأمان، حتى إذا كان الجهاز غير متصل بالإنترنت.
تنفيذ عملية تسجيل دخول غير مرئية
يمكنك الاتصال بالرقم silentSignIn() لاسترداد حساب اللاعب الذي سجّل الدخول حاليًا،
ومحاولة تسجيل دخول اللاعبين بدون عرض واجهة مستخدم إذا سجّلوا الدخول بنجاح إلى تطبيقك على جهاز آخر.
تعرض الطريقة silentSignIn() القيمة Task<GoogleSignInAccount>. عند اكتمال المهمة، عليك ضبط الحقل GoogleSignInAccount الذي سبق أن حدّدته على حساب تسجيل الدخول الذي تعرضه المهمة كنتيجة، أو على null، ما يشير إلى عدم توفّر مستخدم مسجّل الدخول.
في حال تعذُّر تسجيل الدخول بدون تفاعل، يمكنك اختياريًا إرسال هدف تسجيل الدخول لعرض واجهة مستخدم لتسجيل الدخول، كما هو موضّح في تنفيذ عملية تسجيل دخول تفاعلية.
بما أنّ حالة اللاعب الذي سجّل الدخول يمكن أن تتغيّر عندما لا يكون النشاط في المقدّمة، ننصحك باستدعاء silentSignIn() من طريقة onResume() الخاصة بالنشاط.
لتنفيذ عملية تسجيل الدخول بدون أي إجراء من المستخدم، اتّبِع الخطوات التالية:
- استدعِ طريقة
silentSignIn()فيGoogleSignInClientلبدء عملية تسجيل الدخول بدون تفاعل. تعرض هذه المكالمة عنصرTask<GoogleSignInAccount>يحتوي علىGoogleSignInAccountإذا تم تسجيل الدخول بدون تفاعل بنجاح. - تعامَل مع نجاح عملية تسجيل دخول اللاعب أو تعذُّرها من خلال إلغاء
OnCompleteListener.- إذا نجحت مهمة تسجيل الدخول، احصل على عنصر
GoogleSignInAccountمن خلال استدعاءgetResult(). - إذا لم تنجح عملية تسجيل الدخول، يمكنك إرسال هدف تسجيل الدخول لبدء عملية تفاعلية لتسجيل الدخول.
للحصول على قائمة بمستمعي عمليات معاودة الاتصال الإضافية التي يمكنك استخدامها، راجِع دليل المطوّر لواجهة Tasks API ومرجع
TaskAPI.
- إذا نجحت مهمة تسجيل الدخول، احصل على عنصر
يوضّح مقتطف الرمز التالي كيف يمكن لتطبيقك تنفيذ عملية تسجيل دخول صامتة:
private void signInSilently() { GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN; GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); if (GoogleSignIn.hasPermissions(account, signInOptions.getScopeArray())) { // Already signed in. // The signed in account is stored in the 'account' variable. GoogleSignInAccount signedInAccount = account; } else { // Haven't been signed-in before. Try the silent sign-in first. GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOptions); signInClient .silentSignIn() .addOnCompleteListener( this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { // The signed in account is stored in the task's result. GoogleSignInAccount signedInAccount = task.getResult(); } else { // Player will need to sign-in explicitly using via UI. // See [sign-in best practices](http://developers.google.com/games/services/checklist) for guidance on how and when to implement Interactive Sign-in, // and [Performing Interactive Sign-in](http://developers.google.com/games/services/android/signin#performing_interactive_sign-in) for details on how to implement // Interactive Sign-in. } } }); } } @Override protected void onResume() { super.onResume(); signInSilently(); }
في حال تعذّر تسجيل الدخول بدون تفاعل، يمكنك طلب getException() للحصول على ApiException مع رمز الحالة التفصيلي. يشير رمز الحالة CommonStatusCodes.SIGN_IN_REQUIRED إلى أنّ اللاعب بحاجة إلى اتّخاذ إجراء واضح لتسجيل الدخول. في هذه الحالة، يجب أن يطلق تطبيقك عملية تسجيل دخول تفاعلية كما هو موضّح في القسم التالي.
تنفيذ عملية تسجيل دخول تفاعلية
لتسجيل الدخول من خلال تفاعل اللاعب، يجب أن يطلق تطبيقك نية تسجيل الدخول. في حال نجاح العملية، تعرض واجهة برمجة التطبيقات "تسجيل الدخول باستخدام حساب Google" واجهة مستخدم تطلب من اللاعب إدخال بيانات الاعتماد
لتسجيل الدخول. يسهّل هذا الأسلوب عملية تطوير تطبيقك، لأنّ نشاط تسجيل الدخول يتعامل مع سيناريوهات مثل الحاجة إلى تحديث "خدمات Google Play" أو عرض طلبات الحصول على الموافقة، وذلك نيابةً عن تطبيقك. يتم عرض النتيجة من خلال
onActivityResult
الدالة الرجعية.
لتنفيذ عملية تسجيل الدخول بشكل تفاعلي، اتّبِع الخطوات التالية:
اتّصِل بالرقم
getSigninIntent()علىGoogleSignInClientللحصول على هدف تسجيل الدخول، ثم اتّصِل بالرقمstartActivity()وأدخِل هذا الهدف. يوضّح مقتطف الرمز التالي كيف يمكن لتطبيقك بدء عملية تسجيل دخول تفاعلية:private void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }في
onActivityResult()، عالِج النتيجة من الغرض الذي تم عرضه.- في حال نجاح عملية تسجيل الدخول، احصل على العنصر
GoogleSignInAccountمنGoogleSignInResult. - إذا لم تنجح عملية تسجيل الدخول، عليك التعامل مع خطأ تسجيل الدخول (على سبيل المثال، من خلال عرض رسالة خطأ في تنبيه). يوضّح مقتطف الرمز التالي كيف يمكن لتطبيقك التعامل مع نتائج تسجيل دخول اللاعب:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { // The signed in account is stored in the result. GoogleSignInAccount signedInAccount = result.getSignInAccount(); } else { String message = result.getStatus().getStatusMessage(); if (message == null || message.isEmpty()) { message = getString(R.string.signin_other_error); } new AlertDialog.Builder(this).setMessage(message) .setNeutralButton(android.R.string.ok, null).show(); } } }
- في حال نجاح عملية تسجيل الدخول، احصل على العنصر
استرداد معلومات اللاعب
لا يحتوي GoogleSignInAccount الذي تعرضه Google Sign-In API على أي معلومات عن اللاعب. إذا كانت لعبتك تستخدم معلومات اللاعبين، مثل الاسم المعروض ورقم تعريف اللاعب،
يمكنك اتّباع الخطوات التالية لاسترداد هذه المعلومات.
- احصل على عنصر
PlayersClientمن خلال استدعاء الطريقةgetPlayersClient()وتمريرGoogleSignInAccountكمعلَمة. - استخدِم طريقتَي
PlayersClientلتحميل العنصرPlayerالذي يحتوي على معلومات اللاعب بشكل غير متزامن. على سبيل المثال، يمكنك طلبgetCurrentPlayer()لتحميل اللاعب الذي سجّل الدخول حاليًا. إذا عرضت المهمة الرمزApiExceptionمع رمز الحالةSIGN_IN_REQUIRED، يشير ذلك إلى ضرورة إعادة مصادقة اللاعب. لإجراء ذلك، اتّصِل بالدالةGoogleSignInClient.getSignInIntent()لتسجيل الدخول إلى المشغّل بشكل تفاعلي. - إذا عرضت المهمة العنصر
Playerبنجاح، يمكنك بعد ذلك استدعاء طرق العنصرPlayerلاسترداد تفاصيل معيّنة عن اللاعب (على سبيل المثال،getDisplayName()أوgetPlayerId().
توفير زر لتسجيل الدخول
لتوفير زر تسجيل دخول عادي باستخدام حساب Google في لعبتك، يمكنك استخدام إحدى الطرق التالية:
- تضمين
com.google.android.gms.common.SignInButtonفي تصميم النشاط الرئيسي - صمِّم زر تسجيل دخول مخصّصًا وفقًا لإرشادات العلامة التجارية الخاصة بخدمة "تسجيل الدخول باستخدام حساب Google".
عندما ينقر المستخدمون على زر تسجيل الدخول، يجب أن تبدأ لعبتك عملية تسجيل الدخول من خلال إرسال غرض تسجيل الدخول، كما هو موضّح في إجراء عملية تسجيل دخول تفاعلية.
يوضّح مقتطف الرمز البرمجي هذا كيفية إضافة زر تسجيل الدخول في طريقة onCreate() لنشاطك.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_in); findViewById(R.id.sign_in_button).setOnClickListener(this); findViewById(R.id.sign_out_button).setOnClickListener(this); }
يوضّح مقتطف الرمز البرمجي التالي كيفية إرسال هدف تسجيل الدخول عندما ينقر المستخدم على زر تسجيل الدخول.
@Override public void onClick(View view) { if (view.getId() == R.id.sign_in_button) { // start the asynchronous sign in flow startSignInIntent(); } else if (view.getId() == R.id.sign_out_button) { // sign out. signOut(); // show sign-in button, hide the sign-out button findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); findViewById(R.id.sign_out_button).setVisibility(View.GONE); } }
عرض النوافذ المنبثقة للألعاب
يمكنك عرض طرق عرض منبثقة في لعبتك باستخدام فئة GamesClient. على سبيل المثال، يمكن أن تعرض لعبتك نافذة منبثقة بعنوان "مرحبًا بعودتك" أو "تم تحقيق إنجازات". للسماح لـ "خدمات ألعاب Google Play" بعرض النوافذ المنبثقة في طرق العرض في لعبتك، استدعِ الطريقة setViewForPopups(). يمكنك تخصيص موضع ظهور النافذة المنبثقة على الشاشة بشكل أكبر من خلال استدعاء setGravityForPopups().
تسجيل خروج اللاعب
يتم تسجيل الخروج من خلال استدعاء الطريقة signOut() في GoogleSignInClient.
private void signOut() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); signInClient.signOut().addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { // at this point, the user is signed out. } }); }