記事一覧

Google SignInでログイン認証する方法 -Androidデバッグ編- | Xamarin.Forms


今回はXamarin.AndroidでGoogleのログイン認証を行う方法についてご紹介いたします。iOSでのログイン認証方法については前回の記事にてご紹介しましたが、AndroidとiOSで共通して使用できるために同じXAMLから呼び出せるコードにしております。また、今回の記事の内容ではDebugモードでの動作を対象としております。Release(配信用)モードでの動作につきましては次の記事をご参考くださいませ。


xamarin_google_signin_03.png 



前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.4.0.34 (NuGet Xamarin.Forms 2.3.4.247)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.8.0.1



1.NuGetパッケージをインストールする

Androidプロジェクトに以下のパッケージををインストールします。
Xamarin.GooglePlayService.Base
Xamarin.GooglePlayService.Basement
Xamarin.GooglePlayService.Plus
「Xamarin.GooglePlayService」で検索するとすぐに見つかります。
私の場合、他のパッケージとの因果関係の為、バージョン27をインストールしました。

xamarin_google_signin_05.png



2.Google Developersの登録

(1)ブラウザでGoogle DevelopersのURLを開きます。
  https://developers.google.com/mobile/add
(2)Pick a Platform ボタンを押下します。
(3)Android Appボタンを押下します。
(4)App nameに アプリの名前を入力します。
(5)Android Package Name には com.CompanyName.AppName のようにフル名称を入力します。
(6)share your ...のチェックを外し、YourCountry に日本を選択して Choose and Configure serviceボタンを押下します。
(7)SHA1パスフレーズを入力します。
SHA1パスフレーズはコマンドプロンプトからjavaのkeytool.exeを使用してXamarinのキーストアフォルダを対象に生成が可能です。
生成コマンドは以下のようになります。
"C:\Program Files\Java\jdk1.8.0_121\bin\keytool.exe" -list -v -keystore "%LocalAppData%\Xamarin\Mono for Android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

※環境によりjavaのインストールフォルダとXamarinのキーストアフォルダを確認の上変更して実行してください。Xamarinのキーストアフォルダはデバッグ用とアドホックアプリ用で分かれて存在していますので、お気を付けください。
※尚、本番用(配信・リリース用)APKのSHA1の取得方法は次の記事にてご紹介しております。

xamarin_google_signin_04.png

(8)Google Sign-In を選択して Generate configuration filesボタンを押下します。

xamarin_google_signin_02.png

これでgoogle-services.jsonファイルが取得できますが、使用しないので無視します。
※以下のURLからもプロジェクトを指定することでアクセス許可を登録することが可能です。
https://console.developers.google.com/apis/credentials



3.AndroidManifest.xmlに追記

以下のパーミッションを追記します。

AndroidManifest.xml
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />



4.PCLの記述

ログイン処理・ログアウト処理・切断処理はAndroidと共通のPCLのXAML画面から呼び出したいのでDependencyServiceを設定します。

IGoogleSignInService.cs
namespace AppName.Services
{
    //DependencyServiceから利用する
    public interface IGoogleSignInService
    {
        void SignIn();
        void SignOut();
        void Disconnect();
    }
}



5.Androidプロジェクトの記述

ログイン処理・ログアウト処理・切断処理を実装します。

GoogleSignInService.cs
using Android.Gms.Common.Apis;
using Android.Support.V7.App;
using Android.Gms.Common;
using Android.Util;
using Android.Gms.Plus;
using Xamarin.Forms;
using AppName.Droid.Services;
using AppName.Services;
[assembly: Dependency(typeof(GoogleSignInService))]
namespace AppName.Droid.Services
{
public class GoogleSignInService : IGoogleSignInService
{
public static GoogleApiClient GoogleApiClient;
//サインイン
public void SignIn()
{
try
{
if (GoogleSignInService.GoogleApiClient != null &&
!GoogleSignInService.GoogleApiClient.IsConnected)
{
GoogleSignInService.GoogleApiClient.Connect();
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
}
}
//サインアウト
public void SignOut()
{
if (GoogleSignInService.GoogleApiClient != null &&
GoogleSignInService.GoogleApiClient.IsConnected)
{
PlusClass.AccountApi.ClearDefaultAccount(GoogleSignInService.GoogleApiClient);
PlusClass.AccountApi.RevokeAccessAndDisconnect(GoogleSignInService.GoogleApiClient);
}
}
//切断処理
public void Disconnect()
{
if (GoogleSignInService.GoogleApiClient != null &&
GoogleSignInService.GoogleApiClient.IsConnected)
{
PlusClass.AccountApi.ClearDefaultAccount(GoogleSignInService.GoogleApiClient);
PlusClass.AccountApi.RevokeAccessAndDisconnect(GoogleSignInService.GoogleApiClient);
GoogleSignInService.GoogleApiClient.Disconnect();
}
}
}
}



6.MainActivityの記述

MainActivity.csに以下の記述を追加します。

using Android.Gms.Common.Apis;
using Android.Gms.Common;
using Android.Gms.Plus;
namespace AppName.Droid
{
[Activity(Label = "AppName"]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity,
GoogleApiClient.IConnectionCallbacks, GoogleApiClient.IOnConnectionFailedListener
{
private const int RC_SIGN_IN = 9001;
protected override void OnCreate(Bundle bundle)
{
try
{
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());

//Google SignIn
GoogleSignInService.GoogleApiClient = new GoogleApiClient.Builder(this)
.AddConnectionCallbacks(this)
.AddOnConnectionFailedListener(this)
.AddApi(PlusClass.API)
.AddScope(PlusClass.ScopePlusLogin)
.Build();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
}
}
protected override void OnActivityResult(int requestCode, Result resultCode, global::Android.Content.Intent data)
{
// Ask the open service connection's billing handler to process this request
try
{
base.OnActivityResult(requestCode, resultCode, data);

if (requestCode == RC_SIGN_IN)
{
if (resultCode == Result.Ok)
{
GoogleSignInService.GoogleApiClient.Connect();
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
}
}
    protected override void OnStop()
{
base.OnStop();
//待機中の処理が必要であれば記述します。
}
public void OnConnected(Bundle connectionHint)
{
//接続成功時の処理が必要であれば記述します。
}

public void OnConnectionSuspended(int cause)
{
//接続中断時の処理が必要であれば記述します。

}
public void OnConnectionFailed(ConnectionResult result)
{
//接続失敗時の処理が必要であれば記述します。
if (!result.HasResolution)
{
// show the localized error dialog.
GoogleApiAvailability.Instance.GetErrorDialog(this, result.ErrorCode, 0).Show();
return;
}

//アカウントログインが必要な場合
try
{
result.StartResolutionForResult(this, RC_SIGN_IN);
}
catch (IntentSender.SendIntentException e)
{
System.Diagnostics.Debug.WriteLine(e.Message + System.Environment.NewLine + e.StackTrace);
}
}
}
}

ソースのポイントは

(1)まずはMainActivityに以下のインターフェースを継承します。
・GoogleApiClient.IConnectionCallbacks
・GoogleApiClient.IOnConnectionFailedListener
※MainActivity以外のActivityに記述したい場合はAndroid.Support.V4.App.FragmentActivityを継承したActivityを作成して上記の2つのインターフェイースを実装しましょう。
  (※MainActivityはAppCompatActivityのベースクラスであるAndroid.Support.V4.App.FragmentActivityを継承しています。)

(2)OnCreate時にGoogleApiClientのインスタンスを生成します。

(3)ConnectメソッドによりGoogleに認証がかかりますが、初回は必ずOnConnectionFailedに落ちます。

(4)OnConnectionFailed内にてresult.StartResolutionForResultをコールすることによりユーザーにアカウント情報の入力ダイアログが表示されます。

(5)ダイアログの結果をOnActivityResultでキャッチします。

(6)resultCodeがResult.Okの場合にConnectメソッドをコールすることでログインが可能となります。



7.使用方法

TestPage.xaml.cs
void OnGoogleSignInClick(object sender, EventArgs e)
{
//サインイン
    DependencyService.Get<IGoogleSignInService>().SignIn();
//サインアウト
    DependencyService.Get<IGoogleSignInService>().SignOut();
//切断
    DependencyService.Get<IGoogleSignInService>().Disconnect();
}




当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。