iOS13とiPadOSに備える（フロントエンド）

もうじきiOS13、iPadOSが一般公開されますね。
みなさんは自身のサービスで動作確認済ませてますか？

この記事では自分が観測した要注意事象と、それに対する対処を紹介します。
※ iOS13 beta8時点の情報です。

## 要注意

### プライベートモード判定の裏技が使えなくなった

プライベートモード判定しているサイトは要注意です！！

[Apple Developer Forumsにもある内容](https://forums.developer.apple.com/thread/85026)ですが、iOS11とiOS12では下記のコードでWebSQLがエラーになる場合はプライベートモードと判定することが可能でした。

```js
var isPrivate = false;
try {
  window.openDatabase(null, null, null, null);
} catch (_) {
  isPrivate = true;
}
```

しかし、Safari13ではWebSQLのサポートが終了し、プライベートモードを判定するすべがなくなりました。

ちなみに！
Safari13で上記コードがどのように動くかというと・・・

`window.openDatabase`が存在しないため常に`isPrivate = true`となります。
プレイベートモードユーザーのアクセスを制限しているようなサービスの場合、**Safari13のユーザー全てがアクセス不可となり大惨事**です。

Safari13未満だけでもプライベートモード判定をしたい場合は、今のうちに次のように書き換えましょう。


```js
var isPrivate = false;
if (window.openDatabase) {
  try {
    window.openDatabase(null, null, null, null);
  } catch (_) {
    isPrivate = true;
  }
}
```

ちなみにChromeでも判定用の裏技がありましたが、最新バージョンのChrome76で既に潰されています。
[Chromeのシークレットモード、Webサイト側での検出ができないように修正へ - Engadget 日本版](https://japanese.engadget.com/2019/02/19/chrome-web/)

## iPadOSはデフォルトのUserAgentがmacOSと同じになる

UserAgentでiOS判定などを行なっているサイトは要注意です！！

iOS Safari13には「デスクトップ用WEBサイトを表示」というオプション機能が追加されていて、iPadOSはそれがデフォルトでONになっています。
![IMG_0045.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142643/df4db7b1-2eb0-3642-3e8d-d7fc8b1b74cd.jpeg)

その結果、**SafariのUserAgentがmacOSと同じ**ものになります。

実際のUserAgent

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 
```

「デスクトップ用WEBサイトを表示」をOFFにすると、従来のiPadのUserAgentとなります。

```
Mozilla/5.0 (iPad; CPU OS 13_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1 
```

ちなみに**WebViewのUserAgentもmacOSに偽装**されています。

iPhoneも「デスクトップ用WEBサイトを表示」は使えますが、デフォルトOFFなので意図的に設定されない限り問題ありません。

対処としては、タッチイベントに対応しているか否かで判定可能です。
PC用Safariはタッチイベント非対応ですが、iOS Safariは対応しています。
[Can I use... Support tables for HTML5, CSS3, etc](https://caniuse.com/#feat=touch)

iOS判定の実装例↓

```js
if (Safari判定 && typeof document.ontouchstart !== 'undefined') {
  // Safari かつ タッチイベント対応 = iOS
}
```


### IndexedDBの保存容量に上限ができた

ブラウザゲームなどIndexedDBを活用しているサービスは要注意です（・・・滅多なさそうですが）

一般的には「SafariのWebストレージ上限は50MB」という情報が出回っていると思いますが、実際のところはIndexedDBには保存上限がありませんでした。
やろうと思えばストレージを食いつぶすまでデータ保存可能でした（これはこれでヤバイ）

Safari13ではついに上限が設定され、1GBあたりで容量エラーが返される事を確認しました。
1GBもあれば十分ですし、ユーザーにとっても安心ですね。

ただし！**リソース削除だけでは容量エラーが解消されないという怪しい挙動**になっています。
リソース削除 & Safariのキャッシュ削除 & 端末再起動 まですればエラー解消できましたが・・・
ソフトウェア側の対処としては、しっかりエラーハンドリングしつつ、容量エラーになってもサービスが継続できるよう設計するしか無いですかね。

## おまけ

個人的にSafari13で期待している事も紹介したいと思います。

### PWAのタスクキルが真っ当な動作になった

iOS12.1まで : PWAが非アクティブになるたびにセッションが切れてしまい、サービスによっては使い物にならない状態
iOS12.2から : 非アクティブでもセッションは維持できるが、タスクキルしてもセッションを切れないという予想外の挙動
iOS13から : 非アクティブでもセッションは維持できるし、タスクキルすればセッションを切れる**ネイティブアプリ同等の真っ当な挙動になった**

### PWAのカメラ対応できそうな雰囲気だった

iOS13 beta1 PWAでもカメラが使えるようなりました
iOS13 beta2 重大なバグがあったとのことでリバートされました
iOS13 beta8 カメラはまだ使えません

**対応できそうな雰囲気だった**のに！リリース版で奇跡の実装を期待！

### Pointer events 対応

マウス、タッチスクリーン、ペンなどのさまざまな入力を統合するべく策定されたポインターイベントがついにSafariに実装です:tada:

さらっと確認した感じ微妙な統合具合でしたが・・・近々↓の記事を更新したいと思います。
[PCとスマホの Pointer Events 挙動まとめ - Qiita](https://qiita.com/zprodev/items/2d7419a842eb45773510)