スマートフォンやタブレットの普及に伴って、パソコンよりもiOSやAndroid端末でウェブサービスを利用する機会が増えてきた。TypeScriptやDartのようなトランスパイル前提の開発体制であれば、クライアントの対応状況を考慮してコード生成ができるが、私のようにトランスパイルを好まない開発者や、チームではPure JSで使う機能によってはユーザー側で動作しないことがある。

対応状況に疑問がある新機能についてはCanIUseのようなサイトで調べることはできるものの、網羅できるかと言われれば難しく、実際にはユーザーからの苦情によって判明することも多い。ここでは私が経験したいくつかの問題を並べていく。

iOS 14.5未満の挙動

機能上の課題

目立った問題としては、

  • クラスのstaticフィールドが利用できない
  • クラスのプライベートフィールドが利用できない

のふたつの問題がある。必要であればクラスを定義したあとに直接代入する形で追加するか、古いプロトタイプ形式のクラス定義を採用する。プライベートフィールドはプロパティの先頭に _ (アンダースコア)を付加する等の名前マングリングを行うことでプライベート扱いにする。

class MyObjectA {
    ...
}
 
MyObjectA.MAGIC_NUMBER = 42
 
MyObjectA.factoryMethod = function (value) {
    return new MyObjectA(value * 2)
}

もしiOSアプリを開発していて、その中でWebViewを使っている場合には、特別な考慮がない限りはOS組込みのブラウザエンジンを利用するため、同じ影響を受ける。

影響する端末

iOS14.5は2021年4月のリリースで、本記事執筆時の2025年からすれば、古すぎるバージョンとも言い切れない。近年物価高やiPhone本体の値上がりが背景にあり、バージョンによる足切りもあるため、JavaScriptの要件を引き上げることはユーザーに端末の買い替えを要求することにもなる。

しかし、iOS14にアップグレードできない端末は、近年のアプリケーションの利用に耐えられないとも考えられるし、特に断りがない限りは最新バージョンの利用を想定しているサービスが大多数ではあるので、足切りもひとつの選択である。ただ、ユーザー層によっては下手するとIT介護になりかねないので慎重に選択すること。判断にはiOSのバージョンと対応端末の比較表も確認されたい。