在 objective-C 中从 UIWebView 迁移到 WKWebView 后无法加载本地 JS 文件

Can't load local JS file after migrate from UIWebView to WKWebView in objective-C

提问人:wdyz 提问时间:1/16/2021 更新时间:1/17/2021 访问量:127

问:

我有这样的UIWebView:

 #import <UIKit/UIKit.h>
 #import "DataProvider.h"

@implementation QHArticle
{
    UIWebView *_helperWebView;
}

-(instancetype)init
{
    self = [super init];
    if (self)
    {
        _helperWebView = [[UIWebView alloc] init];
        [_helperWebView loadHTMLString:@"<html><script src='Article.js'></script><body onload='Article.init();'></body></html>" baseURL:[[NSBundle mainBundle] bundleURL]];
    }
    return self;
}

-(NSString*)callJSMethod:(NSString*)method
{
    return [_helperWebView stringByEvaluatingJavaScriptFromString:method];
}

-(NSArray *)listArticle
{
    NSString *json = [self callJSMethod:@"(function() {return JSON.stringify(Article._data.news)})()"];
    ;
    NSError *error;
    NSArray *result = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
    return [result subarrayWithRange:NSMakeRange(1, result.count-2)];
}

当我尝试时,上面的代码工作正常。但是,在代码更改为 WKWebView 后,如下所示:

#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
#import "DataProvider.h"

@implementation QHArticle
{
    WKWebView *_helperWebView;
}

-(instancetype)init
{
    self = [super init];
    if (self)
    {
        _helperWebView = [[WKWebView alloc] init];
        [_helperWebView loadHTMLString:@"<html><script src='Article.js'></script><body onload='Article.init();'></body></html>" baseURL:[[NSBundle mainBundle] bundleURL]];
    }
    return self;
}

- (NSString *)callJSMethod:(NSString *)method
{
    __block NSString *resultString = nil;
    __block BOOL finished = NO;

    [_helperWebView evaluateJavaScript:method completionHandler:^(id result, NSError *error) {
        if (error == nil) {
            if (result != nil) {
                resultString = [NSString stringWithFormat:@"%@", result];
            }
        } else {
            NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
        }
        finished = YES;
    }];

    while (!finished)
    {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }

    return resultString;
}

我收到一条错误消息,“evaluateJavaScript 错误:....找不到文章对象“,并在手机上出现白色空白屏幕。 将其迁移到 WKWebView 后,我仍然找不到问题,请帮忙。 我只想使用 Objective-C,而不是 Swift,因为这是遗留代码。

谢谢。

Objective-C Xcode WKWebView

评论


答:

1赞 Greg Ball 1/17/2021 #1

WKWebView 不会从 URL 加载任何内容。file://

首先将脚本加载到字符串中;你可以用它来运行它。Article.jsevaluateJavaScript:

要将字符串注入到特定 WKWebView 加载的每个页面中,您需要创建一个 ,将其附加到 ,并将 THAT 附加到 .WKUserScriptWKUserContentControllerWKWebViewConfiguration

然后使用[WKWebView initWithFrame:configuration:]

评论

0赞 wdyz 1/18/2021
你能给我举个例子吗?我想加载javascript和listArticle可以成功运行。