首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法将JS注入Swift/ Cocoa /NextStep中的WKWebView /将WKWebView中网页上的用户选择推送到Swift /Cocoa

基础概念

WKWebView 是苹果提供的用于在iOS和macOS应用中显示网页内容的组件。它基于WebKit引擎,提供了比旧的UIWebView更高的性能和更多的功能。

JavaScript注入 是指在网页加载过程中,通过某种方式将JavaScript代码插入到网页中执行。这在跨平台开发中常用于实现原生应用与网页内容的交互。

相关优势

  1. 性能提升:WKWebView比UIWebView更快,内存占用更低。
  2. 安全性增强:提供了更好的沙盒环境,减少了安全风险。
  3. 更好的用户体验:支持更多的HTML5特性和CSS动画。

类型与应用场景

  • 类型:通常分为同步注入和异步注入。
    • 同步注入:在页面加载前或加载时注入JS代码。
    • 异步注入:在页面加载后通过某种机制触发JS代码执行。
  • 应用场景
    • 实现网页与原生应用的深度交互。
    • 在网页上添加自定义功能或UI元素。
    • 收集用户行为数据或进行页面分析。

遇到的问题及原因

问题描述:无法将JavaScript注入到WKWebView中,或者无法将WKWebView中网页上的用户选择推送到Swift/Cocoa。

可能的原因

  1. 权限问题:可能没有正确设置WKWebView的配置,导致无法执行JavaScript。
  2. 通信机制问题:WKWebView与原生代码之间的通信机制(如WKScriptMessageHandler)可能未正确设置。
  3. 代码错误:注入的JavaScript代码本身可能存在语法错误或逻辑问题。
  4. 安全策略限制:浏览器的安全策略可能阻止了某些JavaScript的执行。

解决方案

1. 设置WKWebView配置

确保在创建WKWebView时正确设置了WKWebViewConfiguration,并启用了JavaScript执行。

代码语言:txt
复制
let configuration = WKWebViewConfiguration()
configuration.preferences.javaScriptEnabled = true
let webView = WKWebView(frame: .zero, configuration: configuration)

2. 使用WKScriptMessageHandler进行通信

通过实现WKScriptMessageHandler协议,可以在网页和原生应用之间建立通信桥梁。

代码语言:txt
复制
class ViewController: UIViewController, WKScriptMessageHandler {
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let configuration = WKWebViewConfiguration()
        let userContentController = WKUserContentController()
        userContentController.add(self, name: "callbackHandler")
        configuration.userContentController = userContentController
        
        webView = WKWebView(frame: self.view.frame, configuration: configuration)
        self.view.addSubview(webView)
        
        // 加载网页
        if let url = URL(string: "https://example.com") {
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "callbackHandler", let messageBody = message.body as? String {
            print("Received message from JS: \(messageBody)")
            // 处理从JS传递过来的数据
        }
    }
}

在网页端,可以通过以下方式发送消息到原生应用:

代码语言:txt
复制
window.webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");

3. 检查JavaScript代码

确保注入的JavaScript代码没有语法错误,并且逻辑正确。

代码语言:txt
复制
// 示例:简单的JavaScript函数
function greet(name) {
    return "Hello, " + name + "!";
}

4. 调试与日志

使用Xcode的调试工具来检查是否有任何错误信息。同时,可以在JavaScript代码中添加console.log语句来帮助定位问题。

总结

通过正确配置WKWebView、设置通信机制、检查JavaScript代码以及利用调试工具,可以有效解决无法将JavaScript注入到WKWebView或无法推送用户选择到Swift/Cocoa的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS开发----JavaScriptCore、UIWebView及WKWebView交互的那些事

假设一个简单的场景 Web通过一个 输入一个字符串,通过点击按钮设置成导航标题 原生设置完导航标题后,告知Web"以将"设置成导航Title,并在网页最底下的label显示出来...通常用法是自定义一个CustomExport : JSExport,里面将JS可以调用的属性或者方法进行暴露,JS就可以直接使用暴露的属性与方法了。...宏,可以将方法名简化,就像 Swift中的 typealias以及 ObjC中的 typedef。...中方法就是客户端中的闭包,不过这里楼主采用了Swift和ObjC混编模式,至于原因下面会说一下: 实现方法: Swift版本如下,功能实现在本人看来应该是一样的,但在进行注入的时候出现了问题,导致执行方法出现了...UIWebViewDelegate 在UIWebViewDelegate 中的webViewDidFinishLoad() 方法中对JSContext进行截取,并执行操作: WKWebView 首先有一点

1.6K20
  • Swift入门:怎样安装Xcode和创建Playground

    Swift 4.2官方上是对swift4.0的一个小的更新,但实际上在Swift 5发布之前,它提供了许多新的功能来填补这个空白。...Swift 5.1听起来像是一个小的更新,但事实上它包含了很多功能,使SwiftUI能够顺利工作。 UIKit是苹果的用户界面工具包。...严格地说,它由用于用户界面的AppKit、基本功能的基础和用于对象图的核心数据组成,但与Cocoa Touch一样,它通常用于表示“所有macOS开发” NeXTSTEP是一个由史蒂夫•乔布斯创建的名为...Crashes(崩溃)是指你的代码出现灾难性错误,你的应用无法恢复。如果用户正在运行你的应用程序,它将消失,他们将回到主屏幕上。如果你在Xcode中运行,你会看到一个崩溃报告。...image Xcode会问你是否想为iOS或macOS创建一个Playground,但这里并不重要——这篇介绍几乎完全是关于Swift语言的,没有用户界面组件。为避免出现问题,请选择“iOS”平台。

    6.2K10

    JSBridge 原理

    注入 API 基于 Webview 提供的能力,我们可以向 Window 上注入对象或方法。JS 通过这个对象或方法进行调用时,执行对应的逻辑操作,可以直接调用 Native 的方法。...调用示例: window.webkit.messageHandlers.share.postMessage(xxx); Native 调用 JS Native 调用 JS 比较简单,只要 H5 将 JS...loadUrl 方法使用起来方便简洁,但是效率低无法获得返回结果且调用的时候会刷新 WebView。...这样有利于保持 API 与 Native 的一致性,但是缺点是在 Native 注入的方法和时机都受限,JS 调用 Native 之前需要先判断 JSBridge 是否注入成功 使用规范 H5...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    2.2K40

    【小程序开发必读】怎样写出一手好的小程序之多端架构篇

    答案是可以的,所以上面那种图其实可以简单的再进行一下相关划分,新的如图所示: 简单来说就是,内核改改,然后将规范的 webview 接口,选择性的抽一份给 JsCore 调用。...简单来说,它会直接将 native 的相关属性和方法,直接转换成 prototype object 上的方法和属性。 简单执行 JS 脚本 使用 JSCore 可以在一个上下文环境中执行 JS 代码。...简单来说,它会直接将 native 的相关属性和方法,直接转换成 prototype object 上的方法和属性。 那在 JS 代码中,如何执行 Swift 的代码呢?...具体步骤是将当前的 Class 转换为 Object 类型注入到 JSContext 中。 lazy var context: JSContext?...swift 类注入到 JSContext 的步骤,余下的只是调用问题。

    1.6K60

    前端开发:混合技术栈的应用

    混合技术栈的优势先来了解一下混合技术栈的优势,尤其是在大前端开发领域,混合技术栈允许开发者从不同的技术中选择最佳工具来构建应用,这里汇总了一些优势,具体如下所示:提高开发效率:利用现有的Web技术可以快速开发跨平台的应用...1、场景描述在移动端开发中,H5页面可以作为一个轻量级的用户界面解决方案,尤其适用于内容展示型应用。2、实现方法使用WebView来加载和显示H5页面。...webView.load(myRequest) } }OC项目嵌入Swift的使用在实际开发中,其实还有一些其他复杂的需求,比如在OC项目中嵌入Swift实现的功能的使用,具体如下所示。...Web内容,通过使用Web组件,开发者可以将Web页面或应用程序嵌入到HarmonyOS应用程序中,实现更丰富的用户界面和功能。...,不难看出混合技术栈在前端开发中的应用,展示了软件开发领域的创新和多样性,个人觉得通过结合不同的技术,我们不仅能够提高开发效率,缩短项目周期,还能为用户提供更加丰富和流畅的体验。

    12221

    分享超详细 WKWebView 开发和使用经验

    WKUIDelegate WKWebView 网页的UI交互代理,对于 JS 中的 UI 类型操作需要实现对应的方法,例如 window.alert、window.confirm 等操作。...网页是否处于加载中,YES 加载中、 NO 加载完成 estimatedProgress: 网页加载进度 hasOnlySecureContent: 网页上的所有资源是否已通过 https 加载 serverTrust...用户内容控制 WKUserContentController 支持注入、移除 js 脚本 支持 Web 内容规则 用户脚本 WKUserScript WKUserScript *userScript =...forMainFrameOnly: 是否仅注入在主框架,还是包括所有的 iframe 全部注入。 添加用户脚本 addUserScript 使用 addUserScript 方法来添加 js 脚本。...移除所有用户脚本 removeAllUserScripts 如果注入时机为在网页渲染前,那么网页加载完毕后执行移除脚本操作,则脚本的运算结果并不会受影响,但是在网页加载完毕前移除脚本的后,脚本将不会执行

    4.9K30

    《Motion Design for iOS》(十四)

    Swift被设计为和已经存在的Cocoa和Cocoa Touch框架协作(苹果公司提供给开发者来创建应用的API库)而且可以和Objective-C在同一个app中共存,但不能在同一个源代码文件中。...当2014年九月初发布iOS 8时,苹果宣布Swift发布了1.0版本并可以安全地使用于发布到App Store的app中。...我依然使用Objective-C编写我的app,但随着时间流逝,我会至少在新的工程中部分使用Swift。我对Swift中的一些Objective-C没有的高级语言特性非常期待。...本书中的全部动画示例代码都会有Objective-C和Swift两种编写方式,因此你可以理解和观察其区别并自行选择哪一种语言对你的使用更有意义。...如果Swift对你来说是全新的(除了苹果公司以外每个人都是这样!)你应该看看iBooks上500页的Swift Programming Language 指南,这是免费的。

    86610

    新年新语言,WCDB Swift

    语言集成查询同时内建了反注入机制,可以避免第三方从输入框注入 SQL,进行预期之外的恶意操作。...损坏修复 内建的修复工具可以在系统错误、磁盘故障等情况下,尽最大限度地将损坏的数据找回并导出。 Pure Swift 模型绑定对语言的依赖性很大。...ObjC 版本使用宏定义,使得 WCDB 可以通过的方式进行语言集成查询的操作。 KeyPath 我们最初盯上的是 Swift 的的机制,它通过的语法,可以直接对变量进行读写操作,且语法上也与类似。...一个难题是,在不引入 Cocoa 的情况下,是并不提供 property 的名称,这就无法通过直接映射数据库的字段。 Swift 也有一个相关的 SR 在讨论这个问题。...对应到 WCDB,将数据库的字段读写到变量中,其本质就是一个序列化和反序列化的过程,而也可能可以用于语言集成查询中的字段映射。

    1K90

    H5如何与原生App通信?

    我们首先要提到的是一个叫UIWebView的容器,苹果对他的介绍是: UIWebView是一个可加载网页的对象,它有浏览记录功能,且对加载的网页内容是可编程的。...调用客户端原生方法的回调函数也将绑在window下供客户端成功反调用,实际上一次调用客户端方法最后产生的结果是双向互相调用。...这种js的调用方式与ios的一样,使用iframe来调用native方法。 通过在webview页面里直接注入原生js代码方式,使用addJavascriptInterface方法来实现。...window.jsBridge.getShare()"); H5端将方法绑定在window下的对象即可,无需与IOS作区分 H5调用RN客户端 我们知道RN的webView组件实际上就是对原生容器的二次封装...在了解了js与客户端底层的通信原理后,我们可以将IOS、安卓统一封装成jsBridge提供给业务层开发调用。

    6.1K20

    新年新语言,WCDB Swift

    同时,通过类型的定义,Swift 即可推导出 WCDB 查询的结果为 Sample 类。 语言集成查询同时内建了反注入机制,可以避免第三方从输入框注入 SQL,进行预期之外的恶意操作。...KeyPath 我们最初盯上的是 Swift 的 KeyPath 的机制,它通过 \ 的语法,可以直接对变量进行读写操作,且语法上也与 className.propertyName 类似。...image.png 一个难题是,KeyPath 在不引入 Cocoa 的情况下,是并不提供 property 的名称,这就无法通过 KeyPath 直接映射数据库的字段。...image.png 对应到 WCDB,将数据库的字段读写到变量中,其本质就是一个序列化和反序列化的过程,而 CodingKeys 也可能可以用于语言集成查询中的字段映射。...因此,先有 WCDB Swift,未来才有用 Swift 编写微信的可能,这逻辑没毛病。 另一方面,没有微信的上线机制的保护和庞大的用户量的验证,我们需要确保 WCDB Swift 的稳定性。

    2.3K80
    领券