iOS 8.4.1 破坏了 UIWebView?

iOS 8.4.1 broke UIWebView?

我继承了一个项目,该项目使用不向用户显示的 UIWebView 来加载 HTML 并引用 JS 文件进行计算,并且已经运行了一段时间没有问题。

我已验证 JS 文件和 HTML 以及代码没有改变。

从 iOS 8.4.1 8 月 13 日发布开始,这部分代码的问题开始出现在客户面前。

- (void)loadCompleteHTML:(NSString*)completeHTML {
    self.caculateWebView = [[UIWebView alloc] init];
    self.caculateWebView.delegate = self;
    [self.caculateWebView loadHTMLString:completeHTML baseURL:nil];
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    if ([[request.URL.scheme lowercaseString] isEqualToString:@"success"]) {
        //do something with the success
        .
        .
        return NO;

    } else if ([[request.URL.scheme lowercaseString] isEqualToString:@"fail"]) {
        //do something with the fail
        .
        .
        return NO;
    }

    return YES;

}

它既不返回 "success" 也不返回 "fail",从这个 HTML/JS 中唯一可能得出的两个结论是这两个中的任何一个。

通过记录 request.URL.absoluteString,我看到 iOS 8.4.1 UIWebView 在加载时突然调用 about:blank 作为第一个 URL。我的解决方案是要求 UIWebView 仅在第一次重新加载。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    BOOL calledForReload = NO;

    if ([[request.URL.scheme lowercaseString] isEqualToString:@"success"]) {
        //do something with the success
        .
        .
        return NO;

    } else if ([[request.URL.scheme lowercaseString] isEqualToString:@"fail"]) {
        //do something with the fail
        .
        .
        return NO;
    } else if (!calledForReload) {
        //call for reload
        calledForReload = YES;
        [webView reload];
    }

    return YES;

}

希望我对这个问题的解决方案能帮助像我一样目瞪口呆的人。