-
Notifications
You must be signed in to change notification settings - Fork 10
与 DSBridge‐iOS 的不同
为了实现 WKWebView
的 uiDelegate
,使用原来的 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
,甚至可以使用 struct
和 enum
。
DSBridge-Swift 基于一种高度可定制化的设计,允许你自由修改它的任意部分,甚至无需修改它的源码即足以应对 JavaScript 端的更新。详情参照后文“基本原理和开闭原则”。
一个新的原生调用 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 模式