В iOS существует множество библиотек отчетов об ошибках iOS, включая TestFlight и HockeyApp. Если вы не хотите зависеть от служб, вы все равно можете использовать библиотеки, такие как PLCrashReporter. Связывание этих библиотек довольно тривиально, потому что их открытый API обычно состоит из нескольких классов с несколькими методами инициализации.
Однако при попытке использовать TestFlight, а затем и HockeyApp в нашем приложении, наше приложение стало случайно разбиваться. Оказывается, это известная проблема сообщила несколько раз, но Xamarin не предупреждает об этом, он относительно неясен, и мы нашли это трудным путем.
Мы узнали, что все репортеры Crash iOS не позволяют Mono перехватывать нулевые ссылочные исключения:
try {
object o = null;
o.GetHashCode ();
} catch {
// Catch block isn't called with crash reporting enabled.
// Instead, the app will crash.
}
Почему это происходит? Цитата Rolf, разработчик Xamarin,
Исключение с нулевой ссылкой фактически является сигналом SIGSEGV. Обычно mono runtime обрабатывает это и переводит его в исключение с нулевой ссылкой, позволяя продолжить выполнение. Проблема в том, что сигналы SIGSEGV являются очень плохо в приложениях ObjC (и когда это происходит за пределами управляемого кода), поэтому любое решение для отчетов о сбоях сообщит об этом как о сбое (и убьет приложение) - это происходит до того, как MonoTouch получит возможность обрабатывать SIGSEGV, так что есть ничего MonoTouch не может сделать с этим.
Я уверен, что многие используют TestFlight в приложениях MonoTouch, не зная, что это приводит к сбоям.
Разве это не иронично?
Как вы создаете библиотеки отчетов о сбоях, не разбивайте приложения MonoTouch?