我正在使用 Swift 为 iOS 构建一个非常简单的应用程序。我正在运行 Xcode 13,这是适用于 Mac Big Sur 的最新版本。它只是使用 WKWebView 来加载我的网站。我的网站在 Safari 中运行完美,但在带有 WKWebView 的 iPhone 模拟器中无法运行。
我的网站是使用 Telerik 的 Blazor 服务器端网站。错误消息不清楚,但似乎没有加载 Telerik 或 Blazor 服务器 js 文件。它说找不到“TelerikBlazor”。我的代码中确实启用了 JavaScript。
我尝试通过 Visual Studio 中的开发隧道将 Mac 连接到 PC,但收到“不允许请求资源”错误,因此无法调试它。但同样,它在 Safari 中运行得很好。我还尝试将 Maui 项目中的 iPhone 模拟器连接到我的 Mac,但它找不到 Xcode,我猜是因为它是一台较旧的 Mac。
您遇到的 Blazor Server 网站无法在 WKWebView 中运行而在 iOS 上的 Safari 中正常运行的问题可能是由于以下几个潜在原因造成的:
说明: ATS 是一项 iOS 安全功能,要求应用程序通过符合安全标准的 HTTPS 与服务器进行通信。
解决方案:
Info.plist
以包含 ATS 例外(不建议用于生产)。说明: CSP 标头控制浏览器可以加载哪些资源。您的 Blazor 网站可能有限制性 CSP,阻止 WKWebView 加载某些脚本或资源。
解决方案:
解释: WKWebView 可能会在加载必要的 DOM 元素之前尝试执行 JavaScript。
解决方案:
WKUserScriptInjectionTime.atDocumentEnd
注入 JavaScript 代码。说明: 如果您的 Blazor 网站和开发服务器位于不同的源(域、端口或协议),您可能会遇到 CORS 问题。
解决方案:
说明: 仔细检查您是否在 WKWebView 配置中启用了 JavaScript。
解决方案:
let config = WKWebViewConfiguration()
config.preferences.javaScriptEnabled = true
let webView = WKWebView(frame: .zero, configuration: config)
远程调试:
控制台日志:
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
var webView: WKWebView!
override func loadView() {
let config = WKWebViewConfiguration()
config.preferences.javaScriptEnabled = true
webView = WKWebView(frame: .zero, configuration: config)
webView.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string:"https://www.yourwebsite.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
}