先日、弊社のクライアント様より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