评估JavaScript WKWebView iOS 15 不工作

Kis*_*har 5 swift webcrypto ios15

我正在使用 WebCrypto 库来解密数据,但它在 iOS 15 上不起作用,在 iOS 14 上工作正常

我检查过 webView 的评估JavaScript函数抛出错误

Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=27, 
WKJavaScriptExceptionMessage=TypeError: undefined is not an object (evaluating 'y.importKey'), WKJavaScriptExceptionColumnNumber=8260, 
WKJavaScriptExceptionSourceURL=undefined, NSLocalizedDescription=A JavaScript exception occurred}
Run Code Online (Sandbox Code Playgroud)

Leo*_*Leo 1

我也偶然发现了这一点,新的 IOS15 行为也确实破坏了我们的代码。显然 Apple 改变了 的语义evaluateJavaScript:取决于调用以下代码的时间,如果调用得太早,新函数不会出现在 JS 命名空间中。

[_webview evaluateJavaScript:@"function foobar() {console.log('in foobar');}" completionHandler:^(NSObject* res,NSError* err) {
}];
Run Code Online (Sandbox Code Playgroud)

如果此代码之前被调用

[_webview loadRequest:req];
Run Code Online (Sandbox Code Playgroud)

那么它就不再有任何效果了(但此时不会引发任何错误..该函数进入涅槃状态)。解决方案是将此类代码添加为用户脚本,如https://developer.apple.com/forums/thread/684020中指出的那样

WKUserScript *script = [[WKUserScript alloc] initWithSource:@"function foobar() {console.log('in foobar');" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[_webview.configuration.userContentController addUserScript:script];
Run Code Online (Sandbox Code Playgroud)