昨日からiOSのアップデートにより一部ロジックが世界的におかしくなっているようです。昨日確認した際、iPhone11,iPhone15Pro,iPadProでは問題はありませんでしたが、なぜかiPhone16で発生しております。これに対応すべく4・20 12時にそれらの機能を使用せず応急的に他の方法で画面遷移をする方法に変更してAppleStoreに申請いたしました。アメリカで審査されるため、日本だと0時くらいに申請が通過しアップデートが配布開始されます。
追記:多くのアップデート申請がされているようで審査すら開始されておりません。有名なアプリからアップデートは入っているようです。(4/21 07:00)
不具合具体例
NSManagedObjectContext(iCloud)を利用したViewからのNavigationLinkでの遷移で一部CPUを搭載したデバイスで世界的不具合。多くの旧型CPUの場合は自力で回避している模様。CPUが170%となりスレッドオーバーを起こしメインスレッドからはみ出した処理をサブスレッド処理しだし、スレッド同士でピークし合ってメモリリーク。コードの不具合ではなくCPU(デバイス側)のエラーであるため、クラッシュレポート取得をAppStoreでもFireBaseでも取得できない状況。
NavigationLinkを削除、シートViewに緊急変更。
現在もAppleのスレッドにて回避方法の議論が進んでいるが対策されていない模様
おそらくiOS17でフォローが終了したデバイスでも多くの報告があることから、NavigationLinkの仕様が急に変更になった可能性あり。NavigationLinkがiOSでの脆弱性だった可能性があり。元々はNavigationLinkの先のNavigationLinkは初期化の必要がないと初期化はされず、先行構築で終わる
追記
NSManagedObjectContextを利用してList表示をしてそのアイテムをタップで遷移する時、タップされた引数が次のViewに渡される。子Viewで(NavigationLink(destination: 遷移先の名前(遷移元(子)の引数名: 遷移先(孫)で使う引数名)) を使い引数を継承した場合、その子ViewにあるNavigationLinkの先、つまり孫ViewがNavigationLinkを持っている場合、孫のNavigationLinkの初期化を待機開始。ここで、メモリリークが起きるので、待機させない(初期化させない)ためにシートViewにすることで引数を継承しても問題が発生しなくなる。
わかりやすくいうと、車にキーをさして、エンジンを始動させ、ドライブに入れても車が進まない。と照らし合わせると、エラーやメモリリークがドライブに入れた時に発覚するが、実は車にキーをさした段階、2コ前に発生しているから、デバイスもFireBaseもXCodeもエラーを特定できない状況。本来明確なエラーの場合はデバイスで自動補正をしてクラッシュレポートをAppleと開発者と Google(FireBase)に送信するが、デバイスすらエラーに気づいてないため本来起こらない「フリーズ」が発生する。
Instrumentsというリリース前に起動させてメモリの動きを見るソフトでも以前は問題なかったかが最新iOSに上がった途端メモリリークが発生し出した。そこにはUIの描写で問題発生と表示される。旧型デバイスで起動させると、問題なく動くため、新型デバイスと比較して、何かの初期化が走っているのがわかったのでnavigationLinkの問題を検索すると報告が上がっていた。これにたどり着くまでに12時間くらいかかったっwなぜなら今まで一部新型で動作せず旧型なら動作するなんてそんな意味がわからない不具合は知らないから。今までならPro版なら動作するけどMaxや通常版では動作しないは普通だったが、今回は16proで発生するのにiPhone11だと発生しないという謎のエラーだった
コメント