共计 2991 个字符,预计需要花费 8 分钟才能阅读完成。
集赞获纸质版《作战地图》
报名 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 的指标。