20210907のAndroidに関する記事は5件です。

API30対応でcookie認証が通らなくなった

背景 2021年11月以降、AndroidアプリのAPIレベルを30以上に対応させる必要があります。 漏れなく対応に追われていたのですが、APIレベル29から30に上げたとたん、アプリの認証処理が失敗するようになったのでその調査の備忘録です。 調査 認証系なのでcookie周りが怪しい…。 取り敢えずAndroid developerの変更内容を読んでいたのですが、cookie周りの取り回しが変更されたとかは見つかりませんでした。 Android 10(API レベル 29)から Android 11(API レベル 30)に移行する 仕方なしにアプリの実装を追いかけて、API29とAPI30で何が違うのか追っかけてみたところ CookieManagerのsetCookieにてsecure属性が付与された項目がAPI30ではrequestに乗っかっていませんでした。 なじぇ…と思いながらドキュメントを見に行くと、何か気になることが書いてありました。 Note: if specifying a value containing the "Secure" attribute, url must use the "https://" scheme. これじゃん。 Cookieを設定するURLの先頭に"https://"を設定するようにすることで無事requestにsecure属性の値が設定されるようになりました。 結論 API30に上げると、cookieにsecure属性の項目値が設定されなくなった。 CookieManagerのsetCookieにてsecure属性が設定される項目が、"https://"をつけることで対応できた。 というかなぜAPI29までは動いていて、何でAPI30からいきなり動かなくなったのでしょうか・・・。 過去どこかで宣言されていたのかな。現在調査中です。 もし原因や経緯をご存じの方がいれば教えて頂けますと喜びます。 本記事が同じような現象で困っている方の参考になれば幸いです。 2021年9月8日追記 下記ブログ内で、以下のような説明が引用されていた。 SameSite属性どころか、HTTP自体がダメになってた件(Cookie) Chrome 80が密かに呼び寄せる地獄 ~ SameSite属性のデフォルト変更を調べてみた - Qiita https://qiita.com/ahera/items/0c8276da6b0bed2b580c#none 「【追記】なおChrome 80以降でSecure属性を付けずSameSite=Noneを指定した場合、set-cookie自体が無効になります。」 あとこっちか。 Chrome Platform Status Deprecate and remove the use of cookies with the SameSite=None attribute but without the Secure attribute. Any cookie that requests SameSite=None but is not marked Secure will be rejected. この辺の現象に近いような気がします。 が、API29→API30に変えただけで、「SameSite=None」が指定されるようになるのか?とかは相変わらず不明です。 Android12のAPI31についての変更点のドキュメントだとSameSiteについてちょっと触れられているけど…。 引き続き調査中。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity] Android NativePluginの実装の仕方

はじめに Unityで使用するNativePluginのタスクがあったのでとりあえずテストでサンプルを作成してみました。 ここでは、UnityでAndroidのNativeアラートを表示させるまでの忘却録です。 準備 macOS Catalina: 10.15.7 Unity 2018.4.19f Android Studio 4.0.1 Android Studioでプロジェクトを作成 今回は「AndroidStudio4.0.1」で作成していきます。 「Select a Project Template」で「No Activity」を選択 Projectの概要を決めていきます。「Package name」はサンプルなので適当です。言語は「Java」を選択しました。 ライブラリ用モジュールを作成する 「File」→「New」→「NewModule」を選択 「Select a Module Type」で「Android Library」を選択 「Module name」もサンプルなので適当にそのままにしました。 左上にあるプルダウンから「Android」を選択しておきます。 「mylibrary」が出来てます。 Plugin開発には不必要なAppディレクトリを削除する 「File」→「Project Structure」を選択 左サイドバーの「Modules」を選択して「app」を選択。赤丸の「-」で削除します。 「Remove Module」で削除確認されますが、「Yes」です。 Unity機能をAndroidから使用する準備 Android側からUnityのクラスを認識するために「jar」ファイルをインポートする必要があります。 Android 用に開発されたプラグインを使用して、Unity の外部で作成された Java や C++ コードを C# スクリプトから呼び出しすることができます。これにより、他の方法では Unity で使用できない OS の呼び出しやサードパーティのコードライブラリなどの機能にアクセスできます。Unity によるプラグインの使用方法の詳細については、プラグイン のドキュメントを参照してください。 以下のページでは、Android プロジェクトで使用する独自のプラグインを作成する手順を説明します。これらのページの情報は、Unity のネイティブプラグインの作成方法をすでに理解していることを前提としています。ネイティブプラグインとその使用の詳細については、ネイティブプラグイン のドキュメントを参照してください。 https://docs.unity3d.com/ja/current/Manual/PluginsForAndroid.html 場所はUnityがインストールされてるディレクトリにあります。 ファイル名: classes.jar 下記は、UnityHubを使用していた場合の格納場所です。 /Applications/Unity/Hub/Editor/2018.4.19f1/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar Androidプロジェクトの「libs」ディレクトリへ「classes.jar」をコピーします。 Gradleの設定からclasses.jarを外す Gradleの設定からclasses.jarを外さないと、出力されるaarファイルに含まれてしまいUnityのビルド時にエラーが出てしまうので外さないといけません。ということで、「build.gradle」を編集します。 下記、箇所を変更。また、追記します。 build.gradle // 26行目 NG: implementation fileTree(dir: "libs", include: ["*.jar"]) ↓ OK: compileOnly fileTree(dir: 'libs', include: ['classes.jar']) // 追記箇所 android.libraryVariants.all{ variant-> variant.outputs.each{output-> output.packageLibrary.exclude('libs/classes.jar') } } 完成形は下記。右上に出ている「SyncNow」を押下して完了 Unityで呼び出すNativeAlertDialogのサンプル 該当箇所からClassを作成します。 該当コード AndroidNativeDialog.java package jp.co.test.mylibrary; import android.app.AlertDialog; import android.content.Context; public class AndroidNativeDialog { static public void showNativeDialog(Context context, String title, String message) { new AlertDialog.Builder(context) .setTitle(title) .setMessage(message) .setPositiveButton("はい", null) .setNegativeButton("いいえ", null) .show(); } } ビルド 画面右側に「Gradle」のアイコンがありますので、設定画面を表示します。 「mylibrary」→「Tasks」→「build」→「assemble」をダブルクリックでビルドが始まります。 成功すると「BUILD SUCCESSFUL in 時間」が表示されます。 aarの場所 左上から「Project」を選択し、「mylibrary」→「build」→「outputs」→「aar」の中にあります。 該当のファイルから「Reveal in Finder」でFinderが開いてくれます。 aarをUnityプロジェクトへ配置する UnityプロジェクトをAndroidにSwitchPlatformします。 該当のaarは「Assets」→「Plugins」→「Android」のディレクトリを無ければ作成して配置します。 Unity側の対応(呼び出し方法)サンプル 飛び出す際に「AndroidJavaClass」、「AndroidJavaObject」を使います。 サンプルでは、ShowNativeDialog()をButtonEventで使用しました。 ButtonView.cs using UnityEngine; public class ButtonView : MonoBehaviour { public void ShowNativeDialog() { #if UNITY_ANDROID AndroidJavaClass nativeDialog = new AndroidJavaClass ("jp.co.test.mylibrary.AndroidNativeDialog"); AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); context.Call ("runOnUiThread", new AndroidJavaRunnable(() => { nativeDialog.CallStatic ( "showNativeDialog", context, "タイトル", "本文テキスト" ); })); #elif UNITY_EDITOR UnityEngine.Debug.Log("On Click!"); #endif } } サンプルフォルダ構成 Unity配置 ボタンを押下するとアラートダイヤログを表示 ビルドして実機で確認します。 成果物
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】AndroidアプリをGooglePlayに公開する

Unity 下記項目を設定 会社名 プロダクト名 アイコン パッケージ名 ヴァージョン ビルド番号 ARM64にチェック キーストアを登録 Build App Bundleにチェックを入れてビルド GooglePlayConsole アカウントを作成 右上のボタンからアプリを作成 ダッシュボードの指示に従い必要な情報を登録 審査に提出
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【androidアプリ】リリース直前に気を付けるべきだった4つのポイント

概要 Androidアプリ ツケ台帳 のプログラミングが完了した後、リリースする直前にいくつか調整したので備忘録的にメモしてみます。 アプリの解説→こちら 確認事項 起動速度が遅い プログラミング完了直後は起動時間がエミュレータで7秒近くありました。 さすがにこれは長いと思いいろいろな方法を試したのですが、一番効果があったのは ・gradle(app)内で余計なものをimplementしていないかを確認し、削除する でした。 初のアプリ開発でいろいろ試しながらやっていたというのもありますが、これで5秒以下まで起動時間が短縮できました。 また、最後にこういう見直しができるようにしっかりコメントを書いておくことも重要かと思います。 テーマの変更 個別で変更するのは効率が悪いので、themes.xmlでまとめて最後に変えます。 themes.xml <resources xmlns:tools="http://schemas.android.com/tools"> <style name="Theme.Hoge" parent="Theme.MaterialComponents.DayNight"> // ここを変更 </style> </resources> アイコンの下に表示されるアプリ名 ホーム画面のアイコンの下に表示されるアプリ名はAndroidManifest.xmlのMainActivity内android:labelを参照しているっぽいです。 AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sample.hoge"> <application android:label="@string/app_name" //ここがアイコン下の表示名 </application> </manifest> 難読化 Firebaseを使う場合の注意点 アプリのサイズが大きい場合、「難読化」という方法でサイズを小さくすることができます。 ツケ台帳 ではFirebase Realtime Databaseを使用していますが、その場合そのまま難読化することはできずエラーとなるようです。 今回はサイズがもともと小さい(数Mb)ので難読化せずに妥協しました。が、工夫すればRealtimeDatabaseも難読化できるようです。もっと大きなアプリ作成したら試してみようかと思います。 *難読化とは:複数回登場するスクリプトを別の文字列に置き換えることで軽量化している、と理解してます。置き換えた文字列同士の対応はmapping.txtとして出力されるため、これも一緒にストアにアップロードする必要があります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【ReactNative】アプリのプロフィール画像を変えるときに下から出てくる選択欄(アクションシートというらしい)を作ってみる

画像のようなタップしたときに下から出てくる選択欄(アクションシート)を実装していきます。 この機能はよくアプリのアイコンや写真を設定する時に使われていると思います。 実際にはiPhoneのappleIDのアイコンやLINEのトップ画を設定するときに使われています プロジェクト作成、必要なライブラリをインストール まずはReact-Nativeプロジェクトを作成します。 ちなみにExpoではなく、素のReactNativeで作っていきます。 作成方法はドキュメントなどを参考に進めてください。 次に必要なライブラリをインストールします yarnの場合yarn add react-native-cross-actionsheet npmの場合npm install react-native-cross-actionsheet iOSだけの実装ならReactNativeの標準に入ってるのでインストールする必要はないです 実はReactNativeの公式にActionSheetIOSという同じようなUIを作れるものがありますが、それだとiOSにしか実装できません。 iOSだけならそれでもいいですが、Androidも作る予定の人はライブラリをインストールしてください。 作り方自体はほとんど一緒です。 実装 今回はアクションシート用のコンポーネントを作成して、それをApp.jsから呼び出しているかたちです import React from 'react'; import { StyleSheet, View, } from 'react-native'; import { ActionSheetPage } from './src/components/ActionSheet'; const App = () => { return ( <View style={styles.screen}> <ActionSheetPage/> </View> ); }; const styles = StyleSheet.create({ screen: { flex:1, justifyContent:'center', alignItems:'center' } }); export default App; 次にアクションシートを実装するコンポーネントを作成していきます。 import React from 'react'; import {TouchableOpacity, View} from 'react-native'; import Icon from 'react-native-vector-icons/FontAwesome'; export const ActionSheetPage = () => { return ( <View> <TouchableOpacity> <View> <Icon name="user-o" size={70} /> </View> </TouchableOpacity> </View> ); }; ベースを作り、TouchableOpacityでタップした時の挙動にアクションシートを使っていきます import React from 'react'; import {StyleSheet, TouchableOpacity, View} from 'react-native'; import {ActionSheet} from 'react-native-cross-actionsheet'; import Icon from 'react-native-vector-icons/FontAwesome'; export const ActionSheetPage = () => { const onPressAction = () => { return ActionSheet.options({ options: [ {text: '写真を撮る', onPress: () => console.log('create')}, {text: '写真を選択', onPress: () => console.log('update')}, ], cancel: {text: 'キャンセル'}, }); }; return ( <View> <TouchableOpacity onPress={onPressAction}> <View style={styles.iconButton}> <Icon style={styles.icon} name="user-o" size={70} /> </View> </TouchableOpacity> </View> ); }; const styles = StyleSheet.create({ iconButton: { borderWidth: 1, width: 100, height: 100, borderRadius: 100, marginLeft: 'auto', marginRight: 'auto', }, icon: { marginLeft: 'auto', marginRight: 'auto', marginTop: 'auto', marginBottom: 'auto', }, }); options内のtextに入れたい文字を入れ、onPressにタップした時の挙動を実装すれば完成です ちなみにAndoroidだとこんな感じ 意外と簡単に実装できます!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む