React Native 自定义原生 (Swift) UI Componet (聊天UI)

最近把 Aurora-IMUI 的 UI 库支持到 React Native 上,其中开发过程中走了一些弯路,这里做个分享。

React Native 自定义原生 (Swift) UI Componet (聊天UI)_第1张图片

(Gif 录制效果不太好。。。。)现已经同时支持 iOS,Android 欢迎 PR。

如何在 React Native 中使用 OC 编写的 UI 库

如果你的原生代码使用 OC 代码来实现的那么参考这个教程就能满足你的需求 iOS 原生UI组件。

如何把 Swift 编写的 UI 库以模块的方式提供

如果你的类库使用 Swift 来实现的,如果你想把它以一种模块方式提供给开发者,看完本篇教程你就懂了(下面内容假设你已经看过这篇文章 iOS 原生UI组件)。

  • 要让 OC 使用 Swift 中的类库,需要 #import "youProjectName-Swift.h" 这个头文件,这样就可以在 OC 中使用 Swift 定义的类库了可以参考这篇文章。
  • 这里希望这个库打包成模块,这样开发者使用起来会更加方便。
    • 新建工程,用于编译模块如图所示
React Native 自定义原生 (Swift) UI Componet (聊天UI)_第2张图片

由于 Swift 代码只能打包成 Framework。所以需要把所有 Swift 代码打包成 framework,。好的试试把所有的代码打包到 framework 里面。但是这样会有问题,程序运行的时候应用并没有把这个模块加载到模块列表中。
看下 RCT_EXPORT_MODULE() 的代码,实际代码如下。

RCT_EXTERN void RCTRegisterModule(Class);
+ (NSString *)moduleName { return @"";
}
+ (void)load {
  RCTRegisterModule(self);
}
// RCTBridge.m
static NSMutableArray *RCTModuleClasses;
void RCTRegisterModule(Class);
void RCTRegisterModule(Class moduleClass)
{
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    RCTModuleClasses = [NSMutableArray new];
  });

  RCTAssert([moduleClass conformsToProtocol:@protocol(RCTBridgeModule)],
            @"%@ does not conform to the RCTBridgeModule protocol",
            moduleClass);

  // Register module
  [RCTModuleClasses addObject:moduleClass];
}

这段代码的意思是 load 代码的时候会把这个模块类加载到 ReactNative 的全局 模块队列 RCTModuleClasses 中。
如果我们的模块代码在 framework 中那么就不能加到这里面去,既然如此,我们就可以在新建一个 TARGET , 单独编译我们的模块代码(包含 RCT_EXPORT_MODULE() 代码的类)如下图所示。

React Native 自定义原生 (Swift) UI Componet (聊天UI)_第3张图片

这样模块类就能成功的加载到 ReactNative 中的模块类列表了。

这里只是列出主要的方法, 过程中肯定会出现各种报错,这些自行 google 都好解决。

你可能感兴趣的:(React Native 自定义原生 (Swift) UI Componet (聊天UI))