Я пытаюсь написать небольшой пример приложения Cordova IOS. Одним из моих требований является предоставление кнопки / ссылки, позволяющей пользователю аварийно завершить работу приложения.

Я попытался вызвать исключение в CDVUIWebViewNavigationDelegate.m следующим образом,

- (BOOL)webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{
 NSURL* url = [request URL];
if([url.path containsString:@"CRASH"])
{
    NSLog(@"User crash bookmart with NSException");
    NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
    NSDate *current = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; // Set date and time styles
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
    NSString *currentTime = [dateFormatter stringFromDate:current];
    [userInfo setObject:@"Crash Time" forKey:currentTime];
    NSException *ex = [[NSException alloc] initWithName:@"BookmartCrashException" reason:@"User crashed bookmart!" userInfo:userInfo];
    [ex raise];
}
...
}

Но когда я попытался, я увидел следующий журнал,

2017-09-04 17: 09: 57.148 HRent [96124: 12077045] Пользовательский сбой bookmart с NSException 2017-09-04 17: 09: 57.149 HRent [96124: 12077045] *** WebKit отбросил невыполненное исключение в> webView: definePolicyForNavigationAction: запрос: фрейм: SolutionListener: делегат: пользователь потерпел крах книжный магазин!

Исключение было отклонено, и приложение не аварийно завершилось :(

Есть ли какой-нибудь другой способ точно сломать приложение? Или с некоторой конфигурацией я могу отключить WebKit, чтобы отменить такое исключение?

Большое спасибо за ваши ответы!

С уважением Рэйчел

2
rachelnino 4 Сен 2017 в 12:14

4 ответа

Лучший ответ

Попробуйте запустить исключение с отправкой в основном потоке:

dispatch_async(dispatch_get_main_queue(), ^{
    NSInteger asd = 5 / 0;    // Simple division by 0
});

Если это работает, попробуйте подход NSException, чтобы получить всю эту дополнительную информацию.

0
Shebuka 4 Сен 2017 в 09:37

Вы пробовали abort () как в примере реализации основных данных по умолчанию? Это приводит к тому, что приложение создает журнал сбоев и завершает работу.

0
Michael 4 Сен 2017 в 09:44

Плагин hockeyapp предоставляет функциональность, которая позволяет вам аварийно завершить работу приложения. Вы можете использовать это как временное решение, пока не выясните проблему.

hockeyapp.forceCrash():void

Проверьте репозиторий https://github.com/Microsoft/cordova-plugin-hockeyapp

0
Will 4 Сен 2017 в 17:07

Спасибо всем. Я попробовал все предложения, кроме плагина, предложенного Уиллом. В целом, есть 2 способа сбить приложение.

  1. Как предложил Микаэль, используйте abort (), чтобы завершить работу приложения.

Вот кусок кода, который я использовал,

- (BOOL)webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:
(UIWebViewNavigationType)navigationType
{
   NSURL* url = [request URL];
   if([url.path containsString:@"CRASH"])
   {
     abort();
   }
   ...
 } 
  1. Как рекомендует Шебука, отправьте исключение в основной поток. Хитрость здесь в том, что мы не можем использовать доступ к массиву nil или делению 0, чтобы вызвать это исключение, но я должен написать, что я публикую в своем вопросе. В противном случае приложение не аварийно завершит работу и журнал не отобразится.

Вот фрагмент кода, который я использовал,

- (BOOL)webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:
(UIWebViewNavigationType)navigationType
{
NSURL* url = [request URL];
if([url.path containsString:@"CRASH"])
{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"User crash bookmart with NSException");
        NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
        NSDate *current = [NSDate date];
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
        [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; // Set date and time styles
        [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
        NSString *currentTime = [dateFormatter stringFromDate:current];
        [userInfo setObject:@"Crash Time" forKey:currentTime];
        NSException *ex = [[NSException alloc] initWithName:@"BookmartCrashException" reason:@"User crashed bookmart!" userInfo:userInfo];
        [ex raise];
    });

} ...}

Я собираюсь выбрать решение 2, потому что это приложение аварийно завершает работу, за исключением того, что лучше соответствует моим требованиям.

Спасибо всем.

1
rachelnino 5 Сен 2017 в 06:19