javascript - Swift——进入 WKURLSchemeHandler 的值第一次是正确的,然后永远不会改变

标签 javascript swift wkurlschemehandler

我是 Swift 编程的新手,可能正在使用某种构造,使值在设置一次后不可变。我有一个正在运行 JavaScript web 应用程序的 WKWebView,并且在该 JS 中调用如下 URL:

var url = 'testscheme://x-callback/test?unique=' + new Date().getTime() + 'Z';
window.location = url;
Ext.toast(url, 30000);

这又会在我的 Swift 代码中触发下面的扩展。问题是,第一次调用扩展时,它具有来自 JS 的正确 URL;但此后,第一个 URL 似乎以某种方式“卡住”,并且每当再次调用它时,它都会继续打印第一个 URL 值,而不是来自任何后续调用的值,其中包含不同的信息。

extension VCWebView: WKURLSchemeHandler {
    // any requests for a URL scheme should arrive here
    func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
        print("In WKURLSchemeHandler webView()")
        print("url absolute string requested: " + (urlSchemeTask.request.url?.absoluteString ?? "{nil}"))
        // THE LINE above is where it should be printing a unique value every time it is run,
        // but gets stuck with the value from the first time it was run
    }

    // not used
    func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
    }

}

我知道 JS 正在发送唯一信息,因为当我关闭应用程序并再次启动它时,它第一次再次具有唯一值,但随后在再次运行时继续显示第一个唯一值在那之后。有一些我不明白的日志文件条目(第二次尝试后 09:42:01 的 4):

testscheme url scheme registered
in VCWebView.swift viewDidLoad()
{1ST ATTEMPT}
09:41:12.904692-0700 MyApp[51948:6316047] [ProcessSwapping] 0x10a1842c0 - ProvisionalPageProxy::ProvisionalPageProxy: pageID = 6 navigationID = 4 suspendedPage: 0x0
In WKURLSchemeHandler webView()
url absolute string requested: testscheme://x-callback/test?unique=1570293672897Z {THIS IS WHAT JS SENT: ...897Z so this one is correct}
{2ND ATTEMPT}
09:42:01.516773-0700 MyApp[51948:6316047] [ProcessSwapping] 0x10a1842c0 - ProvisionalPageProxy::didFailProvisionalLoadForFrame: pageID = 6, frameID = 1, navigationID = 4
09:42:01.520345-0700 MyApp[51948:6316047] [ProcessSwapping] 0x10a184420 - ProvisionalPageProxy::ProvisionalPageProxy: pageID = 6 navigationID = 5 suspendedPage: 0x0
09:42:01.632990-0700 MyApp[51948:6316047] [ProcessSuspension] 0x10a1f72d0 - ProcessAssertion::processAssertionWasInvalidated()
09:42:01.633186-0700 MyApp[51948:6316047] [ProcessSuspension] 0x10a1f7f00 - ProcessAssertion::processAssertionWasInvalidated()
In WKURLSchemeHandler webView()
url absolute string requested: testscheme://x-callback/test?unique=1570293672897Z {THIS IS WHAT JS SENT: ...512Z}
09:42:31.520976-0700 MyApp[51948:6316047] [assertion] Error acquiring assertion: <NSError: 0x600002efdcb0; domain: RBSAssertionErrorDomain; code: 2; reason: "Specified target process does not exist">
09:42:31.521453-0700 MyApp[51948:6316047] Could not signal service com.apple.WebKit.WebContent: 113: Could not find specified service

这些日志文件条目可能解释了失败的原因,但我不知道如何修复它。有什么想法我做错了吗?

最佳答案

我也遇到过这个问题。看来需要调用 didReceive 来与 WebView 进行通信,然后调用 didFinish:https://developer.apple.com/documentation/webkit/wkurlschemetask/2890839-didreceive

实现这些函数后,现在每次都会使用更新的参数调用我的方法。

这篇文章中有一个很好的示例来说明如何设置这些参数: How to intercept a WKWebView request to detect which local resource files (css, js, png, ...) load together with a HTML file?

关于javascript - Swift——进入 WKURLSchemeHandler 的值第一次是正确的,然后永远不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58245374/

相关文章:

javascript - Angularjs 过滤器未按预期工作

ios - 自定义 UILabel 在 Interface Builder 中显示不正确

ios - Objective-C 中的参数类型 (void *) 如何转换为 Swift 中的 UnsafePointer<()> ?

Swift 如何在方法内部创建 Action

javascript - 如何在 vuejs 组件中使用 laravel csrf token

javascript - 将 Node.js Web 应用程序打包为普通桌面应用程序

javascript - 这是使用 jQuery 将我的 XML 解析为 JavaScript 对象的最快方法吗?