Skip to content

与 DSBridge‐iOS 的不同

iMoeNya edited this page Apr 23, 2024 · 1 revision

无感的 WKWebView 体验

为了实现 WKWebViewuiDelegate,使用原来的 DSBridge-iOS 时,开发者必须设置 dsuiDelegate,而非 uiDelegate;而使用 DSBridge-Swift,你可以直接设置 uiDelegate

原来的 dsuiDelegate 无法对新推出的方法生效,比如 iOS 16.4 推出的新 API:

@available(iOS 16.4, *)
func webView(
    _ webView: WKWebView,
    willPresentEditMenuWithAnimator animator: any UIEditMenuInteractionAnimating
) {
        
}

即便你设置了 dsuiDelegate 并且实现了这个方法,在网页选中文本、弹出编辑栏的时候,这个方法仍然不会被调用。原因是按照 DSBridge-iOS 的设计,WKUIDelegate 中任何一个方法都必须由库的作者先在 DWKWebView 中实现一遍,它才能转发给 dsuiDelgate

甚至它默认的弹窗实现使用 UIAlertView 现在还会导致崩溃。

DSBridge-Swift 选择不站在开发者和 WKWebView 之间。DSBridge-Swift 以一种中间人的形式捕获了来自 JS 的调用,而将其他的代理方法转发给开发者自己设置的 WebView.uiDelegate,由开发者自己决定是否实现、怎么实现。

因此 DSBridge-Swift 中没有 dsuiDelegate ,请直接设置 uiDelegate

静态,而非动态

在原来的 DSBridge-iOS 中,你的 JavaScript Object 必须是 NSObject 子类,且每个你要暴露给 JavaScript 的方法都需要标注 @objc;而在 DSBridge-Swift 中,你可以用纯 Swift 的类而不需要继承 NSObject,甚至可以使用 structenum

可定制化

DSBridge-Swift 基于一种高度可定制化的设计,允许你自由修改它的任意部分,甚至无需修改它的源码即足以应对 JavaScript 端的更新。详情参照后文“基本原理和开闭原则”。

API 变化

新增

一个新的原生调用 JavaScript 的方法,你可以传入你期望的返回值的类型,方法返回 Result<T, Error> 而不是 Any

call<T>(
    _: String, 
    with: [Any], 
    thatReturns: T.Type, 
    completion: @escaping (Result<T, any Swift.Error>) -> Void
)

重命名

  • callHandler 现在重命名为 call
  • 移除 setJavascriptCloseWindowListener,请直接给 dismissalHandler 赋值
  • addJavascriptObject 改名为 addInterface
  • removeJavascriptObject 改名为 removeInterface

移除

  • 移除了 loadUrl(_: String),如果有需要请自行声明

  • 移除了 onMessage,原库在注释中禁止开发者调用这个方法,希望你没有调用

  • 综上“无感的 WKWebView 体验”所述,移除了:

    • dsuiDelegate
    • disableJavascriptDialogBlock
    • customJavascriptDialogLabelTitles
    • 所有 WKUIDelegate 的方法的实现

暂未实现

  • debug 模式
Clone this wiki locally