当前位置: 首页 > news >正文

【大前端】封装一个React Native与Android/IOS 端通用的埋点接口

RN 层只暴露一个统一的埋点方法,例如 trackEvent(eventName, params),内部通过 NativeModule 调用 Android/iOS 的原生埋点 SDK。这样 RN 层不用关心具体实现。

写一个通用的示例:


1. RN 层封装统一接口(JS 代码)

// analytics.js
import { NativeModules, Platform } from 'react-native';const { AnalyticsModule } = NativeModules;const Analytics = {trackEvent(eventName, params = {}) {if (!AnalyticsModule) {console.warn("AnalyticsModule not linked");return;}AnalyticsModule.trackEvent(eventName, params);}
};export default Analytics;

RN 业务里用法:

import Analytics from './analytics';Analytics.trackEvent('button_click', { page: 'home', userId: '12345' });

2. Android 端原生模块

android/app/src/main/java/com/yourapp/analytics/AnalyticsModule.java

package com.yourapp.analytics;import android.util.Log;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;import java.util.HashMap;
import java.util.Map;public class AnalyticsModule extends ReactContextBaseJavaModule {public AnalyticsModule(ReactApplicationContext reactContext) {super(reactContext);}@Overridepublic String getName() {return "AnalyticsModule"; // RN 里调用的名字}@ReactMethodpublic void trackEvent(String eventName, ReadableMap params) {Map<String, Object> map = params.toHashMap();// TODO: 这里替换成你们实际的埋点 SDK 调用Log.d("Analytics", "TrackEvent: " + eventName + " params: " + map.toString());}
}

注册模块 AnalyticsPackage.java

package com.yourapp.analytics;import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.uimanager.ViewManager;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class AnalyticsPackage implements ReactPackage {@Overridepublic List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {List<NativeModule> modules = new ArrayList<>();modules.add(new AnalyticsModule(reactContext));return modules;}@Overridepublic List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {return Collections.emptyList();}
}

MainApplication.java 里注册:

@Override
protected List<ReactPackage> getPackages() {return Arrays.<ReactPackage>asList(new MainReactPackage(),new AnalyticsPackage()  // 注册);
}

3. iOS 端原生模块

ios/AnalyticsModule.m

#import <React/RCTBridgeModule.h>@interface RCT_EXTERN_MODULE(AnalyticsModule, NSObject)RCT_EXTERN_METHOD(trackEvent:(NSString *)eventName params:(NSDictionary *)params)@end

ios/AnalyticsModule.swift(或 .m,我用 Swift 例子):

import Foundation@objc(AnalyticsModule)
class AnalyticsModule: NSObject {@objcfunc trackEvent(_ eventName: String, params: [String: Any]) {// TODO: 替换为 iOS 的埋点 SDK 调用print("TrackEvent: \(eventName), params: \(params)")}
}

✅ 最终效果:
RN 调用 Analytics.trackEvent("xxx", {...})
👉 Android / iOS 走各自原生埋点 SDK。

这样就实现了 RN 与原生端通用的埋点接口

http://www.dtcms.com/a/353030.html

相关文章:

  • 数据结构(C语言篇):(三)顺序表算法题解析
  • FPGA学习笔记——Verilog中可综合和常见的不可综合的系统函数
  • 数据结构:从堆中删除元素 (Deleting from a Heap)
  • 使用Spring Boot和EasyExcel导出Excel文件,并在前端使用Axios进行请求
  • linux-优化命令
  • Linux笔记11——shell编程基础-5
  • 使用appium对安卓(使用夜神模拟器)运行自动化测试
  • 解释器模式及优化
  • HIVE的Window functions窗口函数【二】
  • flume监控文件写入 Kafka 实战:解耦应用与消息队列的最佳实践
  • 性能测试-jmeter实战6
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(21):文法+单词第7回3
  • 学习嵌入式的第二十八天——线程
  • 趣味学Rust基础篇(变量与可变性)
  • RCLAMP0504M.TBT电子元器件Semtech 低电容、四通道TVS二极管阵
  • Web漏洞
  • More Effective C++条款12:理解抛出一个异常与传递一个参数或调用一个虚函数间的差异
  • 火焰传感器讲解
  • 函数指针的简化
  • 毕业项目推荐:27-基于yolov8/yolov5/yolo11的电塔缺陷检测识别系统(Python+卷积神经网络)
  • MCP模型库深度解析:AI智能体工具调用生态的多元化与规模化发展
  • SciPy科学计算与应用:SciPy图像处理入门-掌握scipy.ndimage模块
  • 1 vs 10000:如何用AI智能体与自动化系统,重构传统销售客户管理上限?
  • 从高层 PyTorch 到中层 CUDA Kernel 到底层硬件 Tensor Core
  • fortran notes[2]
  • More Effective C++ 条款11:禁止异常流出析构函数之外
  • 自学嵌入式第二十九天:Linux系统编程-线程
  • 零后端、零配置:用 AI 编程工具「Cursor」15 分钟上线「Vue3 留言墙」
  • 从“找不到”到“秒上手”:金仓文档系统重构记
  • 深度学习-----详解MNIST手写数字数据集的神经网络实现过程