Как мой код iPhone Objective-C может быть уведомлен относительно ошибок JavaScript в UIWebView?

Основываясь на ответе Свена, я нашел использование коллекций. Такой способ помог мне выполнить то, что вы хотите, и позволить мне добавить больше элементов в dict:

import collections

x=[1,2,20,6,210]
z=collections.OrderedDict.fromkeys(x)
z
OrderedDict([(1, None), (2, None), (20, None), (6, None), (210, None)])

Если вы хотите добавить элементы, но все еще рассматривайте его как набор, который вы можете просто сделать:

z['nextitem']=None

И вы можете выполнить операцию типа z.keys () на dict и получить набор:

z.keys()
[1, 2, 20, 6, 210]
46
задан Ned Batchelder 9 November 2008 в 22:25
поделиться

3 ответа

Я теперь нашел один способ использовать рычаги отладчика сценариев в веб-представлении (примечание, НЕ UIWebView). Я сначала должен был разделить UIWebView на подклассы и добавить метод как это:

- (void)webView:(id)webView windowScriptObjectAvailable:(id)newWindowScriptObject {
    // save these goodies
    windowScriptObject = newWindowScriptObject;
    privateWebView = webView;

    if (scriptDebuggingEnabled) {
        [webView setScriptDebugDelegate:[[YourScriptDebugDelegate alloc] init]];
    }
}

Следующий необходимо создать класс YourScriptDebugDelegate, который содержит методы как они:

// in YourScriptDebugDelegate

- (void)webView:(WebView *)webView       didParseSource:(NSString *)source
 baseLineNumber:(unsigned)lineNumber
        fromURL:(NSURL *)url
       sourceId:(int)sid
    forWebFrame:(WebFrame *)webFrame
{
    NSLog(@"NSDD: called didParseSource: sid=%d, url=%@", sid, url);
}

// some source failed to parse
- (void)webView:(WebView *)webView  failedToParseSource:(NSString *)source
 baseLineNumber:(unsigned)lineNumber
        fromURL:(NSURL *)url
      withError:(NSError *)error
    forWebFrame:(WebFrame *)webFrame
{
    NSLog(@"NSDD: called failedToParseSource: url=%@ line=%d error=%@\nsource=%@", url, lineNumber, error, source);
}

- (void)webView:(WebView *)webView   exceptionWasRaised:(WebScriptCallFrame *)frame
       sourceId:(int)sid
           line:(int)lineno
    forWebFrame:(WebFrame *)webFrame
{
    NSLog(@"NSDD: exception: sid=%d line=%d function=%@, caller=%@, exception=%@", 
          sid, lineno, [frame functionName], [frame caller], [frame exception]);
}

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

См. http://www.koders.com/noncode/fid7DE7ECEB052C3531743728D41A233A951C79E0AE.aspx для Objective C ++ определение WebScriptDebugDelegate.

Те другие методы:

// just entered a stack frame (i.e. called a function, or started global scope)
- (void)webView:(WebView *)webView    didEnterCallFrame:(WebScriptCallFrame *)frame
      sourceId:(int)sid
          line:(int)lineno
   forWebFrame:(WebFrame *)webFrame;

// about to execute some code
- (void)webView:(WebView *)webView willExecuteStatement:(WebScriptCallFrame *)frame
      sourceId:(int)sid
          line:(int)lineno
   forWebFrame:(WebFrame *)webFrame;

// about to leave a stack frame (i.e. return from a function)
- (void)webView:(WebView *)webView   willLeaveCallFrame:(WebScriptCallFrame *)frame
      sourceId:(int)sid
          line:(int)lineno
   forWebFrame:(WebFrame *)webFrame;

Примечание, что это все скрыто в частной платформе, не пытается поместить это в код, который Вы отправляете App Store, и быть готовыми к некоторому хакерству заставить его работать.

28
ответ дан Robert Sanders 8 November 2019 в 00:19
поделиться

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

// Dismiss Javascript alerts and telephone confirms
/*- (void)alertSheet:(UIAlertSheet*)sheet buttonClicked:(int)button
{
    if (button == 1)
    {
        [sheet setContext: nil];
    }

    [sheet dismiss];
}*/

// Javascript errors and logs
- (void) webView: (WebView*)webView addMessageToConsole: (NSDictionary*)dictionary
{
    NSLog(@"Javascript log: %@", dictionary);
}

// Javascript alerts
- (void) webView: (WebView*)webView runJavaScriptAlertPanelWithMessage: (NSString*) message initiatedByFrame: (WebFrame*) frame
{
    NSLog(@"Javascript Alert: %@", message);

    UIAlertSheet *alertSheet = [[UIAlertSheet alloc] init];
    [alertSheet setTitle: @"Javascript Alert"];
    [alertSheet addButtonWithTitle: @"OK"];
    [alertSheet setBodyText:message];
    [alertSheet setDelegate: self];
    [alertSheet setContext: self];
    [alertSheet popupAlertAnimated:YES];
}
0
ответ дан kdbdallas 8 November 2019 в 00:19
поделиться

Я создал кошерный репортер ошибок, который включает в себя:

  1. Сообщение об ошибке
  2. Название файла, в котором происходит ошибка 1222] Номер строки, в которой произошла ошибка
  3. Сеанс вызова JavaScript, включая переданные параметры

Он является частью инфраструктуры QuickConnectiPhone, доступной из проекта sourceForge

. Существует даже пример приложения, в котором показано, как отправить сообщение об ошибке на терминал Xcode.

Все, что вам нужно сделать, это окружить ваш код JavaScript, включая определения функций и т. д. с помощью try catch. Это должно выглядеть так.

try{
//put your code here
}
catch(err){
    logError(err);
}

Это не очень хорошо работает с ошибками компиляции, но работает со всеми остальными. Даже анонимные функции.

Блог разработчиков находится здесь находится здесь и включает ссылки на вики, sourceForge, группу google и твиттер. Может быть, это поможет вам.

4
ответ дан 26 November 2019 в 20:33
поделиться