Получение «Произошло исключение JavaScript» при оценке JavaScript в WKWebView в Objective-C - PullRequest
1 голос
/ 06 марта 2019

Здесь я использую проект Reference swift для загрузки PDF-файла в PDFViewer в WKWebview.

Референтный проект - https://github.com/Minitex/PDFJSTest/blob/master/PDFJSTest/ViewController.swift

Здесь в ссылочном проекте есть код, похожий на этот для загрузки PDF-файла

func openPDFInViewer(myURL: URL)
{
    let pdf = NSData(contentsOf: myURL)

    let length = pdf?.length
    var myArray = [UInt8](repeating: 0, count: length!)
    pdf?.getBytes(&myArray, length: length!)

    webView?.evaluateJavaScript("PDFViewerApplication.open(new Uint8Array(\(myArray)))", completionHandler: { result, error in
        print("Completed Javascript evaluation.")
        print("Result: \(String(describing: result))")
        print("Error: \(String(describing: error))")
   })
}

И я попытался преобразовать эту функцию в язык Objective-C, и это выглядит так:

-(void)renderPDF:(NSTimer*)theTimer
{
    NSMutableDictionary *dictData = [[NSMutableDictionary alloc] initWithDictionary:theTimer.userInfo];
    NSURL *requestURL =  (NSURL *)[dictData valueForKey:@"request_url"];

    NSData *data = [NSData dataWithContentsOfURL:requestURL];
    NSUInteger len = [data length];
    uint8_t myArray[len];
    [data getBytes:&myArray length:len];

    NSString *strForEvaluate = [NSString stringWithFormat:@"PDFViewerApplication.open(new Uint8Array('%s'));",myArray];


    [wkWebView evaluateJavaScript:strForEvaluate completionHandler:^(id Result, NSError * _Nullable error) {
        if (error)
        {
            NSLog(@"This is error....%@",error.description);
        }
        else if(Result)
        {
            NSLog(@"%@",Result);
        }
     }];
}

Когда я попытался запустить приложение и оценить функцию JavaScript, то в это время получал ответ об ошибке, подобный этому

Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=SyntaxError: Unexpected EOF, WKJavaScriptExceptionColumnNumber=0, WKJavaScriptExceptionSourceURL=file:///Users/sapanaranipa/Library/Developer/CoreSimulator/Devices/207FA841-3256-45D2-8698-2B769A72A2F4/data/Containers/Bundle/Application/4BD7E620-DF16-429B-BBC2-2A36BA2A2DE8/SureFox.app//PDF_Web/pdf.js-dist/web/viewer.html, NSLocalizedDescription=A JavaScript exception occurred}

Пожалуйста, помогите мне, спасибо заранее.

1 Ответ

2 голосов
/ 06 марта 2019

Вы рассматриваете произвольный байтовый массив как C-строку, и он может не заканчиваться нулем или содержать такие вещи, как ', которые вам не нужны в вашем JavaScript. Так что это может привести к сбою при попытке создать строку.

Проблемная часть использует форматер %s здесь:

NSString *strForEvaluate = [NSString stringWithFormat:@"PDFViewerApplication.open(new Uint8Array('%s'));",myArray];

(Кроме того, uint8_t myArray[len]; может вызвать переполнение стека [га!] Для больших данных.)

Вместо этого вам нужно создать строку, представляющую массив чисел JavaScript, например [25, 243, 0, 123]. Вот способ, который может работать (не проверено):

NSMutableArray<NSString *> *bytes = [NSMutableArray array];
const uint8_t *rawBytes = data.bytes;
for (NSUInteger i = 0; i < data.length; i++) {
    [bytes addObject:[NSString stringWithFormat:@"%d", (int)rawBytes[i]]];
}

NSString *javaScriptArray = [bytes componentsJoinedByString:@","];

NSString *strForEvaluate = [NSString stringWithFormat:
    @"PDFViewerApplication.open(new Uint8Array([%@]));", javaScriptArray];
...