DHWKWebviewJavascriptAdapter 仿JSContenx的WKWebview中间件桥接

DHWKWebviewJavascriptAdapter

仿照JSContext的处理方式,适用于WKWebview的JS中间件处理

优点:

  • 优雅的替换UIWebview的JSContext中间件
  • 简单易用,耦合性低

集成方式

pod 'DHWKWebviewJavascriptAdapter'

使用方法

  1. 创建继承 DHJavascriptExport 的协议再创建中间件并遵循该协议

    #import "DHWKWebviewJavascriptAdapter.h"
    @protocol DHMiddlewareExport <DHJavascriptExport>
    /// js对应方法名为methodName
    - (void)methodName:(id)param;
    @end
      
    @interface DHMiddleware : NSObject <DHMiddlewareExport>
    @end
    @implementation DHMiddleware
    + (DHJavascriptBridgeType)dh_javascriptBridgeType { 
      return DHJavascriptBridgeType_AllNeed; 
    }
    - (void)methodName:(id)param {...} 
    @end
    
  1. 使用-dh_registerMiddleware:注册中间件对象

    // 不一定要写在-webView:didFinishNavigation:内
    [webView.configuration.userContentController dh_registerMiddleware:[[DHMiddleware alloc] init]];
    
  1. 设置webView.navigationDelegate且实现-webView:didFinishNavigation:

应用场景

> 适用于javascript与iOS的交互场景

> js
// 正常与iOS发送信息的方式
window.webkit.messageHandlers.jsMethodName.postMessage("");

> oc
// DHMiddleware.m
+ (DHJavascriptBridgeType)dh_javascriptBridgeType { 
  return DHJavascriptBridgeType_AllNotNeed; 
}
// 以下两个方法都可作为响应
// 请勿同时定义在协议内!一旦都注册,将随机一直响应其中一个方法(基于遍历协议方法列表的先后顺序)
- (void)jsMethodName:(id)param {...} 
- (void)jsMethodName {...}

#################################
#################################

> js
// 定义中间件发送信息的方法
window.dh_identifity.jsMethodNameWithP1P2P3("p1", "p2", "p3");

> oc
// DHMiddleware.m
+ (NSString *)dh_javascriptIdentifier {
   return @"dh_identifity";
}
+ (DHJavascriptBridgeType)dh_javascriptBridgeType { 
  return DHJavascriptBridgeType_AllNeed; 
}
// 以下四个方法都可作为响应
// 请勿同时定义在协议内!一旦都注册,将随机一直响应其中一个方法(基于遍历协议方法列表的先后顺序)
// js传递过来将作为数组参数接收
- (void)jsMethodNameWithP1P2P3:(id)params {...}
// 参数将依次接收
- (void)jsMethodNameWithP1:(id)p1 p2:(id)p2 p3:(id)p3;
// js传递过来的参数将抛弃p3参数
- (void)jsMethodNameWithP1:(id)p1 p2P3:(id)p2  {...}
// js传递过来的参数将抛弃p3参数
- (void)jsMethodNameWithP1P2:(id)p1 p3:(id)p2  {...}

处理机制

  • oc方法名对应js方法以:分割,后续以首字母大写进行拼接,例:oc方法myMethod:param:对应js方法myMethodParam
  • 对于js自定义标识发消息的方式,oc会注入等价方法的js,oc维护相关js的注入以及匹配对应oc方法的缓存池

已知问题

  • 当同一类存在多个对象时,替换方法将只在该类第一个对象生效后续的对象将不注入脚本。
    • 例如:存在网页控制器DHWebview,跳转到下一个DHWebview,后续将不再注入脚本
    • 解决方案:
      1. 全局定义宏DH_WKWEBVIEW_NOT_SWIZZLING
      2. -webView:didFinishNavigation:中使用-dh_injectJavascriptIfNeed进行手动注入

Github DHWKWebviewJavascriptAdapter

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 进入15年以后,在我们天朝越来越流行混编!尤其是腾讯的 变态APP微信小程序一出,撑起了混编的半边天! 废话不多说...
    白水灬煮一切阅读 1,256评论 0 2
  • 前言 关于UIWebView的介绍,相信看过上文的小伙伴们,已经大概清楚了吧,如果有问题,欢迎提问。 本文是本系列...
    CoderLF阅读 9,011评论 2 12
  • 知识点1:self.jsContext = [self.webView valueForKeyPath:@"doc...
    helinyu阅读 1,474评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,552评论 16 22