当前位置: 首页 > 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.xdnf.cn/news/1375399.html

相关文章:

  • 储能站运维管理一体化平台 | 图扑数字孪生
  • 《Linux 网络编程四:TCP 并发服务器:构建模式、原理及关键技术(以select )》
  • Linux 软件编程(十二)网络编程:TCP 并发服务器构建与 IO 多路复用
  • PPT处理控件Aspose.Slides教程:在.NET中开发SVG到EMF的转换器
  • 爬虫基础学习 - Xpath
  • 设计模式与设计原则简介——及其设计模式学习方法
  • 优选算法-常见位运算总结
  • uniapp中 ios端 scroll-view 组件内部子元素z-index失效问题
  • 基于 Node.js 的淘宝 API 接口开发:快速构建异步数据采集服务
  • 汽车电气系统的发展演进为测试带来了哪些影响?
  • DeFi协议Lombard能突破比特币生态原生叙事困境吗?
  • 图表可视化地理趋势-Telerik WPF Chart
  • 【Day 35】Linux-主从复制的维护
  • (LeetCode 面试经典 150 题 ) 637. 二叉树的层平均值(深度优先搜索dfs)
  • 亚马逊广告关键词排名提升的五大核心策略解析
  • java简单ssm(spring+springmvc+mybatis)框架结构demo
  • 大模型重构建筑“能耗基因“:企业如何用物联中台打响能源革命?
  • 手写MyBatis第36弹:MyBatis执行流程中SQL命令类型解析
  • 登录业务——密码重置与强制修改初始密码实现思路
  • 【微信小程序】分别解决H5的跨域代理问题 和小程序正常不需要代理问题
  • Coze用户账号设置修改用户名-后端源码
  • map|math
  • 腾讯位置商业授权微信小程序路线规划
  • 【开源工具】基于Flask与Socket.IO的跨平台屏幕监控系统实战(附完整源码)
  • 前端性能优化:从指标监控到全链路落地(2024最新实战指南)
  • 论文阅读:Gorilla: Large Language Model Connected with Massive APIs
  • 深度学习入门:神经网络基础知识
  • lesson47:Linux常用软件使用指南:远程连接、远程拷贝、Vim与Nginx
  • VESA时序检测模块设计verilog实现
  • Ubuntu 24 Server 如何设置无线网络