-Androidリリース編- Google SignInの設定方法 | Xamarin.Forms
- 2017/07/01
- 00:50
今回はXamarin.AndroidアプリでGoogle SignIn認証を動作させる方法をご紹介します。以前の記事ではデバッグ用のGoogle SignIn認証でした。今回はRelease編です。
Androidでの実績は様々掲載されていますが、環境や設定が若干異なっており参考になりませんでした。そしてXamarinでのGoogle SignInの実績がどこにも載っておらず、Xamarin公式ページにも古いコードが掲載されている状況で、私は正解を見つけるのに多大な時間を費やしました。2週間ほど試行錯誤したでしょうか。Google SignInの設定方法を再確認できた結果、以下のようなルールが見えてきました。
前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.795 (NuGet Xamarin.Forms 2.3.4.247)
・Java SE Development Kit 1.8.121
・Android SDK Manager rev25.2.5
前提.Google SignInの設定方法のまとめ
<VisualStudioでの設定方法>(1)GooglePlayServicesのNugetパッケージは最新バージョンでなくて良い
(2)Google-Services.jsonファイルは必要ない。
(3)ClientIDはコード上でハードコートする必要が無い。
<Google API Consoleの設定方法>
(4)パーミッションの設定
(5)Degug用とRelease用でClientIDを分けなければならない。
(6)Webアプリケーション用のClientIDをひとつ用意しないければならない。
<ソースについて>
(7)接続方法の記述は2通り存在する。
上記の条件に付いて以下に説明をさせて頂きたいと思います。
1.Nugetパッケージ
結局リリースビルドで成功したGooglePlaySerivcesのバージョンは29.0.0.2で大丈夫した。v42.1021.00でもGoogle SignInに成功しましたが、Multi-Dexを有効にせねばならず、ハードルが高い印象です。
最低限としては以下のパッケージをインストールしてください。
Xamarin.GooglePlaySerivces.Auth v29.0.0.2
Xamarin.GooglePlayServices.Base v29.0.0.2
Xamarin.GooglePlayServices.Basement v29.0.0.2
Xamarin.GooglePlayServices.Plus v29.0.0.2
2.Google-Services.jsonファイル
Google-Services.jsonファイルは必要ありません。尚、アプリ内に配置し、ビルドアクションをGoogleServicesJsonにすることにより、このファイルから得られる情報は、GetString(Resource.String.default_web_client_id) で取得できるようになるぐらいで、特にメリットを感じませんでした。ビルドアクションをGoogleServicesJsonでビルドが通るようにするにはXamarin.GooglePlayServices.Tasksをインストールし、Xamarin.GooglePlayServices関連のパッケージバージョンを32以上にしなければならず(さらにはMulti-Dexを有効にする必要もあります)、意味のない作業にハードルが上がります。
検証した結果、実際の認証には必要が皆無であると結論付けております。
3.ClientIDのソース上での取り扱い
GoogleSignInOptionsの設定として、.RequestServerAuthCode(serverClientId, false)や.RequestIdToken(serverClientId) として設定することが他のサイトで取り上げられておりますが、一切必要ありません。記述が無くてもサインイン可能です。Google API ConsoleでSHA1のみの振り分けがされているためだと推測しています。
4.パーミッションの設定
以前の記事同様以下のように設定する必要があります。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" />
5.Debug用とRelease用との切り分け
Google Api Console の管理画面にて Debug用のSHA1と Release用のSHA1を登録することにより切り分けます。Debug用とRelease用のSHA1を取得する方法につきましては、前回の記事をご確認くださいませ。

6.Webアプリケーション用のClientID
ただし、Webアプリケーション用のClientIDをひとつ用意しなければなりません。これはDebug用とRelease用で共通だと思います。なぜかSHA1での接続が優先されているはずですが、Webアプリケーション用のClientIDが無いと接続ができません。(原因不明です。不具合か仕様によるものと思われます。)
7.実際のソース(配信用APK)
前回の記事のソースを修正してください。MainActivity.cs
namespace AppName.Droid
{
[Activity(Label = "AppName"]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity,
GoogleApiClient.IConnectionCallbacks,
GoogleApiClient.IOnConnectionFailedListener
{
public const int RC_SIGN_IN = 9001;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
//Google SignIn
Scope calendarScope = new Scope("https://www.googleapis.com/auth/calendar");
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
.RequestScopes(new Scope(Scopes.Email),
calendarScope)
.RequestEmail()
//.RequestServerAuthCode(serverClientId, false) //必要なし
//.RequestIdToken(serverClientId) //必要なし
.Build();
GoogleSignInService.GoogleApiClient = new GoogleApiClient.Builder(this)
.EnableAutoManage(this, this)
.AddApi(PlusClass.API)
.AddScope(calendarScope)
.Build();
}
protected override void OnActivityResult(int requestCode, Result resultCode, global::Android.Content.Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN)
{
//Google SignIn の認証結果を受け取る
GoogleSignInResult result = Auth.GoogleSignInApi.GetSignInResultFromIntent(data);
handleSignInResult(result);
}
}
private void handleSignInResult(GoogleSignInResult result)
{
if (result != null &&
result.IsSuccess)
{
Task.Run(() =>
{
//メールアドレス・トークンを取得する
GoogleSignInAccount account = result.SignInAccount;
GoogleSignInService.MailAddress = account.Email;
GoogleSignInService.AccessToken = Android.Gms.Auth.GoogleAuthUtil.GetToken(
Application.Context,
new Android.Accounts.Account(account.Email, "com.google"),
"oauth2:" + "https://www.googleapis.com/auth/calendar");
}).ConfigureAwait(false);
}
}
}
}
GoogleSignInServices.cs
public class GoogleSignInService : IGoogleSignInService
{
public static GoogleApiClient GoogleApiClient;
//サインイン
public void SignIn()
{
if (GoogleSignInService.GoogleApiClient != null)
{
Intent signInIntent = Auth.GoogleSignInApi.GetSignInIntent(GoogleSignInService.GoogleApiClient);
((Activity)Forms.Context).StartActivityForResult(signInIntent, MainActivity.RC_SIGN_IN);
}
}
//サインアウト
public void SignOut()
{
if (GoogleSignInService.GoogleApiClient != null &&
GoogleSignInService.GoogleApiClient.IsConnected)
{
Auth.GoogleSignInApi.SignOut(GoogleSignInService.GoogleApiClient);
}
}
//切断処理
public void Disconnect()
{
if (GoogleSignInService.GoogleApiClient != null &&
GoogleSignInService.GoogleApiClient.IsConnected)
{
Auth.GoogleSignInApi.RevokeAccess(GoogleSignInService.GoogleApiClient);
}
}
}
DependencyServiceで呼び出します。使用方法につきましては以前の記事をご確認ください。
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html
アプリ間での呼び出しとパラメータの受け渡しについて(Deep Link / App Links)-Android編- | Xamarin.Forms ホーム
Google SignInの配信用APKのSHA1フィンガープリントを取得する方法 | Xamarin.Forms