真面目なブログはこっち 👉 blog.s64.jp

Android WebViewのUserAgentいくつか

端末 / 環境 API Level バージョン Implementation User Agent
Genymotion 16 4.1.1 n/a Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Custom Phone Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Emulator 16 4.1.2 n/a Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Android SDK built for x86 Build/JB_MR1.1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Emulator 17 4.2.2 n/a Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Android SDK built for x86 Build/JB_MR1.1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Emulator 18 4.3.1 n/a Mozilla/5.0 (Linux; U; Android 4.3.1; en-us; Android SDK built for x86 Build/JB_MR2) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Emulator 19 4.4.2 n/a Mozilla/5.0 (Linux; Android 4.4.2; Android SDK built for x86 Build/KK) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36
Genymotion 19 4.4.4 n/a Mozilla/5.0 (Linux; Android 4.4.4; Custom Phone Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36
Emulator 21 5.0.2 n/a Mozilla/5.0 (Linux; Android 5.0.2; Android SDK built for x86_64 Build/LSY66K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36
Emulator 24 7.0 Chrome WebView Mozilla/5.0 (Linux; Android 7.0; Android SDK built for x86_64 Build/NYC; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.90 Mobile Safari/537.36
Emulator 24 7.0 Google WebView Mozilla/5.0 (Linux; Android 7.0; Android SDK built for x86_64 Build/NYC; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.124 Mobile Safari/537.36
Genymotion 24 7.0 AOSP WebView Mozilla/5.0 (Linux; Android 7.0; Custom Phone Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.91 Mobile Safari/537.36
Emulator 28 9 Chrome WebView Mozilla/5.0 (Linux; Android 9; Android SDK built for x86_64 Build/PSR1.180720.075; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 Mobile Safari/537.36
Emulator 28 9 Android System WebView (Google) Mozilla/5.0 (Linux; Android 9; Android SDK built for x86_64 Build/PSR1.180720.075; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 Mobile Safari/537.36
Genymotion 28 9 Android System WebView (AOSP) Mozilla/5.0 (Linux; Android 9; Custom Phone Build/PD1A.180720.031; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36

Android 4.4.x (API 19) にはiframe内anchorに挙動差異のあるバージョンが混在している

Android 4.4.2(とそれ以下)のWebView内でiframeに含まれるWebページ内のAnchorクリックをしても、ページの遷移イベントを取れない時がある。
具体的には、通常WebViewでは画面遷移時に WebViewClient#shouldOverrideUrlLoading というコールバックが叩かれるのだが、これが動かないパターンがある。

いくらか確認してみたところ、これはtarget属性によって挙動が変わっている模様。たとえば

<a href="https://example.com" target="_blank">_blank</a>

というリンクの場合、WebView内のさらにiframen内で遷移してしまう。

対し下記の場合、

<a href="https://example.com" target="_top">_top</a>

ちゃんと期待どおり WebViewClient#shouldOverrideUrlLoading が呼ばれる。

この挙動チェックはGitHubにサンプルアプリを置いた。

github.com


(Android 4.4.3環境が手元にないので)Android 4.4.4で同じ挙動を確認すると、どちらのリンクも期待どおりWebViewClient#shouldOverrideUrlLoadingが呼ばれる様になっている。

4.4.3はわからないが、少なくとも 4.4.2 と 4.4.4 の間には挙動の差異が存在する。


なお、4.4.xにおけるWebViewの挙動差異は他にも存在して、たとえばPromiseが4.4.2までは存在しないのに対し、4.4.3からは利用できたりする。

h.s64.jp

上記記事に記したとおり、内部のChromiumバージョン変更が行われており挙動にいくつかの差異が発生しているのが実態のようだ。

Android 4.4.x系 (API 19) にはPromiseが使えるバージョンと使えないバージョンが混在している

Android Studioに付属しているAndroid Virtual Device (Android Emulator) では、API 19相当の端末としてAndroid 4.4.2のエミュレータが起動する。
このエミュレータ上のWebViewでPromiseを実行すると、下記のようなエラーを確認できる。

Uncaught ReferenceError: Promise is not defined

一方Android 4.4.4を搭載した実機(や仮想マシン)では正常に実行できる。つまりPromiseが定義されている。


Android 4.4.xと呼ばれるものは複数存在している:

  • Android 4.4: API19
  • Android 4.4.1: API19
  • Android 4.4.2: API19
  • Android 4.4.3: API19
  • Android 4.4.4: API19
  • (Android 4.4W: API20)

Android 4.4ではWebView実装のChromium置き換えが含まれていて、この時導入されたのはChromium 30である。

The WebView shipped with Android 4.4 (KitKat) is based on the same code as Chrome for Android version 30. This WebView does not have full feature parity with Chrome for Android and is given the version number 30.0.0.0.

https://developer.chrome.com/multidevice/webview/overview#what_version_of_chrome_is_it_based_on_

そして4.4.3ではこれがChromium 33にアップデートされている。

The updated WebView shipped with Android 4.4.3 has the version number 33.0.0.0.

https://developer.chrome.com/multidevice/webview/overview#what_version_of_chrome_is_it_based_on_

上記はChangelogを探ると実際にAndroid 4.4.3のリリースに含まれている。

ChromiumにPromiseが実装されたのはChromium 32のときなので、Android 4.4.2までのバージョンでは利用できないことになる。

結論

  • Promiseが使えるのはAndroid 4.4.3から
  • Android 4.4.2までは使えない
  • どれもAPI 19扱いなので注意

h.s64.jp

2019年末年始もGoogle Play Storeのアプリ審査は休止しない

Google Play Storeにおける新規アプリのリリース / 既存アプリのアップデートにおける審査制度が今年から始まったけど、そういえば年末年始はどういう計画になってるんだろうと思い問い合わせをした。

質問と回答

回答がきたのでここにメモしておく。

年末および年始には審査日程に変更はございますでしょうか

年末年始もおやすみはなく、新規・既存アプリ問わず通常と変わらずに審査が実施されます。 通常も土日祝日を含めて審査は対応しております。そのため年末年始でも随時審査が終わればPlay Storeに公開・反映されます。

審査が実施される国(祝日の制定されている地域)およびタイムゾーンをご教示いただけますでしょうか

審査を担当するチームは複数の国におりますため、どちらの国のチームが対応するかは明言致しかねます。

ホリデーシーズン(たとえば12月23日〜27日)も年末年始と同様に、審査の実施に変更はないということで認識に相違ございませんでしょうか

はい。ご認識の通り、ホリデーシーズンもおやすみ等なく審査が進められますのでご安心くださいませ。

まとめ

  • Google Play Storeの審査は年末年始も含め無休
  • タイムゾーンの明言はないため、審査が実施される時間帯の保証もない
  • たぶん大晦日に出しても数日以内にストアに出る

Androidでインタレストベース広告をオプトアウトする

いわゆるlmtってやつ

Android 4.1 (API 16) 〜 Android 4.4 (API 19)

  1. アプリランチャーから「Google Settings」を起動
  2. 「Ads」をタップ
  3. 「Opt out of interest-based ads」にチェックを入れる

Android 5.0 (API 21) 〜 Android 5.1 (API 22)

  1. アプリランチャーから「Google Settings」を起動
  2. 「Ads」をタップ
  3. 「Opt out of Ads Personalization」をOnにする

Android 6 (API 23) 以降

  1. 設定を開く
  2. 「Google」というアイテムをタップ
  3. 「Ads」をタップ
  4. 「Opt out of Ads Personalization」をOnにする

Android EmulatorでAndroid 10 (API 29) のマルチディスプレイを試す手順

  1. Android Emulatorを起動する
  2. 右側バーの「...」ボタンを押す
  3. 左側メニューの「Displays」をクリック
  4. 「Add secondary display (Max 3)」とあるので追加
  5. 右下の「Apply changes」をクリック

Android 10 (API 29) 以上でFreeform windowを有効化する手順

  1. 開発者向けオプションを開く
  2. 下の方にいる「Enable freeform windows」を有効にする
  3. タスク切り替えボタンを押す
  4. 出てきたメニューの「フリーフォーム」をタップする

h.s64.jp