Лучшая практика для представления внутренней ошибки приложения пользователю? - PullRequest
0 голосов
/ 19 марта 2020

Я использую оператор guard и fatalError() в своем приложении, чтобы убедиться, что данные находятся в согласованном состоянии. Они помогают выявлять ошибки на этапе разработки. Сейчас я нахожусь на поздней стадии проекта и начинаю думать о том, как справляться с этими fatalError() вызовами в сборке релиза.

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

1) Не звоните fatalError(). Выкинь ошибку вместо. Пусть код верхнего уровня обрабатывает ошибку (например, показывает предупреждение). Проблема с этим подходом заключается в том, что требуется изменить многие функции, чтобы они стали «бросаемыми», что, на мой взгляд, неудобно.

2) Второй подход заключается в том, что из того, что я прочитал в net, возможно для кода создать оповещение без доступа к текущему представлению контроллера на экране. Хитрость в том, чтобы создать новое окно. Я еще не исследовал детали.

Меня беспокоит то, что я думаю, что оба подхода имеют одно и то же внутреннее ограничение и применимы не во всех ситуациях. Например, предположим, что в методе делегата источника данных UITableViewControler что-то идет не так, работает ли он для представления предупреждения из метода делегата? Я сомневаюсь в этом.

Так что мне интересно, какова обычная практика - предоставлять пользователю сообщение о фатальной ошибке? Спасибо за любые предложения.

1 Ответ

1 голос
/ 09 мая 2020
  • аналогично созданию окна, есть способ получить 'currentViewController', вы можете использовать его для отображения предупреждений в любом месте.
{
   let view = UIViewController.current.view  
   Alert.show(on: view, message: errorMsg)
  //or just: Alert.show(error), handle it in Alert class
}

extension UIViewController {
    class func current(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return current(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            return current(base: tab.selectedViewController)
        }
        if let presented = base?.presentedViewController {
            return current(base: presented)
        }
        return base
    }
}
  • для UITableView / UIScrollView / UICollectionView, вы можете использовать метод swizzle во время выполнения для добавления изображения-заполнителя, когда нет данных или произошла ошибка для всех представлений. например, EmptyDataSet
  • записывает ошибки и сохраняет журнал в локальном файле, при необходимости загружает его на свой сервер, анализирует их и помогает пользователям решить проблему.
...