SAWebBridge 1.0.3

SAWebBridge 1.0.3

Sarkizz 维护。



  • sarkizz

SAWebBridge

关于

SAWebBridge是基于WKWebView的UIDelegate协议方法

webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt: defaultText: initiatedByFrame: completionHandler

来实现的交互。

为了实现同步数据交互,放弃了WKWebView自带的JS交互。不过JS注入仍然使用常规方式。

使用

  • WebView
    • 自定义一个继承自WKWebView的子类,并遵循SAWebViewProtocol协议,实现协议方法。
    • 创建自定义子类对象,并将UIDelegateNavigationDelegate设置为SAWebViewUIDelegateHandlerSAWebViewNavigationDelegateHandler对象或其子类。
    • 自定义对不同类型事件的处理,处理完毕后一定要调用result回调函数来通知H5事件处理结果(可重复调用)
  • H5
    • 调用 window.jsbridge.init() 来初始化,如需在初始化后做配置,则可以在调用 init() 之前,先设置jsbridgeonInited函数。由于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是小程序通知主应用的接口。
  • 小程序
    • 非主应用的注入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提交成功了,但至今无法搜到。