Caravel 1.2.1

Caravel 1.2.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2017年2月
SwiftSwift版本3.0
SPM支持SPM

Adrien CadetBen Taitelbaum维护。



Caravel 1.2.1

  • 作者:
  • Adrien Cadet

Caravel Logo

一个事件总线,用于在 UIWebView/WKWebView 和嵌入的 JS 之间发送消息。使用纯 Swift 开发。

特性

  • 简单、快速且可靠的事件总线系统
  • 支持多个总线
  • 多线程支持
  • WKWebView支持
  • iOS ~> JavaScript 支持的类型
    • Bool
    • Int
    • Float
    • Double
    • String
    • 任何数组(使用此列表中的类型,包括字典)
    • 任何字典(使用此列表中的类型,包括数组)

  • JavaScript ~> iOS 支持的类型
    • Boolean
    • Int
    • Float(可以作为 Double 使用)
    • String
    • Array(可以作为 NSArray 使用)
    • Object(可以作为 NSDictionary 使用)

安装

作为子模块使用

克隆此仓库,并将 Caravel.xcodeproj 添加到您的工作区。

可能有用

开始使用

Caravel 允许开发者在他们的 UIWebView 和嵌入的 JS 之间进行通信。您可以在这两个实体之间发送任何类型的消息。

看一下这个超级简单的示例。先从 iOS 部分开始

class MyController: UIViewController {
    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Prepare your bus before loading your web view's content
        Caravel.getDefault(self, webView: webView, whenReady: { bus in
            // In this scope, the JS endpoint is ready to handle any event.
            // Register and post your events here
            bus.post("MyEvent", data: [1, 2, 3])

            self.bus = bus // You can save your bus for firing events later
        })

        // ... Load web view's content there
    }
}

现在,在你的 JS 中

var bus = Caravel.getDefault();

bus.register("AnEventWithAString", function(name, data) {
    alert('I received this string: ' + data);
    bus.post("AnEventForiOS");
});

接下来!

WKWebView

Caravel 1.1.0 支持 WKWebView。请注意,此组件仍在测试阶段,可能无法按预期工作。如果您的应用不能工作,我们不会提供🍕作为回报。

无论如何。如果您喜欢参与一些具有风险的业务,这里有一个关于如何使用 Caravel 与它的示例。小心,这是一个两步的过程。

class MyController: UIViewController {
    private var wkWebView: WKWebView?

    override func viewDidLoad() {
        super.viewDidLoad()

        let config = WKWebViewConfiguration()
        // First generate a draft using your custom configuration
        let draft = Caravel.getDraft(config)

        // Build your WKWebView as usual then
        self.wkWebView = WKWebView(frame: self.view.bounds, configuration: config)

        // Finally initiate Caravel
        Caravel.getDefault(self, wkWebView: self.wkWebView!, draft: draft, whenReady: {
            // Do whatever you've got to do here
        })

        // ... Load content into your WKWebView there
    }
}

将从 Drekkar 迁移到 Caravel 的应用程序

超级简单。只需使用相同的代码库,并使用 Caravel 中的 JS 脚本。最后,在已加载 Caravel 脚本之后添加以下内容

var Drekkar = Caravel;

故障排除

😕有时候总线不工作?!

首先,确保您正确地使用总线。检查在退出拥有您的网页组件的控制台(无论是 UIWebView 还是 WKWebView)时是否已注销总线。请使用此 注销方法

Caravel会在创建新总线时自动清理任何未使用的总线。然而,此操作在后台运行以避免任何延迟。因此,如果未正确取消订阅总线,可能会发生线程冲突。

但是,如果您认为代码库中一切正常,请随意提交工单。

我想使用自定义的 UIWebViewDelegate。我该怎么做?

为了引发 iOS 事件,Caravel必须是所提供 UIWebView 的代理。然而,如果存在任何现有的代理,Caravel会在设置自己的之前保存它。所以,如果您想使用自己的,只需在调用 Caravel 之前将其设置即可。

我想使用自定的 WKUserContentController。我该怎么做?

为了引发 iOS 事件,Caravel向当前内容控制器添加了一个自定义的 WKScriptMessageHandler。如果您想使用自己的,只需在调用 Caravel 之前将其设置即可。

我应该使用什么对象作为订阅者?

订阅者可以是任何对象,除了监视的目标(要么是 UIWebView 要么是 WKWebView)。我们建议使用控制器作为订阅者(这是一个常见模式)。

保留的名称

CaravelInit 是一个内部事件,由 JS 部分发布,用于触发 whenReady 方法。

此外,默认总线命名为 default。如果您使用此名称用于自定义总线,Caravel 将自动切换到默认的总线。

最后,在使用 WKWebView 时,Caravel 将其脚本消息处理器命名为 caravel

请注意,事件和总线名称是区分大小写的。