最近Xamarin.iOSアプリでデバッグビルドではなんともないのにリリースビルドだけ処理が止まったりUIが更新されない不具合に遭遇したので、その覚書です。
デバッグの有効化
なにはともあれ、デバッグできるようにする必要があります。
Visual Studio でプロジェクト設定を開いて、以下の2箇所を設定しましょう。
- コンパイラ > デバッグ情報のプルダウンを「すべて」に変更する。
- ビルド > iOSデバッグ > デバッグを有効にするのチェックをONにする。
リンカーによる削除
Xamarinに慣れている人には周知のことですが、android, iOSのリンカーは最適化のために特定のクラスやメソッドを削除します。
外部APIを呼び出して、JSON.NET でデシリアライズしているようなケースではここを疑いましょう。対策は以下を参照。
https://xamarinhelp.com/xamarin-linker/
非同期処理の問題
非同期処理はデバッグとリリースで差が出やすいものの一つです。
Xamarin固有の問題では、UIスレッドで重い仕事をしてしまっている、バックグラウンド化しているが、更新通知を大量に送ってしまい、処理が詰まっているなどが考えられます。
Task.Run/TaskFactory.StartNew および InvokeOnMainThread/ Activity. RunOnUiThread / Device.BeginInvokeOnMainThread を呼んでいるところをシンプルにして原因を特定しましょう。
ライブラリ固有の問題
SQLite
上と関連しますが、SQLite.iOSのネイティブバイナリが一部スレッドセーフではないようで、スレッド周りの挙動が変わるといきなりおかしくなることがあります。
SQLiteConnectionを開くときに SQLiteOpenFlag.FULL_MUTEX フラグを設定しましょう。