解决 WKWebView http POST 在 iOS 11.3 中不再发送参数的问题

Posted

技术标签:

【中文标题】解决 WKWebView http POST 在 iOS 11.3 中不再发送参数的问题【英文标题】:Work around to WKWebView http POST no longer sending parameters in iOS 11.3 【发布时间】:2018-09-26 00:01:18 【问题描述】:

我的应用程序有两个视图:

等待用户凭据的登录视图

包含 web 视图的主视图

当用户输入他的凭据时,本机异步 POST 方法被发送到服务器。如果凭据有效,用户将被重定向到 webview 视图并使用 load(request) 方法加载它。

注意:请求也是使用上述凭据的POST方法。

这种两步验证背后的原因是为了避免打开 webview 时出现 403 错误登录/密码对;如果第一步验证失败,用户将停留在登录视图上。

Here is a flow chart explaining how the authentication works

10.0 和 11.2 之间的 ios 版本运行应用程序没有任何问题。使用 iOS 11.3 的设备和模拟器打开 web 视图时出现 403 错误。

到目前为止,我可以断言两件事(并且已经过我们的后端测试):

使用异步 POST 方法验证成功,这意味着凭据正确,并且应用程序和服务器之间的通信正常

加载 webview 时,服务器没有收到任何用于身份验证的参数,这解释了 403 登录/密码错误。

目前这个问题使我的应用程序无法运行,因此非常需要快速修复。 GET 请求已经过测试,它们的参数发送没有任何问题。

欢迎提出任何建议。

TL;DR - 由于 iOS11.3 POST 请求在 WKWebViews 中无法正常工作,如何使用 GET 请求进行或多或少安全的身份验证?

PS : 无法为其添加 iOS 11.3 标签,如果有人可以添加它,将不胜感激。

【问题讨论】:

您找到任何解决方案或解决方法了吗? 暂时,我更喜欢使用 UIWebView 而不是 WKWebView 作为解决方法。 【参考方案1】:

我已经使用 WKWebView 对 iOS 12.1.4 进行了测试,并按预期工作。您只需要确保请求具有正确的标头即可。在我的情况下,问题是由缺少的内容类型给出的,它必须是“application/x-www-form-urlencoded”。因此,您需要确保正文部分符合rfc-1738,并且空格字符表示为“+”,如here 所述。

关于 WKWebView 提到的委托 webView:decidePolicyFor: body 部分没有显示,但它实际上是发送的。我可能会假设出于内存/安全原因显示为空,或者可能只是一个错误,到目前为止并不太关心这一点

希望对你有帮助

【讨论】:

我可以确认这适用于 iPadOS 13.5.1 中的 WKWebView。 Content-Type 标头可以按此处所述发送:***.com/a/1323844/872051【参考方案2】:

很遗憾,你不能用 WKWebView 做到这一点。

它在 webView:decidePolicyForNavigationAction:decisionHandler: 中肯定行不通,因为 navigationAction.request 是只读的,并且是一个不可更改的不可变 NSURLRequest 实例。

如果我理解正确,WKWebView 在单独的内容和网络进程中运行沙盒,至少在 iOS 上,没有办法拦截或更改它的网络请求。

如果你回到 UIWebView,你可以这样做。

【讨论】:

【参考方案3】:

我使用 UIWebView 代替 WKWebView 并且它有效!

【讨论】:

【参考方案4】:

我在这里遇到了同样的问题 :(,不知道为什么 WKWebview 加载 URL 请求时没有发送 POST 参数。 您可以使用 URL 会话加载站点内容(html 资源)并将其填充到 WKWebview。但如果您的页面使用 cookie,它将不会维护历史记录或 navigationRequest。

【讨论】:

以上是关于解决 WKWebView http POST 在 iOS 11.3 中不再发送参数的问题的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView POST 请求

cordova ios 6.1.0 wkwebview 一些 xhr POST 失败

当我实现decisionPolicyForNavigationAction委托方法时,WKWebView中的Post请求将无效

原始WkWebview调用后如何拦截http / https调用?

iOS WkWebview不支持 window.open的解决方法

iOS- "_OBJC_CLASS_$_WKWebView", referenced from: 解决记录