集赞获纸质版《作战地图》
报名 WICC 出海嘉年华
作为即时通讯云的领创品牌,融云的通讯云产品广泛地服务于社交沟通、直播互动、实时社区、商业沟通等场景。移步【融云全球互联网通讯云】回复“地图”免费领
跟着运用场景的丰富和开发框架的发展,原生双渠道开发明显已经难以满足需求。融云推出了跨渠道 SDK,一套代码运用于多个渠道,为不同渠道用户供给共同体会,赋能全渠道、多语言开发。
本文首要共享融云跨渠道研制团队经过技能手段主动生成跨渠道 SDK,使其更快适应原生 SDK 的发版节奏,为开发者供给更好体会的探究实践。
平铺接口
融云跨渠道 SDK 支持 uni-app、Flutter、RN、Unity 等多个干流渠道,涵盖 IM、RTC 双核心通讯服务的功用。
经过跨渠道 SDK,融云为开发者供给共同的功用和接口,让开发者无需在各个渠道间纠结于不同的接口调用。一切都依据原生接口进行封装实现,供给相应渠道的功用插件,差异仅在于所运用的开发语言。
为了在适配多个渠道的过程中削减重复作业,提高功率,融云经过平铺接口和代码主动生成技 术,对 SDK 中的重复代码进行主动化生成。
融云 SDK 的部分接口是依据面向对象的思维开发的,在历史版别的不断演化中,部分功用存在多端对齐难的问题。为了方便开发者运用 SDK,融云在原生 SDK 基础上进行了一次封装,也便是平铺层接口。
平铺接口具有以下优势:
- 优化历史版别不断演化的功用接口,让开发者无须在相同功用的接口上进行 “断舍离”。
- 抹平 SDK 间的接口差异,确保 SDK 相同的功用在不同设备上保持共同。
- 下沉渠道层的逻辑,包括数据校验、数据整合等操作。
- 供给一套更简洁、更清晰的产品接口。
完结平铺接口层建造后,最终的跨渠道结构如下图所示。渠道层调用平铺接口,再由平铺接口去调用原生 SDK 的功用接口。
主动生成
现在业界干流的代码生成技能分为以下几类:
依据模版编列生成代码:能够依据模板快速生成运用程序代码,开发者只需要重视逻辑开发。
依据可视化 UI 生成代码:将 UI 与命令行绑定,经过拖动 UI 生成对应代码,不过并不适用复杂的项目工程。
依据代码语料生成代码:要有满足的语料,再依据一套生成规矩生成方针代码。
依据人工智能技能生成代码:多和 AI 领域的图像识别和机器学习技能结合。
融云跨渠道 SDK 依据平铺接口调用原生 SDK 功用,以 connect 接口为例,其代码示例如下。
iOS 平铺 SDK connect 接口:
- (NSInteger)connect:(NSString *)token
timeout:(int)timeout
databaseOpened:(nullable void (^)(NSInteger code))databaseOpenedBlock
connected:(nullable void (^)(NSInteger code, NSString *userId))connectedBlock;
Android 平铺 SDK connect 接口:
public abstract int connect(String token, int timeout, RCIMIWConnectCallback callback);
public abstract class RCIMIWConnectCallback implements IRCIMIWConnectCallback {
@Override
public void onDatabaseOpened(int code) {
}
}
public interface IRCIMIWConnectCallback {
void onConnected(int code, String userId);
void onDatabaseOpened(int code);
}
Flutter 平铺 SDK connect 接口:
Future<int> connect(String token, int timeout, {RCIMIWConnectCallback? callback})
class RCIMIWConnectCallback {
RCIMIWConnectCallback({this.onDatabaseOpened, required this.onConnected});
Function(int? code)? onDatabaseOpened;
Function(int? code, String? userId) onConnected;
}
不难发现,这组代码在方法名、返回值类型、参数类型、参数名等方面均存在相似之处,具有必定的规矩性,可依据 iOS 和 Android 的代码来推导出 Flutter 代码。因此,融云选择依据代码语料主动生成代码的技能道路,流程如下:
生成渠道结构信息
运用融云技能团队自研的工具扫描 iOS 和 Android 渠道的接口信息,包括类名、包名、包括的属性、包括的方法等将 SDK 内一切的类信息,而且依据这些信息生成一个结构信息。
兼并结构信息
兼并结构信息能够查看两个类是否共同,协助我们做一次校验作业。
而且,跨渠道 SDK 最终要包括两个渠道,将相同的信息兼并到一个当地,能够更好地协助我们进行后续处理。在兼并的同时,还会再次生成一份结构信息,这个结构信息扔掉了 iOS 和 Android 的语法概念,只保存单纯的结构信息,以便给生成跨渠道层 SDK 运用。
以枚举来举例展示兼并方式。
Android 枚举:
public enum RCIMIWMessageOperationPolicy {
/*本地*/ LOCAL,
/*远端*/ REMOTE,
/*本地和远端*/ LOCAL_REMOTE,}
iOS 枚举:
typedef NS_ENUM(NSUInteger, RCIMIWMessageOperationPolicy) {
RCIMIWMessageOperationPolicyLocal = 0,
RCIMIWMessageOperationPolicyRemote = 1,
RCIMIWMessageOperationPolicyLocalRemote = 2,
};
调查上面的信息能够发现如下规矩:
Android 直接展示枚举名字,但多个单词存在分隔符;iOS 是类名加枚举名字。
兼并时可对 Android 去掉下划线和 iOS 去掉类名后的内容进行比对,判断二者是否相同,然后生成 RCIMIWMessageOperationPolicy 的结构信息。
类名:RCIMIWMessageOperationPolicy
枚举:[local,remote,localRemote]
ios枚举信息:...
android枚举信息...
...
导入装备信息
完结上述兼并结构信息后,再将一些特别的装备信息兼并到结构信息中,比如 Android 渠道需要装备的一些三方推送信息等。
生成 SDK
至此,我们便得到了一份完好的结构信息,只需结合跨渠道层的 SDK 模板,即可将一切信息生成到对应的文件中。
如上图示,在 Flutter SDK 中将一切的枚举生成到 rongcloud_im_enum.dart 中, 接口生成到 rongcloud_im_engine.dart 中,类信息生成到 rongcloud_im_classes.dart 中……
整个过程中,只需要在平铺接口进行 SDK 功用增加即可,无需在跨渠道 SDK 上做任何操作,相应的接口就会主动生成到跨渠道 SDK 上,极大提高开发功率,实现在低人力投入的前提下持续向开发者交付最新版别 SDK 的方针。