本文将为您介绍通过自动集成的方式集成 React Native SDK。
前提条件
终端性能监控 Pro 需要使用 React Native SDK 1.0.0-beta.5及以上版本。
自动集成
步骤1:下载 SDK
执行如下命令下载 SDK。
npm install bugly-rn-sdk@1.0.0-beta.5
注意:
React Native 端 SDK 处于灰度验证阶段,建议业务小规模接入测试,质量验证符合预期后,再正式上线。
Bugly React Native 端 SDK 集成在 React Native 的 JS 层,收集 JS 层运行时的数据。
步骤2:使用原生 SDK 上报 JS 异常(可选)
说明:
如需使用原生 SDK 上报 JS 异常,请执行如下步骤。
Bugly 支持跨平台开发框架通过调用 Native 层 SDK 上报 JS 层数据。React Native 自身提供桥接机制用于调用 Native 层函数,Bugly 也基于 React Native 官方文档实现了对应的桥接能力,详情请参见 Android 原生模块桥接文档 和 iOS 原生模块桥接文档。
下文将以 React Native 为例,介绍如何通过桥接方式分别调用 iOS 与 Android 端 SDK,并完成 JS 异常的上报。
Android 集成步骤
1. 在 app/kotlin+java/com.awesomeproject 里创建 Java 文件,其中 AppPackage、AndroidBridge 和 OnError 为新增的文件。

2. 在 OnError 中调用 Android SDK 上报错误数据。
package com.awesomeproject;import android.util.Log;public class OnError {public void sendMsg(String errMsg) {// 使用 Android SDK 上报错误数据Map<String, String> extraInfo = new HashMap<>();String[] components = errMsg.split("\\n");String msg = components[0].replace("Error: ", "");String[] secondPart = Arrays.copyOfRange(components, 1, components.length);String stack = String.join("\\n", secondPart);Bugly.postException(8, "test_error", msg , stack, extraInfo);}}
3. 在 AndroidBridge 中声明 AndroidBridge,并调用 OnError 类来上报错误信息。
package com.awesomeproject;import androidx.annotation.NonNull;import com.facebook.react.bridge.ReactApplicationContext;import com.facebook.react.bridge.ReactContextBaseJavaModule;import com.facebook.react.bridge.ReactMethod;public class AndroidBridge extends ReactContextBaseJavaModule{AndroidBridge(ReactApplicationContext context) {super(context);}private OnError onError = new OnError();@NonNull@Overridepublic String getName() {return "AndroidBridge";}@ReactMethodpublic void sendJSError (String errMsg) {onError.sendMsg(errMsg);}}
4. 向 React Native 中注册 AndroidBridge。
package com.awesomeproject;import com.facebook.react.ReactPackage;import com.facebook.react.bridge.NativeModule;import com.facebook.react.bridge.ReactApplicationContext;import com.facebook.react.uimanager.ViewManager;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class AppPackage implements ReactPackage{@Overridepublic List<ViewManager> createViewManagers(ReactApplicationContext context) {return Collections.emptyList();}@Overridepublic List<NativeModule> createNativeModules (ReactApplicationContext context) {List<NativeModule> modules = new ArrayList<>();modules.add(new AndroidBridge(context));return modules;}}
5. 在 MainApplication 里添加 AppPackage。
package com.awesomeprojectimport android.app.Applicationimport com.facebook.react.PackageListimport com.facebook.react.ReactApplicationimport com.facebook.react.ReactHostimport com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNativeimport com.facebook.react.ReactNativeHostimport com.facebook.react.ReactPackageimport com.facebook.react.defaults.DefaultReactHost.getDefaultReactHostimport com.facebook.react.defaults.DefaultReactNativeHostclass MainApplication : Application(), ReactApplication {override val reactNativeHost: ReactNativeHost =object : DefaultReactNativeHost(this) {override fun getPackages(): List<ReactPackage> =PackageList(this).packages.apply {add(AppPackage())}override fun getJSMainModuleName(): String = "index"override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUGoverride val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLEDoverride val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED}override val reactHost: ReactHostget() = getDefaultReactHost(applicationContext, reactNativeHost)override fun onCreate() {super.onCreate()loadReactNative(this)}}
6. 在 JS 层调用 Android SDK 来上报错误数据。
import { NativeModules } from 'react-native';const { AndroidBridge } = NativeModules;ErrorUtils.setGlobalHandler((error, isFatal) => {AndroidBridge.sendJSError(error.stack || error);});
iOS 集成步骤
1. 在项目根目录下创建 OnError.swift、iOSBridge.swift 和 IOSBridge.m 文件。
// OnError.swiftclass OnError {func tran2BuglyError(errMsg: String) -> (category: UInt, name:String, reason: String, callStack: Array<String>) {let components = errMsg.components(separatedBy: "\\n")let firstPart = components[0].replacingOccurrences(of: "Error: ", with: "")let secondPart = Array(components.dropFirst())return (5, "JS Error", firstPart, secondPart)}public func sendMsg(errMsg: String) -> Void {let BuglyError = tran2BuglyError(errMsg: errMsg)// 调用 Bugly IOS 上报错误BuglyCrashMonitorPlugin.reportException(withCategory: BuglyError.category, name: BuglyError.name, reason: BuglyError.reason, callStack: BuglyError.callStack, extraInfo: [:], terminateApp: false)}}// IOSBridge.swift@objc(IOSBridge)class IOSBridge: NSObject {@objc(sendJSError:)func sendJSError(errMsg: String) -> Void {let onError = OnError()onError.sendMsg(errMsg: errMsg)}}// IOSBridge.m#import <React/RCTBridgeModule.h>@interface RCT_EXTERN_MODULE(IOSBridge, NSObject)RCT_EXTERN_METHOD(sendJSError:(NSString *)errMsg)@end
2. 创建桥接文件。
// AwesomeProject_Bridging_Header.h#ifndef AwesomeProject_Bridging_Header_h#define AwesomeProject_Bridging_Header_h#import <React/RCTBridgeModule.h>#endif /* AwesomeProject_Bridging_Header_h */
3. 最后在 JS 层中监听错误并调用 iOS SDK 上报错误。
import { NativeModules } from 'react-native';const { IOSBridge } = NativeModulesErrorUtils.setGlobalHandler((error, isFatal) => {IOSBridge.sendJSError(error.stack || error);});