如何在 Xamarin 中快速整合 Android 版認證服務 - 郵箱地址篇

華為開發者論壇發表於2022-02-16

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 開發了。

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

3. 建立 Xamarin 工程

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

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

有兩種方式整合 Xamarin 包

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

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

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

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

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

5. 新增 AGC 配置檔案

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

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

b). 在專案中建立一個新的類,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 也提供了傳送驗證碼的功能:

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

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

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

讀取使用者輸入的郵箱地址,呼叫 RequestVerifyCodeAsync 方法向認證服務伺服器請求傳送驗證碼,傳入郵箱地址以及剛剛我們建立的 setting 物件

string email = edtAccount.Text.ToString().Trim();
try
{
    var requestVerifyCode = AGConnectAuth.Instance.RequestVerifyCodeAsync(email, 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();
}

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

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

string email = edtAccount.Text.ToString().Trim();
string password = edtPassword.Text.ToString().Trim();

string verifyCode = edtVerifyCode.Text.ToString().Trim();
                // Build e-mail user.
EmailUser emailUser = new EmailUser.Builder()
                    .SetEmail(email)
                    .SetPassword(password)//optional,if you set a password, you can log in directly using the password next time.
                    .SetVerifyCode(verifyCode)
                    .Build();

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

try
{
    // Create e-mail user.
    var emailUserResult = AGConnectAuth.Instance.CreateUserAsync(emailUser);
    ISignInResult signInResult = await emailUserResult;
    if (emailUserResult.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 會自動為使用者進行登入,無需再呼叫登入介面了

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

string email = edtAccount.Text.ToString().Trim();
string password = edtPassword.Text.ToString().Trim();
string verifyCode = edtVerifyCode.Text.ToString().Trim();
IAGConnectAuthCredential credential;
if (TextUtils.IsEmpty(verifyCode))
{
    credential = EmailAuthProvider.CredentialWithPassword(email, password);
}
else
{
    credential = EmailAuthProvider.CredentialWithVerifyCode(email, password, verifyCode);
}
SignIn(credential);
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

相關文章