DHWKWebviewJavascriptAdapter 仿JSContext的WKWebview中间件桥接

RocketMQ原理解读 RocketMQ整个中间件可以分两块,一块是NameServer,保存注册上来的Broker地址信息,另一块是Broker,保存队列消息,直接与发送端或消费者通信。NameServer是一个AP模型的架构。关键代码?Broker是一个CP模型的架构。关键代码?主要涉及3个物理文件commit_log,单个文件1G大小,顺序写入,保持实际消息内容consume_queue,保存消息ID和队列消息存储的offset地址index_file,辅助队列消息轨迹搜索。 阅读详情

DHWKWebviewJavascriptAdapter 仿JSContext的WKWebview中间件桥接

仿照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
    
  2. 使用-dh_registerMiddleware:注册中间件对象

    // 不一定要写在-webView:didFinishNavigation:内
    [webView.configuration.userContentController dh_registerMiddleware:[[DHMiddleware alloc] init]];
    
  3. 设置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

MCGS触摸屏数据记录与U盘导出配置全解析 在工业自动化现场,数据记录是设备运行状态分析与故障追溯的基础。HMI触摸屏作为人机交互核心,不仅承担实时监控任务,还负责过程数据的存储与导出。理解数据采集周期、存盘机制与存储介质的匹配原理,能帮助工程师高效配置数据记录功能。合理运用定时存盘、存盘组与U盘导出,可支撑设备趋势分析、报表生成及事故排查。本文以MCGS触摸屏为例,详解数据记录的完整组态流程,并汇总常见配置陷阱与排查思路,为现场调试与长期运维提供可落地的技术参考。 阅读详情

相关推荐

EPICS pythonSoftIOC教程

EPICS pythonSoftIOC教程

yuyuyuliang00的博客 1521

Rocketmq 踩坑笔记

1、rocketmq安装后一定要配置环境变量 2、所有涉及到的路径名里不能有中文或空格 3、涉及到的日志路径也不能有空格,不然rocketmq会报错找不到。

qq_50909707的博客 313

继电器的选型规范

触点是继电器中最重要的结构件,触点的使用寿命受触点材料、触点上的电压及电流值(特别是接通时及断开时的电压、电流波形)、负载种类、切换频率、环境情况、接触形式、触点回跳现象等的影响,触点失效多以触点的材料转移、粘连、异常消耗、接触电阻增大等故障现象出现,使用时需要注意。为了稳定工作, DC 型继电器的线圈两端所加电压推荐使用波纹变化率小于±5%的线圈额定电压,否则继电器会工作不稳定,引起触点的粘接或异常损耗,特别是在继电器的驱动电路上连接有电动机、螺线管、变压器等器件时,这种情况更为明显。

qq_43416206的博客 1879

RocketMQ4.2.0-参数配置解析- MQAdmin命令参数大全

名称选项必填参数含义UpdateTopicSubCommandupdateTopic:Update or create topic pFALSEpermset topic's permission(2|4|6), intro[2:W 4:R; 6:RW]bFALSEbrokerAddrcreate topic to which brokerrFALSEreadQueueNumsset read q...

lonsonlee的专栏 5224

谐振电路原理与应用场景全解析

本文全面解析了谐振电路的原理、类型及其核心应用。详细阐述了串联谐振与并联谐振的工作特性,并重点介绍了其在无线通信调谐、音频处理分频以及电力系统滤波与无功补偿等关键场景中的实际作用。通过公式推导与实例分析,帮助读者深入理解LC谐振的选频与能量交换机制。

t1u2v的博客 839

微波传感器 - 从原理到实战,解锁非接触感知新维度

本文深入解析微波传感器的工作原理,重点阐述了其基于多普勒效应的非接触感知机制,并对比了红外、超声波等技术的优劣。通过树莓派Pico与RCWL-0516模块的实战案例,展示了如何构建区域入侵检测器,并探讨了微波传感器在智能家居、工业自动化及汽车电子等领域的广阔应用前景。

weixin_29306571的博客 223

mqadmin命令的使用

请注意,实际的返回信息可能会比较复杂,并且可能需要一定的 RocketMQ 知识才能正确解读。如果你在解读返回信息时遇到困难,我建议查阅 RocketMQ 的官方文档或者寻求社区的帮助。如果想要获取具体的返回内容,你需要在具体的 RocketMQ 环境中执行该命令。总的来说,这个命令的主要作用就是允许你创建或者更新 RocketMQ 中的主题,通过调整各种参数来调整主题的特性和性能。命令的帮助信息,这个命令用于更新或创建 RocketMQ 的主题。是一个命令行工具,用于检查指定主题的状态信息。

u011197085的博客 2451

华为od 面试八股文_C++_04_含答案

华为od 面试八股文_C++_04_含答案

MISAYAONE的博客 2472

5K带你学习RocketMQ4源码解析之NameServer

本章基于rocketmq4.6.0分析nameserver的实现。nameserver的基础概念不再赘述,可以参考官网。本章将分析以下内容:后续分析不会再看nameserver侧,有个概念即可。nameserver侧比较简单,一共不超过10个类。NamesrvStartup:启动类,读取配置,构造NamesrvController启动;NamesrvController:管理nameserver所有组件,比如:通讯server、kv配置管理、路由信息管理等;KVConfigManager:kv配置管理,kv

wdj_yyds的博客 242

黑猫带你学UFS协议第12篇:UFS标志(Flags)和属性(Atrributes)详解

UFS中的标志其实就是一些开关,布尔型,非0即1,打开或者关闭。这些标志可以用来使能或者禁止UFS设备的一些功能、模式或者状态。 简单来说,flag和attribute、discriptor一样,都是ufs的寄存器罢了。只不过spec将这些寄存器分类了,分成这三种大的类型了而已。 标志可以被清除、复位、设置、触发、读。 主机也是通过设备管理器的Query Request UPIU来读取或者写标志。

黑猫奥利奥的博客 2083

10. 重磅!Spring AI 1.0 正式发布,Java 开发者的 AI神器!

重磅!Spring AI 1.0 正式发布,Java 开发者的 AI神器! 全网最详细的Spring AI 文章,每章都会提供代码入口,让你更容易得入门和理解Spring AI 相关概念,直接节约你百分之六十的学习成本时间。

gorgor在码农 1065

源码分析RocketMQ之NameServer

这里是有读写锁进行并发控制,使用非线程安全容器存储key namespace value map key, value。加载 kvConfigPath 路径C:\Users\asus\namesrv\kvConfig.json 文件。通过file读取文件,将读取到的内容加载进configTable缓存中。persist printAllPeriodically 持久化配置。deleteKVConfig 删除配置。getKVConfig 获取配置。putKVConfig 添加。

liangshf520的博客 294

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【RocketMQ 九】mqadmin命令

在mq解压目录的bin目录下有一个mqadmin命令,该命令是一个运维指令,用于对mq的主题,集群,broker 等信息进行管理。

泯灭于众生,高歌于孤夜! 2358

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java sendcommand_Java SendMsgStatusCommand类代码示例

import org.apache.rocketmq.tools.command.broker.SendMsgStatusCommand; //导入依赖的package包/类public static void initCommand() {initCommand(new UpdateTopicSubCommand());initCommand(new DeleteTopicSubCommand(...

weixin_39949584的博客 176

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RocketMQ-NameServer详解

Broker 消息服务器在启动时向所有 NameServer 注册,消息生产者(Producer)在发送消息之前先从 NameServer 获取 Broker 服务器地址列表,然后根据负载算法从列表中选择一台消息服务器进行消息发送。NameServer 与每台 Broker 服务器保持长连接,并间隔 30s 检测 Broker 是否存活,如果检测到 Broker 从路由注册表中将其移除,但是路由变化不会马上通知消息生产者。为什么要这样设计呢?

ALONG的博客 1762

RocketMQ源码分析(一)NameServer

目录2. 源码分析2.1 环境搭建2.1.1 源码拉取2.1.3 调试1)启动NameServer2)启动Broker4)消费消息2.2 NameServer2.2.1 架构设计2.2.2 启动流程步骤二步骤三2.2.3 路由管理2.2.3.1 路由元信息2.2.3.2 路由注册2)处理心跳包2.2.3.3 路由删除2.2.3.4 路由发现2.2.4 小结 2. 源码分析 2.1 环境搭建 依赖工具 JDK :1.8+ Maven IntelliJ IDEA 2.1.1 源码拉取 从官方仓库 https

LeslieGuGu的博客 429

RocketMQ 配置详解

本文详细介绍了RocketMQ分布式消息中间件的核心配置项,包括NameServer基础配置(端口、日志设置)、Broker存储与主从配置(路径、刷盘策略、复制方式)、Producer/Consumer性能参数(超时、重试、并发控制)以及高级功能(事务消息、顺序消息、延迟消息)。针对生产环境,建议主从分离部署,关键业务采用同步刷盘,并合理设置文件保留时间。这些配置项涵盖了RocketMQ的核心功能模块,为系统部署和性能调优提供了详细指导。

weixin_39956506的博客 1968

RocketMQ系列:mqadmin命令行使用总览

1.介绍 rocketmq由consumer,producer,broker三大块组成,如何对这三类服务进行运维操作呢?这里介绍rocketmq自带的命令行工具:mqadmin 2.位置 项目:https://github.com/apache/rocketmq.git ${PWD}/rocketmq/distribution/bin/mqadmin 3.脚本 3.1 mqadmin #这里ROCKETMQ_HOME对应的是rocketmq的主目录 if [ -z "$ROCKE..

公众号-测试生财 3202

RocketMQ源码分析之NameServer

1、RocketMQ组件概述 NameServer NameServer相当于配置中心,维护Broker集群、Broker信息、Broker存活信息、主题与队列信息等。NameServer彼此之间不通信,每个Broker与集群内所有的Nameserver保持长连接。 2、源码分析NameServer 本文不对 NameServer 与 Broker、Producer 集群、Cons...

中间件兴趣圈 1万+

RocketMQ NameServer源码剖析

NameServer是一个简单的 Topic 路由注册中心,支持 Topic、Broker 的动态注册与发现。Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;路由信息管理,每个NameServer将保存关于 Broker 集群的整个路由信息和用于客户端查询的队列信息。Producer和Consumer通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。

知识分享官 373

RocketMQ系列:搭建3m-noslave模式的rocketmq集群

利用6台机器搭建一个3分片的broker集群,一共有3个broker实例(3m),采用同步刷屏模式 1.引言 本文主要介绍如何在三台机器上搭建一个3m(无slave节点的)rocketmq的集群。 2.环境准备 机器名 机器IP 机器配置 备注 nameserver1 192.168.11.1 4C4G nameserver2 192.168.11.2.

公众号-测试生财 665

rocketmq学习过程中踩过的坑总结

1.连接异常前几天在虚拟机上部署了rocketmq,一切正常,今天把rocketmq搬到了我的云主机上,一直报错Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to &lt;10.19.73.64:10911&gt; failed反复检查了好几遍,根本没发现什么问题,也没在哪里配...

qq_23603437的博客 6230

Could not create a validated object, cause: ValidateObject failed

这个是创建数据库连接池的数据库连接时会执行一个sql来判断下连接是否正常, 如果那个sql执行没有成功就会报这个错。仔细确认那个sql能执行获取到一行数据。

shy_snow的专栏 1396

全站最硬核 百万字强肝RocketMq源码 火热更新中~(六十四)

org.apache.rocketmq.common.admin.OffsetWrapper offsetWrapper的信息: private long brokerOffset; private long consumerOffset; private long lastTimestamp; broker的进度,消费者consumer的进度和上次更新的时间戳 @Override public ClusterInfo examineBrokerClusterInfo() throws Interrup

自救 唯有自强 408

Cannot get a connection, pool exhausted, cause: ValidateObject failed

连接池突然不能使用了,重启应用仍然报连接池耗尽,最后debug发现是有人创建了dual表,导致校验语句select 1 from dual返回值为空,而无法通过连接池的连接校验。 Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted at org.apa...

shy_snow的专栏 606
上一篇: XcodeAutoPackage 自动化打包
下一篇: Serendipity 自动打包上传、Xcode相关文件管理
daniel_xing
博客等级 码龄14年 4粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值