Гибридное мобильное приложение NativeScript: отслеживание / сбор сбоев

Я создаю мобильное приложение NativeScript и, помимо прочего, собираю данные для аналитических целей, мне нужно фиксировать «сбои приложения», возможно, с ошибками / причинами сбоя.

Я наткнулся на этот пост SO, но там он был в ответе на вопрос о том, как не допустить сбоя приложения. Было предложено поймать события сбоя:

var application = require("application");

application.on(application.uncaughtErrorEvent, function (args) {
    if (args.android) {
        // For Android applications, args.android is an NativeScriptError.
        console.log("NativeScriptError: " + args.android);
    } else if (args.ios) {
        // For iOS applications, args.ios is NativeScriptError.
        console.log("NativeScriptError: " + args.ios);
    }
});

Если я буду придерживаться вышеизложенного, у меня возникнут следующие вопросы. Был бы признателен, если бы кто-нибудь мог подтвердить, означает ли это, что каждый раз, когда приложение выходит из строя, оно будет генерировать это application.uncaughtErrorEvent событие? Могу ли я на это положиться? Если это правда, то, возможно, я смогу выполнить REST-вызов на свой сервер и сохранить дату, время и все, что находится в args.android или args.ios.

Если приведенный выше способ не является правильным, может ли кто-нибудь помочь мне, как это сделать?

Любая помощь высоко ценится. Спасибо!


comment
github.com/danielgek/nativescript-sentry Sentry хорошо работает для этого, есть несколько других журналов параметры для nativescript, которые обертывают собственные SDK. Я думаю, что кто-то опубликовал плагин Fabric, не уверен. Лично я использую sentry в нескольких проектах, и он работает очень хорошо, также как и хороший бесплатный уровень.   -  person Brad Martin    schedule 08.05.2018
comment
Спасибо за ответ @BradMartin, оценил. Я проверю эту ссылку на часовых. Спасибо еще раз! Изменить Я обновил свой вопрос тем, что нашел. Что вы думаете об этом?   -  person Gauzy    schedule 08.05.2018


Ответы (1)


application.onUncaughtError будет поражен, вероятно, в 95-98% случаев во время сбоя; это довольно надежно. Я видел, как приложение вылетало без какого-либо уведомления, оно просто выходит из строя, но я не уверен, что какая-либо система отчетов сможет справиться с этим.

Как я это делаю, при запуске приложения я регистрирую пару вещей:

  1. Я создаю global.error функцию; это используется для чего-либо (например, try / catch, обещание / catch), которое должно отправлять ошибки для удаленной регистрации. Так что где угодно в моей кодовой базе я могу сделать global.error(theError);, и это будет обработано; таким образом, мне НЕ нужно беспокоиться о попытках загрузить или потребовать что-то во время ошибки, так как это может вызвать другие ошибки.
  2. Я использую событие onUncaughtError, чтобы перехватить все, что обычно не перехватывается, а затем уведомляю пользователя о возникновении ошибки и выхожу из приложения. (в этом случае пытаться восстановить не рекомендуется, так как вы не знаете, откуда возникла ошибка ...)
  3. Если я использую рабочий поток, при запуске рабочего я регистрирую worker.onerror для пересылки его данных в основные потоки global.error функцию И у меня есть конкретное сообщение от рабочей версии global.error, которое отправляет ошибку обратно в основной поток. Таким образом, если сам рабочий вызывает global.error, это сообщение передается обратно в основной поток, а затем в global.error в основном потоке, который обрабатывает все правильно.

Этот метод позволяет мне улавливать практически все возможные ошибки. И основная global.error функция, и onUncaughtError используют созданную мной простую библиотеку отчетов, которая отправляет все данные обратно на один из моих серверов, ЕСЛИ устройство подключено к сети. Если устройство находится в автономном режиме, оно может дополнительно сохранить данные в файл отчета для загрузки позже; или просто проигнорируйте это.

В нем также есть проверки безопасности, чтобы убедиться, что ошибка не является сетевой ошибкой (мы не хотим, чтобы отчет об ошибке переходил в цикл, т.е. попытка сообщить об ошибке вызывает ошибку, которая затем пытается сообщить об ошибке; поэтому в событие это определенный тип сетевой ошибки; он проигнорирует их.)

person Nathanael    schedule 10.05.2018
comment
Натанаэль - спасибо, что нашли время, чтобы отложить подход. Высоко оценен! Я действительно думал об этом, но я думал, что это будет считаться старым способом решения этой проблемы. [Хороший улов с сетевой ошибкой, мне это не пришло. Я бы сделал это, если бы застрял в этой петле. :)] Я думал, что у NativeScript есть что-нибудь (плагин и т. Д.) Для этого. Я новичок в NativeScript и хотел проверить, чем занимается сообщество. Еще раз спасибо за подробный ответ, очень признателен. - person Gauzy; 11.05.2018
comment
Есть несколько плагинов, которые довольно легко справляются с некоторыми из них; но они созданы вокруг услуг. Я понял, что вы хотите отправить информацию на свои собственные серверы; так что в этом случае проще создать собственный плагин для этого. Вам нужно только привязать к функции onUncaughtError и worker.onerror (если вы используете worker). - person Nathanael; 12.05.2018
comment
Натанаэль - стоимость определенно будет иметь значение, но я думаю, что я открыт для плагинов, которые предоставляют эту функциональность, чтобы мы не прекращали создавать эти данные и управлять ими. Сказав это, я думаю, что эта функциональность реализована не так, как я пытаюсь, и больше всего нравится, что это делается дома. В противном случае мы бы уже получили ответы. :) Еще раз спасибо за вашу любезную помощь, очень признателен. Отмечу ваш как ответ. - person Gauzy; 18.05.2018
comment
@Nathanael, где вы помещаете эту логику обработки ошибок? Внутри конструктора главного app.component? Кроме того, мне интересно, как я могу проверить, что это работает локально. Есть ли хороший способ вызвать сбой вручную? Это может быть хорошим дополнением к вашему ответу. Спасибо! - person Corey Cole; 23.08.2018
comment
Я узнал, что application.onUncaughtError не вызывается, когда я пытаюсь вызвать несуществующую функцию. Я получаю сообщение об ошибке только в консоли отладки ERROR TypeError: _co.login2 is not a function. Это известная отслеживаемая проблема здесь. Как я могу зафиксировать такую ​​ошибку, чтобы отправить ее на свой сервер? - person Corey Cole; 25.08.2018
comment
Во-первых, у меня есть отдельный файл, который мне нужен в основном файле app.js, который устанавливает информацию об ошибках. Второй элемент, onUncaughtError должен поймать его, если для параметра discardUncaughtJsExceptions установлено значение true. (См .: мой блог fluentreports.com/blog/?p=581) - person Nathanael; 26.08.2018