Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

License

NotificationsYou must be signed in to change notification settings

DanielHusx/DHWKWebviewJavascriptAdapter

Repository files navigation

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

优点:

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

集成方式

pod'DHWKWebviewJavascriptAdapter'

使用方法

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

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

    // 不一定要写在-webView:didFinishNavigation:内[webView.configuration.userContentControllerdh_registerMiddleware:[[DHMiddlewarealloc]init]];
  3. 设置webView.navigationDelegate且实现-webView:didFinishNavigation:

应用场景

>适用于javascript与iOS的交互场景>js// 正常与iOS发送信息的方式window.webkit.messageHandlers.jsMethodName.postMessage("");>oc// DHMiddleware.m+(DHJavascriptBridgeType)dh_javascriptBridgeType{returnDHJavascriptBridgeType_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{returnDHJavascriptBridgeType_AllNeed;}// 以下四个方法都可作为响应// 请勿同时定义在协议内!一旦都注册,将随机一直响应其中一个方法(基于遍历协议方法列表的先后顺序)// js传递过来将作为数组参数接收-(void)jsMethodNameWithP1P2P3:(id)params{...}// 参数将依次接收-(void)jsMethodNameWithP1:(id)p1p2:(id)p2p3:(id)p3;// js传递过来的参数将抛弃p3参数-(void)jsMethodNameWithP1:(id)p1p2P3:(id)p2{...}// js传递过来的参数将抛弃p3参数-(void)jsMethodNameWithP1P2:(id)p1p3:(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进行手动注入

MIT LICENSE

About

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

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp