SAWebBridge
关于
SAWebBridge是基于WKWebView的UIDelegate协议方法
webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt: defaultText: initiatedByFrame: completionHandler
来实现的交互。
为了实现同步数据交互,放弃了WKWebView自带的JS交互。不过JS注入仍然使用常规方式。
使用
-
WebView
- 自定义一个继承自
WKWebView
的子类,并遵循SAWebViewProtocol
协议,实现协议方法。 - 创建自定义子类对象,并将
UIDelegate
和NavigationDelegate
设置为SAWebViewUIDelegateHandler
和SAWebViewNavigationDelegateHandler
对象或其子类。 - 自定义对不同类型事件的处理,处理完毕后一定要调用
result
回调函数来通知H5事件处理结果(可重复调用)
- 自定义一个继承自
-
H5
- 调用
window.jsbridge.init()
来初始化,如需在初始化后做配置,则可以在调用init()
之前,先设置jsbridge
的onInited
函数。由于onInited
函数是一个异步的回调,因此最好使用Promise
。 - 调用同步函数
const rs = $jssdk('sync.<#name#>', params)
来通知原生端处理同步事件,并返回结果 - 调用异步函数
$jssdk('async.<#name#>', params, p => {}).then().catch()
来通知原生端处理异步函数,并返回结果。p => {}
是进度回调。
- 调用
-
主应用
- 主应用是在App启动时优先加载的H5页面,承载主要交互功能。建议将主应用的
WebViewController
设置为单例。 SAWebNotificationManager
在初始化时需要设置一个main
参数,用于处理原生端对H5页面的通知逻辑和回调。建议将此参数设置为主应用的web。- 主应用H5初始化完成后,可以调用
$register('event.<#name#>', (id, params) => {}
和$register('api.<#name#>', (id, params) => {}
来注册原生通知给H5页面的事件。在回调中使用$resolve(id, <#data#>)
和$reject(id, <#code: String#>, <#msg: String#>)
返回处理结果。 event
是原生主动通知H5页面的事件,而api
是小程序通知主应用的接口。
- 主应用是在App启动时优先加载的H5页面,承载主要交互功能。建议将主应用的
-
小程序
- 非主应用的注入SDK的H5页面可以视为小程序(无论页面来自本地还是服务器)。
- 小程序可以通过调用
$jssdk(sync/async.<#name#>)
实现与原生的同步异步交互,操作方法与主应用相同。 - 小程序可以通过调用
$jssdk('api.<#interface#>', params).then().catch()
来通知主应用处理事件。API接口必须在主应用中注册过,否则无效。
LocalStorage
- 介绍在使用
webView
初始化时,可以配置是否hook
H5页面的LocalStorage存储。为了防止主应用和各个小程序之间的存储相互影响,建议配置为true。 - SALocalStorageProtocol 协议遵循的都可以成为存储器,默认提供一个使用
UserDefault
作为存储器的实现。 - 通过
SAWebViewProtocol
协议的localStorageIdentifier()
方法,可以为各个H5页面配置存储id,用于区分它们各自的数据。
遗留问题
- 通知的注册只能由主应用处理,小程序不能作为主体使用。
- 目前无法自定义交互协议。
- 不知道为什么,pod提交成功了,但至今无法搜到。