WKWebView 的navigationDelegate方法含义
// 页面开始加载时调用
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
// 当内容开始返回时调用
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
// 页面加载完成之后调用
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// 页面加载失败时调用
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
// 接收到服务器跳转请求之后调用
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
// 在收到响应后,决定是否跳转 -> 默认允许
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
//允许跳转
decisionHandler(.allow)
//不允许跳转
// decisionHandler(.cancel)
// 在发送请求之前,决定是否跳转 -> 默认允许
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) {
decisionHandler(.allow, preferences)
WKWebView 的navigationDelegate方法含义// 页面开始加载时调用 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { } // 当内容开始返回时调用 func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!)
一个包含WKWebView SwiftUI组件View
由于WKWebView处理大量自己的状态,导航堆栈等,因此将其视为可变数据模型几乎容易WKWebView 。 您可以先设置它,然后再在SwiftUI视图中使用它的数据。
只需启动一个WebViewStore (可选地使用您自己的WKWebView ),然后使用它来访问WKWebView本身,就好像它是数据模型一样。
用法示例:
import SwiftUI
import WebView
struct ContentView : View {
@StateObject var webViewStore = WebViewStore ()
var body: some View {
NavigationView {
WebView ( webView : webViewStore. webV
//但如果这么写了的话, 需要在dealloc中把代理置nil: _wkWebView.scrollView.delegate = nil;否则会崩溃
_wkWebView.scrollView.delegate = self;
之前有引用到WKWebview,为使用方便将WKWebvi.
实现 JSBridge 的关键是在原生的 WKWebView 中添加 JavaScript,使之能够被调用并处理传递的数据。以下是一个简单的 Swift 版本的实现:
1. 在原生代码中添加 JavaScript
```swift
// WKWebView 初始化
let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
// 注入 JavaScript 脚本
let jsScript = "window.webkit.messageHandlers.jsBridge.postMessage"
let userScript = WKUserScript(source: jsScript, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
webView.configuration.userContentController.addUserScript(userScript)
// 添加消息处理器
webView.configuration.userContentController.add(self, name: "jsBridge")
2. 实现 WKScriptMessageHandler 协议
使用 WKScriptMessageHandler 协议来接收从 JavaScript 中传递的消息。在 Swift 中,需要使用 `@objc` 来声明方法。
```swift
extension ViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "jsBridge" {
// 处理传递的数据
let data = message.body as? [String: Any]
// ...
3. 在 JavaScript 中实现调用
在 JavaScript 中使用 `window.webkit.messageHandlers.jsBridge.postMessage(data)` 来将数据传递给原生代码。以下是一个示例:
```javascript
// 发送数据给原生代码
window.webkit.messageHandlers.jsBridge.postMessage({
action: "showAlert",
data: {
message: "Hello from JavaScript!"
通过以上步骤,就可以在 Swift 中实现一个简单的 JSBridge。
M1上模拟器无法运行的项目,可以用Rosetta打开
电脑版微信怎么双开、多开
m0_59705576:
每次 git push 都要输入 ssh/id_rsa 的密码解决方法
Alan_kk: