【问题标题】:How to get a final URL after t.co redirects in WKWebViewt.co 在 WKWebView 中重定向后如何获取最终 URL
【发布时间】:2018-06-15 19:32:56
【问题描述】:

我知道我一般可以通过使用 URL 属性来获取 WKWebView 的当前 URL。但是我发现当有重定向时,它不会给我正确的 URL。

例如,如果我转到 http://twitter.com,然后单击指向其他公司的链接(例如:http://mycompany.com),然后我会看到一个 t.co/XXX URL,该 URL 最终将我重定向到 mycompany.com。

但是,当我查看 WKWebView 的 URL 属性时,我看到的是“t.co”而不是“mycompany.com”。

奇怪的是,我从来没有看到 didReceiveServerRedirectForProvisionalNavigation:... 被调用,当我在 didStartProvisionalNavigation:... 和 decisionPolicyForNavigationAction:... 检查 URL 时,我只看到“t.co” URL 而不是“mycompany.com “一个。

另外,我需要知道域才能对正文进行一些调整,所以我不确定我是否可以在这里使用 JS。

如果您有任何想法,请告诉我。

更新:我意识到只有当我使用通过 setURLSchemeHandler 设置的自定义 URL 方案时才会发生这种情况,我最初从问题中省略了它,因为我认为它不相关。

经过一番尝试,我能够通过 willPerformHTTPRedirection:...中的以下更改使事情顺利进行:

NSMutableURLRequest *newRequest = 
[NSMutableURLRequest requestWithURL:request.URL];

dispatch_async(dispatch_get_main_queue(), ^{
    [_webView loadRequest:newRequest];
});

 completionHandler(nil);

更新:这有一个严重的缺点,因为不用于主框架的 URL 将进入 willPerformHTTPRedirection:...,如果为所有这些重新加载请求,页面就会混乱。

我需要一种方法来确定 URL 是否来自主框架,并且只为那些重新加载。

【问题讨论】:

  • 你设置了它的委托吗?并在设备上试用。模拟器有时表现得很奇怪
  • 你能具体说明一下你的意思吗?我目前正在做 _webView.navigationDelegate = self; _webView.UIDelegate = 自我;我只是在设备上进行测试。
  • webview.navigationDelegate 就足够了。我试过了,效果很好。
  • 这是我尝试过的:` if let url = URL(string: "https://t .co/periscopeproducer") { let request = URLRequest(url: url) wkView.load(request ) wkView.navigationDelegate = self } ` func webView(_ webView: WKWebView, didStartProvisionalNavigation 导航: WKNavigation!) { print(webView.url!) } ` func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation 导航: WKNavigation!) { print (webView.url!) } `
  • 我认为如果您从 t.co URL 开始,它的行为可能会有所不同。您可以尝试在“twitter.com/microsoft”上启动 WKWebView,然后单击“news.microsoft.com”,这会导致“https://t.co/bKBtZeAFrh”?我的代码与您的代码几乎相同,只是我正在这样做。

标签: ios objective-c wkwebview


【解决方案1】:

好吧,我做到了。 https://imgur.com/a/eBSaNn7

解决方法是取消导航,再次用 loadRequest: 加载请求。

func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    if navigationAction.targetFrame?.isMainFrame != true {
        webView.load(navigationAction.request)
    }

    return nil
}

【讨论】:

  • 非常感谢您的帮助。不幸的是,在我的情况下,从未调用过“createWebViewWith”(我使用的是 obj-C,尽管这无关紧要)。此外,我删除了 target="_blank" 并仍然遇到问题。这个问题实际上影响更广泛,因为不仅 URL 错误,而且我看到相关图像没有正确加载,因为它们使用的是“t.co”域而不是正确的域。所以在重定向期间发生了一些有趣的事情,我仍然无法在任何回调中获得“microsoft.com”。我尝试添加一个身份验证回调,但它具有相同的错误域。
  • 确保设置 wkview.uiDelegate。很奇怪
  • 抱歉,我留下了一些阻止调用“createWebViewWith”的代码。我删除了它,现在看到它被调用了,但即使我添加了你的代码,它也没有帮助。我仍然只看到“t.co”域。
  • 我不知道你还用 wkview 做了什么。但是,如果您创建新项目并将我的代码放入其中,您应该会看到它正在运行。
  • 另外,请改用 webView didFinishNagivation。我用 didstartProvisionalNavigation 测试过,忘了带回来
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 2011-03-05
  • 1970-01-01
  • 2022-09-28
  • 2011-04-17
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多