こんにちは。LegalscapeのSV(solution value)チームでフロントエンドを中心に開発している近藤です。
SVチームは、プロダクトを単にリリースするだけではなく、実際の運用フェーズにおいて改善や保守を継続し、ユーザーへの価値提供を止めないことをミッションとしています。
長くプロダクトを運用していると、ブラウザ側のアップデートという外部要因によって、昨日まで動いていたコードが突然動作しなくなる場面に遭遇することがあります。
先日、iOSのSafari 26.4以降において、JavaScriptのランタイムエラーによりサイトが正常に動作しない事案が発生しました。 本件はこれまで許容されていた非標準な記述(JST)が、最新のWebKitアップデートによって厳格に排除されたことで顕在化したものです。
普段の開発環境(Mac版Chrome/Safari)では再現しなかったこの事象を、どのように特定し、解決へと導いたのかを共有します。
1. 状況:特定のOS環境でのみ表面化したエラー
ユーザーから「iPhoneで画面が正常に表示されない」との報告がありました。 手元のMac版ChromeおよびSafari(バージョン26.2)で動作確認を行いましたが、エラーは確認できず正常に動作していました。
調査の結果、この差はブラウザの「見た目」の違いではなく、内部のJavaScriptエンジン(JavaScriptCore)が持つ標準仕様への準拠レベルの違いに起因していました。
2. Xcode Simulatorによる検証
特定のOSバージョンでの挙動を確認するため、Xcode付属のSimulatorを使用しました。
詳細な手順は割愛しますが、シミュレータ内のSafariで対象サイトを開き、Mac側のSafariからWebインスペクタを接続してコンソールログを確認したところ、特定の環境でのみ発生していた不具合を再現できました。
3. 原因:非標準なタイムゾーン指定(JST)の排除
コンソールを確認したところ、以下のエラーが出力されていました。
RangeError: invalid time zone: JST
原因は、日付処理においてタイムゾーンを「JST」と指定していたことでした。
Safari 26.4のリリースノートを確認すると、標準仕様(TC39)への準拠を目的として、非IANAタイムゾーン(JSTなど)の指定時にRangeErrorを投げるよう明確に仕様が変更されています。
Fixed Intl.DateTimeFormat to throw a RangeError for legacy non-IANA timezones, aligning behavior with TC39 standards. (156857252)
Chrome等の他ブラウザでは、歴史的経緯から「JST」を「Asia/Tokyo」に内部でマッピングする補完処理が継続されています。 しかし、最新のiOS版WebKitはこの補完を廃止し、仕様に忠実な挙動へと舵を切りました。これにより、これまでブラウザの互換性処理に委ねられていた非標準な記述が、仕様への厳格な準拠によってエラーとして顕在化したのが今回の事案の本質です。
4. 対策:IANA Time Zone Database形式への完全移行
修正にあたっては、略称である「JST」を完全に廃止し、IANA標準の形式(Region/City)に変更する必要があります。
// iOS Safari 26.4以降で厳格に排除される記述 new Intl.DateTimeFormat('ja-JP', { timeZone: 'JST' }); // 推奨される標準的な記述 new Intl.DateTimeFormat('ja-JP', { timeZone: 'Asia/Tokyo' });
修正後、シミュレータ上でエラーが解消され、意図した通りに動作することを確認しました。
5. まとめと今後の推奨
今回の事案から、開発において以下の徹底が必要であると再認識しました。
- 標準仕様の遵守:
IntlAPIを使用する際は、ブラウザの補完を期待せず、IANA Time Zone Database (tz database)の形式を用いるべき - シミュレータの活用: Mac版ブラウザとiOS版Safariでは、最新版のSafariのバージョンが異なる場合があり、iphoneの挙動の検証にはシミュレータが有用である
- 自動テストの役割: WebKitを対象にした自動テスト(Playwright等)をCIに組み込み、常に最新のエンジンでテストすることで、こうした仕様変更を事前に検知できそう
今後は「現状のブラウザで動くか」だけでなく、常に標準仕様に基づいた実装を徹底することで、プラットフォームのアップデートに強い堅牢なフロントエンドを目指していきます。