iOS beta4 クラッシュ修正#
前言#
iOS Beta4 にアップグレードした後、ユーザーから私たちのアプリを使用中にクラッシュするというフィードバックがありました。ログインや詳細表示を行うと、クラッシュが発生します。Bugly のデータを確認したところ、クラッシュ率が 0.02% 上昇し、指定されたクラッシュ指標を超えてしまいました。これはベータ版システムのアップグレードによるものですが、具体的な原因を特定し、できるだけ早く対応する必要があります。そこで、どの API が原因かをお伝えしますので、参考にしてください。
排查#
クラッシュは必ず発生するため、調査は非常に簡単です。iOS14 beta4 にアップグレードされたスマートフォンを用意し、再現手順を確認して具体的なクラッシュ箇所を見つけます。
私たちのアプリはSexyJsonというライブラリを使用しており、その中の SexyJsonProtocol クラスの 67 行目の sexyToValue () メソッドで AnyRandomAccessCollection を強制的にアンラップしています。以前のシステムバージョンでは、ここで返される値は null ではなかったため問題はありませんでしたが、このバージョンではこの属性が null を返すため、新しいシステムでクラッシュが発生しました。
図の位置を参照してください:
修正#
強制アンラップが原因なので、直接の修正はこの部分の強制アンラップを if let 形式に変更することです。修正後、実行すると、クラッシュは確かに解消されました。しかし、検証プロセス中に、リクエストオブジェクトをパラメータ辞書に変換するためにこれを使用しているため、ここではクラッシュしなくなりましたが、通常存在すべき値も依然として存在しません。言い換えれば、このメソッドを使用して辞書に変換するすべてのリクエストが失敗しました。。。。心配しないでください、幸いにもこの部分でエラーが直接スローされました。そうでなければ、修正が完了したと思ってそのままリリースしてしまい、サーバー側から非難されることになったでしょう。インターフェースのエラー率が非常に高いことに気づくからです。この部分の実装を詳しく分析したところ、実際には Mirror を使用してクラス内のすべての属性を取得して辞書を生成していることがわかりました。一歩一歩デバッグを進めると、Mirror クラスは正常に動作しており、mirror.children も影響を受けていないことがわかりました。しかし、AnyRandomAccessCollection (mirror.children) は空を返してしまいました。つまり、AnyRandomAccessCollection () メソッドが iOS14 beta4 で正常に動作しなくなったのです。そこで再度修正しました。
図の通り、最初の修正:
二回目の修正:
最後#
したがって、私たちのプロジェクトにおける iOS14 beta4 でのクラッシュは、SexyJson ライブラリの強制アンラップが原因ですが、真の原因は iOS14 beta4 で AnyRandomAccessCollection () メソッドが正常に動作しなくなったことです。