基于OC端的Bridge-API组件化应用

news2024/12/28 5:33:22

前言

在移动应用开发中,组件化可以提高代码的模块化和重用性,降低耦合度。当下大部分APP都至少包含一到两种Hybrid框架,H5基本是必要的,还可能叠加React Natvie、Weex或Flutter。

对于Hybird来说,Native的很多能力是其不具备的,需要通过各自的 Bridge / Plugin 来实现功能扩展,经过长时间的迭代后会产生大量的API。API的组件化可以让不同Hybrid平台甚至不同的APP使用同一份组件代码,抹平了跨平台以及跨应用的API实现差异,降低了API与工程的耦合度,同时也有利于API的统一管理,降低维护成本。

一、组件分类

将属性相同的API归为同一个组件。

二、组件设计

1、制定API参数标准

1)入参规范

{
    "pluginName": "http",  // 组件名
    "methodName": "dataRequest",  // 接口名
    "parameter": {  // 入参数
        "url": "https://domain/path/api.json",
        "method": "POST",
        "params":"{\"operation\":\"on\"}",
        "content-Type": "application/json"
    },
    "callBackName": "callback_9d12ef83c2b245d7"  // JS回调方法
}

 2)出参规范

{
    "code": "0",  // 错误码
    "message": "success",  // 信息
    "keepAlive": 0  // 是否保留回调方法
    "data": {}  // 返回数据
}

2、组件抽象类的定义

3、组件API的调用流程

三、基础建设

1)HybridComponent:组件基类

@protocol HybridComponent <NSObject>
 
@required
+ (NSString *)getName;
 
@optional
- (NSDictionary *)methodsTestData;
- (void)onReady;
- (void)onUnload;
 
@end

 2)HybridDataFormat:通用错误码定义、出参格式化工具

typedef NS_ENUM(NSInteger, HybridErrorCode){
    HybridErrorCodeSuccess            = 0,     // 成功
    HybridErrorCodePluginotExist      = 100001, // 组件不存在
    HybridErrorCodeMethodNotExist     = 100002, // 组件方法不存在
    HybridErrorCodeParamException     = 100003, // 参数异常
};
 
@interface HybridDataFormat : NSObject
 
+ (NSDictionary *)JSONObjectWithCode:(NSInteger)code message:(NSString *)message;
+ (NSDictionary *)JSONObjectWithCode:(NSInteger)code message:(NSString *)message keepAlive:(BOOL)keepAlive;
+ (NSDictionary *)JSONObjectWithData:(id)data code:(NSInteger)code message:(NSString *)message;
+ (NSDictionary *)JSONObjectWithData:(id)data code:(NSInteger)code message:(NSString *)message keepAlive:(BOOL)keepAlive;
 
@end

 3)HybridPluginProtocol:Hybrid容器代理方法

@protocol HybridPluginProtocol <NSObject>
 
#pragma mark - 前端回调 -
- (void)callbackName:(NSString *)callbackName params:(NSDictionary *)params;
 
#pragma mark - 容器能力 -
/// 设置NavigationBar属性 - { bgColor、bgImageName }
- (void)setNavigationBarPropertys:(NSDictionary *)propertys;
 
. . .
 
@end

4)HybridInvokeModel:入参模型(params 、source、Hybrid容器代理、calBack)

5)HybridPluginManager:组件注册、组件注销、API参数配置

6)HybridPluginExecutor:执行API的分发,实现API到组件的具体方法桥接

四、实际应用

1、OC端的组件封装

1)新建Class,继承于HybridComponent

#import "HybridComponent.h"
 
@interface HybridHttp : HybridComponent
 
@end

2) 组件注册 + API实现

#import "HybridHttp.h"
 
@implementation HybridHttp
 
#pragma mark - 组件注册 -
+ (void)load { 
    [[HybridPluginManager sharedInstance] regsiterImpClass:[self class]]; 
}
 
#pragma mark - 组件名称 -
+ (NSString *)getName {
    return @"http";
}

#pragma mark - API测试数据 - 
- (NSDictionary)methodsTestData {
    return @{ @"core.http.dataRequest": @{@"url": @"https://domain/path/api.json"} };
} 

#pragma mark - method - 
METHOD_CHAIN_MOUNT(http, dataRequest)
- (void)dataRequest:(HybridInvokeModel *)invokeModel {
    // do something and callback
    . . .
    if (invokeModel.callBack) {
        invokeModel.callBack([HybridDataFormat JSONObjectWithData:@{@"key": @"value"} code:HybridErrorCodeSuccess message:@"success"]);
    }
}
 
#pragma mark - 生命周期 -
- (void)onReady { }
- (void)onUnload { }
 
@end

2、Web端的API调用

1)上层API的调用方式

function dataRequest() {
    core.http.dataReqeust(parameter: @{url: 'https://domain/path/api.json'},
    callback: (result) => {
        if(result.code) {
            console.log(result.message)
        }   
    })
}

2)底层API的具体实现(JSBridge参数转换、callback方法挂载)

function dataRequest() {
    let apiParams = {url: 'https://domain/path/api.json'}
    let invokeParams = {pluginName: 'http', methodName: 'dataRequest', parameter: JSON.stringify(apiParams), callBackName: 'callback_9d12ef83c2b245d7'}
    window.webkit.messageHandlers.core.postMessage({fuctionName: 'invokeAPI', parameter: JSON.stringify(invokeParams)})
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ae:自动定向

Ae 菜单&#xff1a;图层/变换/自动定向 Auto-Orient 快捷键&#xff1a;Ctrl Alt O 自动定向 Auto-Orient是 Ae 图层中的一个附加的、隐藏实现&#xff08;不会在时间轴面板上更改属性的值&#xff09;的功能&#xff0c;它可以使得图层自动旋转或改变方向以朝向指定的运动路…

HIVE相关操作

HIVE有两种启动方式 方式1&#xff1a; bin/hive 即Hive的Shell客户端&#xff0c;可以直接写SQL方式2&#xff1a; bin/hive --service hiveserver2 后台执行脚本&#xff1a;nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 & bin/hiv…

Vue.js列表渲染指令v-for

目录 一、原理概述 二、基本用法 &#xff08;1&#xff09;v-for循环普通数组 &#xff08;2&#xff09;v-for循环对象 &#xff08;3&#xff09;v-for循环对象数组 &#xff08;4&#xff09;v-for迭代整数 一、原理概述 v-for指令时在模板编译的代码生成阶段实现的…

6.java程序员必知必会类库之pdf处理库

前言 Pdf作为我们办公文件中的一种常用文件格式&#xff0c;很多业务中会涉及到一个功能&#xff0c;是将系统中的某些数据&#xff0c;按照要求的格式生成Pdf文件。比如常见的征信报告&#xff0c;合同文件等等&#xff0c;为此通过java代码&#xff0c;处理PDF格式的文件&am…

Vulnhub项目:Earth

靶机地址&#xff1a;The Planets: Earth ~ VulnHub 渗透过程&#xff1a; 首先查看靶机描述&#xff0c;需要获取2个flag 老样子&#xff0c;确定靶机ip&#xff0c;具体的就不详细写了&#xff0c;看图即可 探测靶机开放端口 如果不进行dns绑定&#xff0c;就会出现下面的…

带你玩转状态机(论点:概念、相关图示、示例代码、适用场景、相关文档)

概念 状态机&#xff08;State Machine&#xff09;是一种用于描述系统在不同状态下的行为及状态之间转换的数学模型。状态机主要由三个部分组成&#xff1a;状态&#xff08;State&#xff09;、事件&#xff08;Event&#xff09;和转换&#xff08;Transition&#xff09;。…

Vue2-黑马(九)

0目录&#xff1a; &#xff08;1&#xff09;router-动态菜单 &#xff08;2&#xff09;vuex-入门 &#xff08;3&#xff09;vuex-mapState &#xff08;1&#xff09;router-动态菜单 我们点击按钮跳转到主页面&#xff0c;主页在制作动态菜单&#xff0c;路由的跳转方…

【PWN】刷题——CTFHub之 简单的 ret2text

萌新第一阶段自然是了解做题的套路、流程&#xff0c;简单题要多做滴 目录 前言 一、checksec查看 二、IDA反汇编 三、exp编写 前言 经典的ret2text流程 一、checksec查看 64位程序&#xff0c;什么保护都没有&#xff0c;No canary found——可以栈溢出控制返回 二、IDA反汇…

SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁

文章目录 1、步骤2、具体过程1、引入pom依赖2、修改配置文件3、单元测试4、测试结果 3、redis运行情况4、项目中实际应用5、加锁解决缓存击穿问题代码一&#xff08;存在问题&#xff09;代码二&#xff08;问题解决&#xff09; 6、新问题7、分布式锁 1、步骤 前提条件&#…

FFmpeg 编译静态库

1. 使用工具 1.1 FFmpeg 官网: 1.2 FFmpeg macOS 官方安装教程: 1.3 Homebreaw 安装网站: 2. Homebreaw 介绍 2.1 简称 brew&#xff0c;在 Mac 平台终端上管理软件包&#xff0c;安装&#xff0c;更新&#xff0c;卸载等软件 2.2 安装 brew&#xff0c;终端执行指令(内部安装…

HTTP协议详解(一)

目录 1.什么是HTTP协议? 2.HTTP的协议格式 使用fiddler抓包工具 理解代理 查看请求内容 3.HTTP请求(Request) 认识URL URL encode 认识method GET方法 POST方法 经典面试题:POST和GET之间的典型区别 其它方法 认识请求 "报头" (header) Host Conte…

Elasticsearch:为日志分析设置安全的 Elasticsearch 管道

在我之前的许多文章中&#xff0c;我已经详细地描述了如何配置如下的管道&#xff1a; 如果你想了解更多&#xff0c;请详细阅读文章&#xff1a; Logstash&#xff1a;Logstash 入门教程 &#xff08;二&#xff09; Elastic&#xff1a;运用 Docker 安装 Elastic Stack 并采…

企业在实施采购管理时需要注意哪些问题?

采购管理是指企业为了获得所需的物资和服务等&#xff0c;通过筛选供应商、谈判合同、执行采购计划等一系列过程来实现目标的管理活动。在实施过程中&#xff0c;采购管理需要注意以下几个问题&#xff1a; 1、采购策略的选择 采购策略的选择是采购管理中非常关键的环节。不同…

分享5款win10小工具,让办公学习井井有条

好用的小工具能让办公学习变得更简单便捷&#xff0c;这里推荐几款实用的Win10小工具。 桌面小工具——Win10 Widgets Win10 Widgets是一款实用的桌面小工具软件&#xff0c;可以让你在桌面上显示各种系统信息。你可以使用Win10 Widgets来查看电源、硬盘、CPU、内存、网络、时…

数据结构_第十三关(1):简单排序算法

【本关目标】 排序的概念常见排序的算法思想和实现排序算法的复杂度以及稳定性分析 目录 【本关目标】 1.排序的概念 2.常见排序的算法思想和实现&#xff08;代码默认都是从小到大排序&#xff09; 2.1插入排序 1&#xff09;直接插入排序 2&#xff09;希尔排序 2.2选…

Java 死锁的原理、检测和解决死锁

什么是死锁 两个或者多个线程互相持有对方所需要的资源&#xff08;锁&#xff09;&#xff0c;都在等待对方执行完毕才能继续往下执行的时候,就称为发生了死锁&#xff0c;结果就是两个进程都陷入了无限的等待中。 一般是有多个锁对象的情况下并且获得锁顺序不一致造成的。 …

微服务+springcloud+springcloud alibaba学习笔记【Spring Cloud Gateway服务网关】(7/9)

Spring Cloud Gateway服务网关 7/9 1、GateWay概述2、GateWay的特性:3、GateWay与zuul的区别:4、zuul1.x的模型:5、什么是webflux:6、GateWay三大概念:6.1,路由:6.2,断言:6.3,过滤: 7、GateWay的工作原理:8、使用GateWay:8.1,建module8.2,修改pom文件8.3,写配置文件8.4,主启动类…

微服务学习——微服务框架

Nacos配置管理 统一配置管理 配置更改热更新 将配置交给Nacos管理的步骤&#xff1a; 在Nacos中添加配置文件在微服务中引入nacos的config依赖在微服务中添加bootstrap.yml&#xff0c;配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个…

Java:JDK对IPv4和IPv6处理介绍

以下以JDK8为例说明对IPv4和IPv6是如何处理的。 一、常用代码 一般情况下&#xff0c;使用如下代码可以获取到域名/主机名对应的多个IP&#xff0c;其中部分是IPv4的&#xff0c;部分是IPv6的&#xff1a; try {InetAddress[] addrs InetAddress.getAllByName(host);for (I…

Quartz框架详解分析

文章目录 1 Quartz框架1.1 入门demo1.2 Job 讲解1.2.1 Job简介1.2.2 Job 并发1.2.3 Job 异常1.2.4 Job 中断 1.3 Trigger 触发器1.3.1 SimpleTrigger1.3.2 CornTrigger 1.4 Listener监听器1.5 Jdbc store1.5.1 简介1.5.2 添加pom依赖1.5.3 建表SQL1.5.4 配置文件quartz.propert…