اگر از ورود به سیستم با حسابهای Google پشتیبانی میکنید، میتوانید از سرویس گیرنده ورود به سیستم با یک ضربه استفاده کنید تا به کاربران خود تجربه ایجاد حساب بدون اصطکاک را ارائه دهید که هرگز آنها را از متن برنامه شما خارج نمیکند.
وقتی رابط کاربری One Tap را نمایش میدهید، از کاربران خواسته میشود با استفاده از یکی از حسابهای Google در دستگاه خود یک حساب کاربری جدید با برنامه شما ایجاد کنند. اگر کاربر ادامه را انتخاب کند، یک کد شناسه با اطلاعات اصلی نمایه - نام، عکس نمایه و آدرس ایمیل تأیید شده او - دریافت میکنید که میتوانید از آن برای ایجاد حساب جدید استفاده کنید.
پیاده سازی ایجاد حساب کاربری One Tap دارای دو بخش است:
- ادغام سرویس گیرنده One Tap در برنامه خود، که در این صفحه توضیح داده شده است. این بیشتر مانند استفاده از ورود به سیستم One Tap است، اما با برخی تفاوتها در پیکربندی.
- افزودن قابلیت ایجاد حسابهای کاربری از توکنهای Google ID به باطن شما، که در استفاده از نشانههای ID در باطن مورد بحث قرار گرفته است.
کجا باید از ثبت نام One Tap استفاده کنم؟
تاثیرگذارترین مکان برای ارائه ثبت نام One Tap به کاربران در شرایطی است که ورود به سیستم ویژگی های جدیدی را فعال می کند. ابتدا سعی کنید کاربر را با یک اعتبار ذخیره شده وارد کنید. اگر اعتبار ذخیره شده ای یافت نشد، پیشنهاد ایجاد یک حساب کاربری جدید برای کاربر را بدهید.
قبل از شروع
پروژه کنسول Google APIs و پروژه Android خود را همانطور که در شروع با ورود به سیستم با One Tap توضیح داده شده است، تنظیم کنید.
1. سرویس گیرنده One Tap را پیکربندی کنید
برای پیکربندی مشتری One Tap برای ایجاد حساب، موارد زیر را انجام دهید:
- درخواست های اعتبار رمز عبور را فعال نکنید. (ثبت نام با یک ضربه فقط با احراز هویت مبتنی بر توکن امکان پذیر است.)
با استفاده از
setGoogleIdTokenRequestOptions()
و این تنظیمات، درخواستهای رمز Google ID را فعال کنید:- شناسه سرویس گیرنده سرور را روی شناسهای که در کنسول Google APIs ایجاد کردهاید، تنظیم کنید. توجه داشته باشید که این شناسه مشتری سرور شما است، نه شناسه مشتری اندروید شما.
- مشتری را طوری پیکربندی کنید که همه حسابهای Google را در دستگاه نشان دهد—یعنی بر اساس حسابهای مجاز فیلتر نکنید.
- در صورت تمایل، میتوانید شماره تلفن تأیید شده حساب را نیز درخواست کنید .
جاوا
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signUpRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build(); // ... } }
کاتلین
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signUpRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build() // ... } // ... }
2. لغو One Tap UI را پیگیری کنید
باید پیگیری کنید که آیا کاربر قبلاً از استفاده از ثبت نام با One Tap خودداری کرده است یا با بستن فرمان یا ضربه زدن در خارج از آن. این می تواند به سادگی یک ویژگی بولی از Activity شما باشد. (به توقف نمایش رابط کاربری One Tap در زیر مراجعه کنید.)
3. رابط کاربری ثبت نام با یک ضربه را نمایش دهید
اگر کاربر استفاده از One Tap را برای ایجاد یک حساب جدید رد نکرده است، متد beginSignIn()
شی مشتری را فراخوانی کرده و شنوندگان را به Task
که برمیگرداند متصل کنید. برنامهها معمولاً این مرحله را زمانی انجام میدهند که یک درخواست ورود به سیستم با یک ضربه، هیچ اعتبار ذخیرهشدهای را پیدا نمیکند - یعنی در شنونده شکست درخواست ورود به سیستم.
اگر کاربر یک یا چند حساب Google روی دستگاه تنظیم کرده باشد، مشتری One Tap با شنونده موفق تماس می گیرد. در موفقیت شنونده، هدف معلق را از نتیجه Task
دریافت کنید و آن را به startIntentSenderForResult()
ارسال کنید تا رابط کاربری One Tap شروع شود.
اگر کاربر هیچ حساب Google در دستگاه نداشته باشد، سرویس گیرنده One Tap با شنونده شکست تماس می گیرد. در این مورد، هیچ اقدامی لازم نیست: شما به سادگی می توانید به ارائه تجربه خروج از سیستم برنامه ادامه دهید، و کاربر می تواند با جریان ایجاد حساب عادی شما ثبت نام کند.
جاوا
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
@Override
public void onSuccess(BeginSignInResult result) {
try {
startIntentSenderForResult(
result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
کاتلین
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. پاسخ کاربر را مدیریت کنید
پاسخ کاربر به درخواست ثبت نام با یک ضربه با استفاده از روش onActivityResult()
Activity به برنامه شما گزارش می شود. اگر کاربر ایجاد یک حساب کاربری را انتخاب کند، نتیجه یک توکن Google ID خواهد بود. اگر کاربر از ثبت نام خودداری کرد، چه با بستن رابط کاربری One Tap یا ضربه زدن در خارج از آن، نتیجه با کد RESULT_CANCELED
برمیگردد. برنامه شما باید هر دو احتمال را مدیریت کند.
یک حساب کاربری با توکن Google ID ایجاد کنید
اگر کاربر ثبت نام با یک حساب Google را انتخاب کرد، میتوانید با ارسال دادههای intent از onActivityResult()
به متد getSignInCredentialFromIntent()
کلاینت One Tap، یک نشانه شناسه برای کاربر دریافت کنید. این اعتبار دارای ویژگی googleIdToken
غیر تهی خواهد بود.
از نماد ID برای ایجاد یک حساب در باطن خود استفاده کنید ( به تأیید اعتبار با یک باطن با استفاده از نشانه های ID مراجعه کنید) و کاربر را وارد کنید.
اعتبار همچنین حاوی هر گونه جزئیات اضافی است که درخواست کرده اید، مانند شماره تلفن تأیید شده حساب در صورت وجود.
جاوا
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } } }
کاتلین
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ... }
نمایش رابط کاربری One Tap را متوقف کنید
اگر کاربر ورود به سیستم را رد کرد، تماس با getSignInCredentialFromIntent()
یک ApiException
با کد وضعیت CommonStatusCodes.CANCELED
ایجاد می کند. وقتی این اتفاق میافتد، باید به طور موقت نمایش رابط کاربری One Tap را متوقف کنید تا کاربران خود را با درخواستهای مکرر آزار ندهید. مثال زیر این کار را با تنظیم یک ویژگی در Activity انجام می دهد، که از آن برای تعیین اینکه آیا به کاربر ورود با یک ضربه را ارائه می دهد یا خیر، استفاده می کند. با این حال، شما همچنین می توانید یک مقدار را در SharedPreferences
ذخیره کنید یا از روش دیگری استفاده کنید.
این مهم است که محدودیت نرخ خود را برای درخواستهای ورود به سیستم با یک ضربه اجرا کنید. اگر این کار را نکنید و یک کاربر چندین درخواست را پشت سر هم لغو کند، مشتری One Tap تا 24 ساعت آینده از کاربر درخواست نخواهد کرد.
جاوا
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { // ... } catch (ApiException e) { switch (e.getStatusCode()) { case CommonStatusCodes.CANCELED: Log.d(TAG, "One-tap dialog was closed."); // Don't re-prompt the user. showOneTapUI = false; break; case CommonStatusCodes.NETWORK_ERROR: Log.d(TAG, "One-tap encountered a network error."); // Try again or just ignore. break; default: Log.d(TAG, "Couldn't get credential from result." + e.getLocalizedMessage()); break; } } break; } } }
کاتلین
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { // ... } catch (e: ApiException) { when (e.statusCode) { CommonStatusCodes.CANCELED -> { Log.d(TAG, "One-tap dialog was closed.") // Don't re-prompt the user. showOneTapUI = false } CommonStatusCodes.NETWORK_ERROR -> { Log.d(TAG, "One-tap encountered a network error.") // Try again or just ignore. } else -> { Log.d(TAG, "Couldn't get credential from result." + " (${e.localizedMessage})") } } } } } } // ... }
مراحل بعدی
هنگامی که یک کاربر جریان ثبت نام با یک ضربه را کامل می کند، یک نشانه Google ID دریافت می کنید که شامل برخی از اطلاعات اولیه نمایه است: آدرس ایمیل کاربر، نام کامل، و URL تصویر نمایه. برای بسیاری از برنامهها، این اطلاعات برای احراز هویت کاربر و ایجاد یک حساب کاربری جدید کافی است.
اگر برای تکمیل ایجاد حساب به اطلاعات بیشتری نیاز دارید - به عنوان مثال، تاریخ تولد کاربر - یک جریان جزئیات ثبت نام را به کاربر ارائه دهید، جایی که شما این اطلاعات اضافی را درخواست می کنید. سپس، آن را به باطن خود ارسال کنید تا ایجاد حساب کامل شود.