如何在Xamarin中快速整合Android版認證服務-手機號碼篇

華為開發者論壇發表於2022-01-22

Xamarin作為微軟提供的移動服務多系統開發平臺,成為很多開發者首選的應用開發平臺。AppGallery Connect(以下簡稱AGC)也在逐步的支援Xamarin的SDK。認證服務也是支援Xamarin平臺的服務之一,今天就教大家如何在Xamarin裡快速整合認證服務的手機號碼認證。

  1. 安裝Xamarin環境

Xamarin的御用開發平臺是Visual Studio,所以我們需要首先安裝Visual Studio 2019.

下載地址:https://visualstudio.microsoft.com/zh-hans/downloads/

下載好後進行安裝,我們需要安裝Xamarin配套的外掛,Mobile development with .NET,中文叫“使用.NET的移動開發”,安裝完成後就可以通過Visual Studio進行Xamarin的Android和iOS開發了。

  1. 在AGC頁面開通認證服務,具體建立與配置驟可以參考認證服務官方文件:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-auth-android-getstarted-0000001053053922

3.建立Xamarin工程

在Visual Studio中建立新專案,選擇移動應用(Xamarin.Forms),將應用的名稱等資訊設定好後,建立專案

  1. 將遠端配置的Xamarin包整合到新的專案中

有兩種方式整合Xamarin包

第一種是雲端方式整合,在目錄欄右擊選擇管理NuGet程式包

在瀏覽選項中搜尋Huawei.Agconnect.Auth,點選安裝即可

第二種方式是本地整合NuGet包,首先需要將所有需要的NuGet包放入本地的一個資料夾中,

還是按照第一種的方式開啟NuGet包管理器,中島程式包源邊上的設定圖示,開啟選專案錄

點選綠色的加號新增新的包源,在源的地方輸入剛剛存放NuGet本地包的資料夾目錄即可。

  1. 新增AGC配置檔案

AGC為開發者準備了一個存放所有應用相關資訊的配置json檔案,我們需要將這個檔案整合到專案中以便後續呼叫介面時使用,我們的SDK會自動讀取裡面的內容,無需開發者呼叫時手動傳入了,具體步驟如下

a) 按照第二步文件中的方法從AGC管理臺中下載agconnect-services.json檔案,將檔案放入專案的Assets目錄下

b) 在專案中建立一個新的類,HmsLazyInputStreams.cs,將如下程式碼寫入進行json檔案的內容讀取

using System;
using System.IO;
using Android.Util;
using Android.Content;
using Huawei.Agconnect.Config;
 
namespace XamarinHmsRemoteConfig
{
    class HmsLazyInputStream : LazyInputStream
    {
        public HmsLazyInputStream(Context context) : base(context)
        {
            Get(context);
        }
 
        public override Stream Get(Context context)
        {
            try
            {
                return context.Assets.Open("agconnect-services.json");
            }
            catch (Exception e)
            {
                Log.Error(e.ToString(), "Can't open agconnect file");
                return null;
            }
        }
    }
}

在主Activity中,我們需要在AttachBaseContext中新增如下程式碼已讀取json檔案中的內容

protected override void AttachBaseContext(Context context)
{
            base.AttachBaseContext(context);
            AGConnectServicesConfig config = AGConnectServicesConfig.FromContext(context);
            config.OverlayWith(new HmsLazyInputStream(context));
}

c) 設定包名

右擊專案找到屬性選項,在Android清單頁籤找到程式包名稱,設定應用的包名。

準備工作完成後,我們就可以正式進入開發階段

對於手機號碼認證,認證服務SDK提供了兩個階段的操作,一個是註冊,另一個是登入。這兩個操作都需要用到獲取簡訊驗證碼的功能,所以認證服務SDK也提供了傳送驗證碼的功能:

i. 傳送驗證碼的步驟如下:

首先我們需要建立一個VerifyCodeSettings物件,裡面包含了傳送簡訊的相關設定,包括action,語言等

VerifyCodeSettings settings = VerifyCodeSettings.NewBuilder()
                .Action(VerifyCodeSettings.ActionRegisterLogin)
                .SendInterval(30)
                .Locale(Locale.English)
                .Build();
								
								```
								
								
								
								

讀取使用者輸入的國家碼與手機號,呼叫RequestVerifyCodeAsync方法向認證服務伺服器請求傳送驗證碼,傳入國家碼,手機號以及剛剛我們建立的setting物件

string countryCode = edtCountryCode.Text.ToString().Trim();
string phoneNumber = edtAccount.Text.ToString().Trim();

try
{
var requestVerifyCode = AGConnectAuth.Instance.RequestVerifyCodeAsync(countryCode, phoneNumber, settings);
VerifyCodeResult verifyCodeResult = await requestVerifyCode;
if(requestVerifyCode.Status.Equals(System.Threading.Tasks.TaskStatus.RanToCompletion))
{

Toast.MakeText(this, "Send email verify code success! ", ToastLength.Short).Show();
                    }
                }
                catch (Exception ex)
                {
                    Toast.MakeText(this, ex.Message, ToastLength.Long).Show();
}


ii. 使用者獲取驗證碼後就可以開始註冊流程了

首先我們需要讀取使用者的輸入並構建一個PhoneUser物件,裡面存放了手機使用者的相關資訊,包括手機號,國家碼,驗證碼和密碼。這裡使用者在建立的時候可以選擇是否設定密碼,如果設定則後續在登入的時候就需要輸入密碼。

string countryCode = edtCountryCode.Text.ToString().Trim();
string phoneNumber = edtAccount.Text.ToString().Trim();
string password = edtPassword.Text.ToString().Trim();
string verifyCode = edtVerifyCode.Text.ToString().Trim();
 
// Build phone user.
PhoneUser phoneUser = new PhoneUser.Builder()
                    .SetCountryCode(countryCode)
                    .SetPhoneNumber(phoneNumber)
                   .SetPassword(password)
                    .SetVerifyCode(verifyCode)
                    .Build();

									```
									
									
									
									
	PhoneUser建立成功後我們就可以呼叫CreateUserAsync方法建立使用者了
	
	```
	
	try

{
                    // Create phoneUser user.
                    var phoneUserResult = AGConnectAuth.Instance.CreateUserAsync(phoneUser);
                    ISignInResult signInResult = await phoneUserResult;
                    if (phoneUserResult.Status.Equals(System.Threading.Tasks.TaskStatus.RanToCompletion))
                    {
                        // After a user is created, the user has logged in by default.
                        StartActivity(new Intent(this, typeof(MainActivity)));
                   }
                }
                catch (Exception ex)
                {
                    Toast.MakeText(this,"Create User Fail:" + ex.Message, ToastLength.Long).Show();
                }
            }
```

	使用者建立完成後,SDK會自動為使用者進行登入,無需再呼叫登入介面了

iii. 對於非首次使用的使用者,我們就需要進行登入操作了,基於之前註冊時的設定,登入分為兩種,驗證碼登入和密碼登入


string countryCode = edtCountryCode.Text.ToString().Trim();
                string phoneNumber = edtAccount.Text.ToString().Trim();
                string password = edtPassword.Text.ToString().Trim();
                string verifyCode = edtVerifyCode.Text.ToString().Trim();
                IAGConnectAuthCredential credential;
                if (TextUtils.IsEmpty(verifyCode))
                {
                    credential = PhoneAuthProvider.CredentialWithPassword(countryCode, phoneNumber, password);
                }
                else
                {
                    credential = PhoneAuthProvider.CredentialWithVerifyCode(countryCode, phoneNumber, password, verifyCode);
                }

try
            {
                AGConnectAuth connectAuth = AGConnectAuth.Instance;
                var signInResult = AGConnectAuth.Instance.SignInAsync(credential);

                ISignInResult result = await signInResult;

                if (signInResult.Status.Equals(System.Threading.Tasks.TaskStatus.RanToCompletion))
                {
                    Log.Debug(TAG, signInResult.Result.ToString());
                    StartActivity(new Intent(this, typeof(MainActivity)));
                    Finish();
                }
            }
            catch (Exception ex)
            {
                Log.Error(TAG, ex.Message);
                Toast.MakeText(this, "SignIn failed: " + ex.Message, ToastLength.Long).Show();
            }
						
						```
						
						
						我們可以看到,如果是密碼登入,我們呼叫的是CredentialwithPassword來建立一個credential,而驗證碼登入則是使用CredentialWithVerifyCode來建立credential。而後我們呼叫SignInAsync方法傳入這個credential進行登入的操作。

 

以上我們就成功接入了Xamarin版本認證服務中的手機賬號認證。如果覺得簡單那就趕快行動起來試試吧。



參考文件:

xamarin使用入門:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-get-started-xamarin

認證服務-xamarin使用指導:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-auth-xamarin-android-usage-0000001098592850#EN-US_TOPIC_0000001098592850__section17453164515224


										
										
										
										
										
										
更多精彩內容,請見華為開發者官方論壇→https://developer.huawei.com/consumer/cn/forum/home?ha_source=sanfang

相關文章