如何在Xamarin中快速集成Android版認證服務-手機號碼篇
- 2022 年 1 月 22 日
- 筆記
Xamarin作為微軟提供的移動服務多系統開發平台,成為很多開發者首選的應用開發平台。AppGallery Connect(以下簡稱AGC)也在逐步的支援Xamarin的SDK。認證服務也是支援Xamarin平台的服務之一,今天就教大家如何在Xamarin里快速集成認證服務的手機號碼認證。
- 安裝Xamarin環境
Xamarin的御用開發平台是Visual Studio,所以我們需要首先安裝Visual Studio 2019.
下載地址://visualstudio.microsoft.com/zh-hans/downloads/
下載好後進行安裝,我們需要安裝Xamarin配套的插件,Mobile development with .NET,中文叫「使用.NET的移動開發」,安裝完成後就可以通過Visual Studio進行Xamarin的Android和iOS開發了。

- 在AGC頁面開通認證服務,具體創建與配置驟可以參考認證服務官方文檔://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-auth-android-getstarted-0000001053053922
3.創建Xamarin工程
在Visual Studio中創建新項目,選擇移動應用(Xamarin.Forms),將應用的名稱等資訊設置好後,創建項目

- 將遠程配置的Xamarin包集成到新的項目中
有兩種方式集成Xamarin包
第一種是雲端方式集成,在目錄欄右擊選擇管理NuGet程式包

在瀏覽選項中搜索Huawei.Agconnect.Auth,點擊安裝即可
第二種方式是本地集成NuGet包,首先需要將所有需要的NuGet包放入本地的一個文件夾中,

還是按照第一種的方式打開NuGet包管理器,中島程式包源邊上的設置圖標,打開選項目錄

點擊綠色的加號添加新的包源,在源的地方輸入剛剛存放NuGet本地包的文件夾目錄即可。

- 添加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使用入門://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-get-started-xamarin
認證服務-xamarin使用指導://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-auth-xamarin-android-usage-0000001098592850#EN-US_TOPIC_0000001098592850__section17453164515224
更多精彩內容,請見華為開發者官方論壇→//developer.huawei.com/consumer/cn/forum/home?ha_source=sanfang
