在开发 Lynx 应用时,可能会遇到需要与 Lynx 未涵盖的原生平台 API 进行交互的场景。或者,你或许希望复用现有的原生平台代码到 Lynx 应用中。无论出于何种原因,都可以借助原生模块,实现 JavaScript 代码与原生代码的无缝连接,进而在 JavaScript 代码里调用原生平台的功能和 API。下面将详细介绍如何编写一个原生模块。
编写原生模块的基本步骤:
下面,将通过构建一个原生模块示例,逐步展示这些步骤。
原生模块目前只能在 Background Thread Scripting 中使用。
本指南旨在展示如何编写一个本地持久存储模块,让 Lynx 应用能够利用 JavaScript 代码在本地持久地存储数据。
要在移动设备上实现本地持久存储功能,需要借助 Android 和 iOS 的原生 API:
原生模块的接口规范是连接原生代码和 Lynx JavaScript 运行时的桥梁,它定义了两者之间传递的方法和数据类型。
声明接口规范的步骤如下:
src/typing.d.ts
的新文件。typing.d.ts
文件中实现原生模块的接口规范。可以在类型对照表中查看规范中可用的类型以及对应的原生类型。
以下是本地持久存储模块的接口规范实现:
NativeModules
是 Lynx 在 JavaScript 运行时中提供的全局内建对象,它是所有原生模块的访问入口,所有原生模块的声明需定义在其中。
接下来,在 Lynx 项目的 src/App.tsx 文件中编写应用代码。
以下是本地持久存储模块的 App.tsx 示例,它包含一个用于显示本地存储内容的区域,以及三个用于读写和清除本地存储的按钮。
现在可以开始编写原生平台代码了。
首先参照为 iOS 构建 Lynx Explorer 指南在本地创建 Lynx Explorer 项目,并用 Xcode 打开项目。
接着在 Lynx Explorer 项目的 modules
文件夹上右键点击,选择 New Fie...
创建原生模块代码文件。
然后使用 Cocoa Touch Class
模板。
将类命名为 NativeLocalStorageModule
,语言你可以选择创建 Objective-C
,也可以选择 Swift
。接着点击 Next
,完成文件的创建。
原生模块需要实现额外的静态方法 name
,返回原生模块的导出名字;实现额外的静态方法 methodLookup
,将需要导出的方法名和对应的选择器进行映射。
接下来将原生模块注册到 Lynx 运行时环境中。
在 Lynx Explorer 工程的 explorer/darwin/ios/lynx_explorer/LynxExplorer/LynxInitProcessor.m
文件的 setupLynxEnv
方法中添加如下注册代码,将原生模块注册到 Lynx 运行时环境的全局配置中。
准备好所有内容后,现在可以构建运行你的代码:
首先参照编译和运行 iOS Lynx Explorer 指南构建 Lynx Explorer,并安装到你的手机上。
接着参考安装依赖&启动开发服务器指南,在 Lynx 项目根目录下安装依赖并且启动开发服务器。
安装依赖:
启动开发服务器:
你将会看到控制台中看到二维码和产物链接,使用 Lynx Explorer 扫描二维码或者填写产物链接即可打开你的 Lynx 页面。
恭喜你,成功在 Lynx Explorer 中创建了原生模块!如果你想在你的应用中创建原生模块,首先需要参考接入现有应用指南集成 Lynx,然后参照上述步骤创建原生模块。
TypeScript | iOS(Objective-C) | Android(Java) |
---|---|---|
null | nil | null |
undefined | nil | null |
boolean | BOOL (or NSNumber when used inside objects) | boolean (or Boolean when used inside objects) |
number | double (or NSNumber when used inside objects) | double (or Number when used inside objects) |
string | NSString | String |
BigInt | NSString | long (or Number when used inside objects) |
ArrayBuffer | NSData | byte[] |
object | NSDictionary | com.lynx.react.bridge.ReadableMap |
array | NSArray | com.lynx.react.bridge.ReadableArray |
Callback ()=> | block void (^)(id) | com.lynx.react.bridge.Callback |