fc2ブログ

記事一覧

-Androidリリース編- Google SignInの設定方法 | Xamarin.Forms


今回は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を取得する方法につきましては、前回の記事をご確認くださいませ。

xamarin_google_signin_06.png



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からご覧になれます。
https://itblog.dynaspo.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


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

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

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