Flutter アプリの不具合解析時に発生したエラーまとめ

 先日、弊社のクライアント様よりFlutterアプリの不具合解析、調査依頼を頂きました。その際にビルド、起動周りで特異なエラーが出ていたためこちらに纏めておきます。

SharedPreferenceの問題

 まずXCodeでビルドしたアプリを起動すると

MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences

が表示されます。

 どうやらPluginで実装された Unshared Preference の、存在しないgetAll にアクセスしようとしてExceptionとなっているようです。以下のような観点で作業を行いました。

Pluginが正しく導入されているか

 検索すると、解決方法としてこれが一番多く出てきました。
pubspec.yaml に

dependencies:
  shared_preferences  ^0.5.12

などの記載が正しくなされているか。
また、dart側のコードに

import 'package:shared_preferences/shared_preferences.dart';

が存在するか。
その状態で

flutter clean
flutter pub get
flutter build ios

を試すというもの。
また、ものによってはflutterのバージョンそのものを変える必要があるので

flutter version
flutter downgrade
flutter channel

などを駆使しろ、というページもあります。
今回はいずれも効果なしでした。

SharedPreference のクリーンアップ

 これは2番目くらいに多い解決策で

SharedPreferences.setMockInitialValues({});

を runApp(MyApp()); の前に挿入するというものです。不思議なことにこれでも動作するのですが、このメソッドは公式ドキュメントに書かれているように開発用に取り急ぎのSharedPreferenceを設定するものですので、起動のたびにSharedPreferenceがクリアされることとなり、SharedPreferenceを使用したアプリはまともに動作しなくなります。

Plugin が XCode 側から登録されてない

 原因はまさかのこれでした。AppDelegateクラスの初期化(applicationメソッド)の先頭に下記のコードが挿入されていませんでした。

GeneratedPluginRegistrant.register(with: self) 

おまけ

 Flutter で作成したアプリが iOS14 でクラッシュしてしまう問題。アプリを起動すると、デバッグログに io.flutter.1.raster crashed という情報とスレッド情報のダンプが表示されます。こちらは iOS14.0 または iOS14.1 でのみ発生し、iOS14.2 では正常に動作するという情報があります。

 公式の Github でもようやく取り上げられ始めた問題ですが、リリース計画にも影響が出てしまうような話ですので、早めの解決が待たれます。
https://github.com/flutter/flutter/issues/71121