20220225のAndroidに関する記事は4件です。

Unity+Android+OAuth認証の実装方法の紹介

1. 前置き AndroidでOAuthを実装するにあたり、専用ライブラリを使うことが最も簡単な方法です。しかし、当たり前ですが、Android向けのライブラリなので、Unityでは使えません。本稿はUnityでAndroid向けのOAuthを実装する手順を紹介するものです。また、例として、GoogleのOAuthを取り上げます。 2. 流れの概要 AndroidでGoogleのOAuthを使用する流れは次の通りです。 Custom Tabsを開く Googleの認証画面を表示する Google認証のリダイレクトを受け取る リダイレクトで得られたトークンを使い、ユーザー情報を取得する 下記のリソースを使えば、実装がより簡単になります。 2.1. リソースの紹介 2.1.1. IdentityModel.OidcClient IdentityModel.OidcClientはC#向けのOpenID Connect認定済みのOAuth SDKです。netstandard14、デスクトップ.N​​ET、UWP、.NET Core、Xamarin iOS、Androidをサポートしています。 UnityはJavaやKotlinではなくC#を使用するため、AppAuth for AndroidなどのJavaベースのOAuth SDKをそのまま使用することができません。IdentityModel.OidcClientなら使用できます。 IdentityModel.OidcClientを使えば、Google Playサービスに依存せずにUnityのAndroid向けのゲームにGoogleアカウント認証を実装できます。 リンク: https://github.com/IdentityModel/IdentityModel.OidcClient/tree/releases/2.9.x 2.1.2. Json.Net.Unity3D Json.Net.Unity3DはUnityでJSONを使うためのSDKです。IdentityModel.OidcClientではJSONを使うため、Json.Net.Unity3Dが必要です。 リンク: https://github.com/SaladLab/Json.Net.Unity3D/releases 2.1.3. unity-jar-resolver unity-jar-resolverはCustom Tabのライブラリをダウンロードするためのライブラリです。 リンク: https://github.com/googlesamples/unity-jar-resolver/tree/release/1.2.169 2.1.4. Unity3D.Authentication.Example Unity3D.Authentication.ExampleはIdentityModel.OidcClientのサンプルです。このサンプルにAndroidUnityPluginが含まれています。OAuthの認証結果は、リダイレクトを通してカスタムタブからアクティビティに戻ります。 AndroidUnityPluginはリダイレクト結果を受け取り​​Unityに返します。 リンク: https://github.com/peterhorsley/Unity3D.Authentication.Example 3. 実装方法 以下はGoogleのOAuthの実装例です。 3.1. 前準備 下記のリソースをダウンロードしておきます。 IdentityModel.OidcClient: Json.Net.Unity3D: unity-jar-resolver: Unity3D.Authentication.Example: 3.2. Custom Tabsのライブラリのインポート 3.2.1. unity-jar-resolverのexternal-dependency-manager-1.2.169.unitypackageのインポート 3.2.2. ExternalDependencies.xmlの追加 Assets\ExternalDependencyManager\EditorにExternalDependencies.xmlを追加します。 ExternalDependencies.xmlに下記のソースコードを追加します。 ExternalDependencies.xml <dependencies> <androidPackages> <repositories> <repository>https://repo.maven.apache.org/maven2</repository> </repositories> <androidPackage spec="androidx.browser:browser:1.4.0"> <androidSdkPackageIds> <androidSdkPackageId>extra-google-m2repository</androidSdkPackageId> </androidSdkPackageIds> <repositories> <repository>https://maven.google.com</repository> </repositories> </androidPackage> </androidPackages> </dependencies> androidx.browser:browserの最新バージョンはここでご確認ください。 https://developer.android.com/jetpack/androidx/releases/browser 3.2.3. Custom Tabsのライブラリのダウンロード [Asset] > [External Dependency Manager] > [Android Resolver] > [Force Resolve]を実行します。 ダウンロードが完了したら、Custom TabsのライブラリはAssets/Plugins/Andriodに保存されます。 3.3. IdentityModel.OidcClientのインポート 3.3.1. IdentityModel.OidcClientのプロジェクトのビルド 3.3.2. net452フォルダの中の全ファイルをUnityのプロジェクトのAssets\IdentityModelにコピー ただし、System.Runtime.InteropServices.RuntimeInformation.dllをコピーしません。 3.4. JsonNet.9.0.1のインポート 3.4.1. JsonNet.9.0.1.unitypackageのインポート 3.4.2. Newtonsoft.Json.dllの移動 Assets\UnityPackages\JsonNet\Newtonsoft.Json.dllをAssets\IdentityModelに移動させます。 3.4.3. link.xmlの作成 Assetsにlink.xmlを新規作成し、下記の内容を追加します。 link.xml <linker> <assembly fullname="System"> <type fullname="System.ComponentModel.TypeConverter" preserve="all"/> <type fullname="System.ComponentModel.ArrayConverter" preserve="all"/> <type fullname="System.ComponentModel.BaseNumberConverter" preserve="all"/> <type fullname="System.ComponentModel.BooleanConverter" preserve="all"/> <type fullname="System.ComponentModel.ByteConverter" preserve="all"/> <type fullname="System.ComponentModel.CharConverter" preserve="all"/> <type fullname="System.ComponentModel.CollectionConverter" preserve="all"/> <type fullname="System.ComponentModel.ComponentConverter" preserve="all"/> <type fullname="System.ComponentModel.CultureInfoConverter" preserve="all"/> <type fullname="System.ComponentModel.DateTimeConverter" preserve="all"/> <type fullname="System.ComponentModel.DecimalConverter" preserve="all"/> <type fullname="System.ComponentModel.DoubleConverter" preserve="all"/> <type fullname="System.ComponentModel.EnumConverter" preserve="all"/> <type fullname="System.ComponentModel.ExpandableObjectConverter" preserve="all"/> <type fullname="System.ComponentModel.Int16Converter" preserve="all"/> <type fullname="System.ComponentModel.Int32Converter" preserve="all"/> <type fullname="System.ComponentModel.Int64Converter" preserve="all"/> <type fullname="System.ComponentModel.NullableConverter" preserve="all"/> <type fullname="System.ComponentModel.SByteConverter" preserve="all"/> <type fullname="System.ComponentModel.SingleConverter" preserve="all"/> <type fullname="System.ComponentModel.StringConverter" preserve="all"/> <type fullname="System.ComponentModel.TimeSpanConverter" preserve="all"/> <type fullname="System.ComponentModel.UInt16Converter" preserve="all"/> <type fullname="System.ComponentModel.UInt32Converter" preserve="all"/> <type fullname="System.ComponentModel.UInt64Converter" preserve="all"/> </assembly> </linker> 3.4.4. mcs.rspの作成 Assetsにmcs.rspを新規作成し、次の内容を追加します。 -r:System.Net.Http.dll 3.5. Googleの認証画面の表示 3.5.1. 次のソースコードをUnityプロジェクトに追加 3.5.2. GoogleのOAuthの設定の追加 OAuthLoginScript.csを開き、GoogleのOAuthの設定を追加します。 Client IdはGoogle Cloud Platform > [APIとサービス] > [認証情報] > [OAuth 2.0 クライアント ID] > [クライアント ID]です。また、Client Idを作るときに、アプリケーションの種類をAndroidに設定しなければなりません。 ScopeはGoogle Cloud Platform > [APIとサービス] > [OAuth 同意画面]に設定したスコープです。 Package nameはProject Settingsに設定したパッケージ名で、Pathはなんでも大丈夫です。 3.5.3. Googleの認証画面の表示 GoogleIdLogin()を実行すれば、Googleの認証画面はCustom Tabsの中で開かれます。 3.6. AndroidUnityPluginのインポート Googleの認証結果はリダイレクトを通じて返ってくるので、Unityプロジェクトにリダイレクト結果を受け取るプラグインを追加しなければなりません。 3.6.1. AndroidUnityPluginをUnityプロジェクトにコピー Unity3D.Authentication.Example-master\AndroidUnityPluginを自分のUnityプロジェクトにコピーします。 3.6.2. Unity Editorのclasses.jarをAndroidUnityPluginにコピー C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jarをAndroidUnityPlugin/app/libsにコピーします。 3.6.3. AuthRedirectActivity.javaの編集 AndroidUnityPluginのAuthRedirectActivity.javaを開きます。 UnityPlayer.UnitySendMessageの最初のパラメータを、OAuthLoginScriptのターゲットに書き換えます。たとえば、OAuthLoginScriptのターゲットがCanvasであれば、UnityPlayer.UnitySendMessageの最初のパラメータをCanvasに書き換えます。 3.6.4. app:exportJarの実行 gradleのapp:exportJarを実行します。実行したら、Assets\Plugins\AndroidにAndroidUnityPlugin.jarが生成されます。 3.6.5. AndroidManifest.xmlの編集 Project SettingsのPlayerにあるCustom Main Manifestをチェックします。 Assets\Plugins\AndroidにあるAndroidManifest.xmlを開き、次のソースコードを追加します。 AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <activity android:name="org.identitymodel.unityclient.AuthRedirectActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="{Your package name}" /> </intent-filter> {Your package name}は自分んおアプリのパッケージ名です。 3.7. 各Tokenについて OAuthLoginScriptの中で次のメソッドを実行すれば、アクセストークン、リフレッシュトークン、IDトークンが取得できます。 _authClient.GetAccessToken() _authClient.GetRefreshToken() _authClient.GetIdToken() 3.8. ユーザー情報について OAuthLoginScriptの中で _authClient.GetPayload({field}) を実行すれば、IDトークンの中のユーザー情報が取得できます。 fieldは次のものになります。 データ field Open Id sub 姓名 name 姓 family_name 名 given_name 画像URL picture メールアドレス email 有効なメールアドレスかどうか email_verified GitHub
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Firebase Analytics実装方法

初めに 今回は、楽にAnalyticsでlogEventを実装できる様にするやり方を備忘録として書いていこうと思います 実装方法 まず、イベントを渡す用のクラスを作成します abstract class TrackingEvent( val key: String, val parameters: Map<String, Any> = emptyMap(), ) 次に、logEventを実装するためのInterfaceと本実装用のクラスを実装します class TrackingService @Inject constructor( private val firebaseAnalytics: FirebaseAnalytics ) : TrackingServiceInterface { override fun track(trackingEvent: TrackingEvent) { firebaseAnalytics.logEvent( trackingEvent.key, trackingEvent.parameters.toBundle(), ) } } // TrackingEventのパラメータをBundleに詰め替える拡張関数 fun Map<String, Any>.toBundle(): Bundle = Bundle().apply { this@toBundle.forEach { (key, value) -> when (value) { is String -> this.putString(key, value) is Int -> this.putInt(key, value) is Boolean -> this.putBoolean(key, value) else -> throw IllegalArgumentException() } } } 最後にこれらを共通して使える様にDI用のModuleを実装します // logEvent用 @Provides @Singleton fun provideEventTrackingService( impl: TrackingServiceImpl ): TrackingService = impl // firebaseAnalytics用 @Provides @Singleton fun provideFirebaseAnalytics( @ApplicationContext context: Context ): FirebaseAnalytics = FirebaseAnalytics.getInstance(context)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Android]Androidでテストフィクスチャを使う

Android Gradle Plugin 7.1.0 からテストフィクスチャがサポートされたようなので試してみました。 テストフィクスチャはテストに必要な前提条件などを設定したりするためのものです。この機能を使うことによって、テストに必要なオブジェクトの定義やユーティリティメソッドなどを提供することができ、それらを Gradle の各モジュールのテストコードで参照することが可能になります。 今回試したプロジェクトは こちら にアップしています。 ライブラリモジュールでのテストフィクスチャの設定 Android ライブラリの Gradle モジュールでテストフィクスチャを提供する方法を見ていきます。ここではこのライブラリモジュールを仮に data モジュールとします。まずはこの data モジュールの build.gradle で以下のように設定します。 data/build.gradle android { ... testFixtures { enable true } } そして、このモジュール内で src/testFixtures/java ディレクトリを作成し、この中にテストフィクスチャとして提供したいオブジェクトなどを作成します。 注意点として、今のところテストフィクスチャで提供するオブジェクトなどは Java ファイルで記述する必要があるようです。 (https://issuetracker.google.com/issues/139438142 参照) Kotlin はサポートされていないようなので注意してください。 data/src/testFixtures/java/com/github/watabee/testfixturessample/data/Simpsons.java public class Simpsons { private Simpsons() { } public static final Person HOMER = new Person("Homer", "Simpson"); } これでテストフィクスチャの作成が完了したので、これを使うための設定を行います。例えば app モジュールでこのテストフィクスチャを使ってテストを書く場合を考えます。app モジュールの build.gradle で以下の設定を記述します。 app/build.gradle dependencies { ... testImplementation testFixtures(project(':data')) } これで app モジュール内のテストコードで、先ほど作成したテストフィクスチャを使用することができます。 app/src/test/java/com/github/watabee/testfixturessample/ExampleUnitTest.kt @Test fun test_homer() { val homer = Simpsons.HOMER // data モジュールで作成したテストフィクスチャを参照. assertEquals("Homer", homer.firstName) assertEquals("Simpson", homer.lastName) } ※ Android Gradle Plugin 7.1 だと Android Studio 上でテストフィクスチャである Simpsons が参照できずにエラー表示になりましたが、実行は問題なくできました。 Android Gradle Plugin 7.2.0-beta02 ではエラー表示にならずに問題なく参照ができました。 Java モジュールでのテストフィクスチャの設定 Android のライブラリモジュールではなく、Android フレームワークを含まない Java(もしくは Kotlin)モジュールでもテストフィクスチャを提供することができます。 仮にこのモジュールを test-utils とします。まずは build.gradle で java-test-fixtures プラグインを追加します。 test-utils/build.gradle plugins { id 'kotlin' id 'java-test-fixtures' } 次に先ほどの Android ライブラリのモジュールと同じように src/testFixtures/java ディレクトリを作成し、この中にテストフィクスチャのファイルを定義します。Android ライブラリのモジュールだと Java ファイルしかサポートされていませんでしたが、私が試したところではこの場合だと Kotlin ファイルでも作成することができました。 ここでは以下のように Date を作成するためのユーティリティメソッドを定義してみます。 test-utils/src/testFixtures/java/com/github/watabee/testfixturessample/testutils/TestUtils.kt object TestUtils { fun createDate( year: Int, month: Int, day: Int, hour: Int = 0, minute: Int = 0, second: Int = 0, millisecond: Int = 0, timeZone: TimeZone = TimeZone.getDefault() ): Date { val calendar = Calendar.getInstance(timeZone) calendar.set(year, month - 1, day, hour, minute, second) calendar.set(Calendar.MILLISECOND, millisecond) return calendar.time } } そして app モジュールでこのテストフィクスチャを使用するための設定を行います。 app/build.gradle dependencies { ... testImplementation testFixtures(project(':test-utils')) } 先ほどと同様、これで app モジュール内のテストコードで作成したテストフィクスチャを使用することができます。 app/src/test/java/com/github/watabee/testfixturessample/ExampleUnitTest.kt @Test fun test_date() { val date = TestUtils.createDate(2022, 1, 1, timeZone = TimeZone.getTimeZone("Asia/Tokyo")).time assertEquals(1640962800000L, date) } その他 以下の設定を追加することで、Android Lint でテストフィクスチャのコードを無視することができるようです。 android { lint { ignoreTestFixturesSources true } } また、以下の設定を追加することによって Android リソースのファイルも参照することができるとドキュメントに記載されていました。 android { testFixtures { enable true // enable testFixtures's android resources (disabled by default) androidResources true } } src/testFixtures/res 配下に values/strings.xml を作成して試してみましたが、私が確認した限りではテストコード内でテストフィクスチャのリソースを参照することができませんでした... この辺りについて知見がある方がいらっしゃったらコメントをいただけるとありがたいです...! 参考 https://developer.android.com/studio/preview/features#test-fixtures https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures https://issuetracker.google.com/issues/139438142
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[iOS/Android]FirebaseAuthの電話番号認証(SMS)にてボット判定(reCAPTCHA 検証)をなくす方法

概要 この記事ではFirebaseAuthの電話番号認証(SMS)にてボット判定(reCAPTCHA 検証)をなくす方法についてご紹介します。 今回iOS,Androidそれぞれボット判定を消す事が出来たのでそれぞれ解説します! そもそもボット判定とは? 以下のような画面を指します。まずこのような画面が表示されたあとに このような画面が出る場合があります。 これをユーザにサインアップ、ログインしてもらう度に実施してもらうのはユーザビリティ的に微妙なので、 上記の画面を消す設定をご紹介します! iOS まずはiOSから説明していきます。 基本的には公式に書いてあるこちらの記事を参考にしてもらえれば大丈夫なのですが、こちらの記事に書かれていない設定がプラスα必要なのでそちらも合わせて解説します。 Xcodeでプロジェクトのプッシュ通知を有効にする こちらの記事の1.のステップにある通りにプロジェクトのプッシュ通知を有効にしてください。 APNs認証キーを登録する 以下の画像のようにFirebaseのコンソールからAPNs認証キーを登録してください。 Remote notificationsを有効にする 公式の記事だとAPNsを登録するまでやればOKなように書かれていたのですが、プラスで設定を追加する必要がありました…!(ここがハマりました) Background Modes -> Remote notificationsを有効にすることでボット判定が出なくなります! Android Androidは公式に書いてあるこちらの記事の通りに実装してもらえれば大丈夫です! Android DeviceCheck APIを有効にする FireBaseに紐づくGCPプロジェクトを有効にします。 有効にすると以下のように表示が変わります。 アプリのSHA-256フィンガープリントを登録する 上記の設定をすることでAndroidでもボット判定が出なくなります! 基本的には公式の通りにやれば大丈夫なのですが、 iOSのRemote notificationsの部分だけ記事を書いた当時記載がなくハマりました。 以上がiOS,Androidの設定方法の解説になります!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む