macOS Electron 监测¶
macOS SDK 通过 Guance Electron Native Adapter 接入 Electron:Renderer 中的 Browser RUM 和 Browser Logs 负责采集页面访问、用户操作、请求、错误、Long Task 和页面日志,Electron Main Process 将数据交给 macOS Native SDK,统一管理原生 RUM 应用、会话、采样和上传。需要会话回放时,按下文同时配置 Native SDK 和页面录制。
根据应用结构选择一种模式,同一个 Electron 进程只使用一种模式:
| 接入模式 | 适用场景 | SDK 所有者 |
|---|---|---|
| 全量模式(managed) | 应用主体是 Electron | Electron 主进程通过 Node Addon 初始化和关闭 Native SDK |
| 混合模式(external) | macOS 原生应用已接入 Native SDK,并由原生应用启动 Electron | macOS 原生主程序;Electron 只连接已有 SDK |
两种模式共用相同的 Preload、窗口登记和 Renderer 初始化方式。Renderer 不配置真实 RUM 应用 ID、上传地址或 Client Token。选择模式后,配置 Preload 并初始化页面 SDK。如果只需要将 Electron 页面作为独立 Web 应用监测,请参考 Web RUM 的 Electron 接入。
数据流如下:
全量模式(managed)
Electron Renderer
Browser SDK -> 安全 Preload -> Electron Main Process
|
v
Node Addon(内含 Native SDK)
|
v
上传
混合模式(external)
Electron Renderer
Browser SDK -> 安全 Preload -> Electron Main Process
|
| 受认证的 Unix Domain Socket
v
macOS Native 主程序
Native SDK -> 上传
集成 Electron¶
安装依赖¶
- 安装 Adapter 和 Native 运行时需要 Node.js
18或更高版本,并能访问 npm Registry 和 Native SDK 的 GitHub Release;离线环境需提前准备 npm 包、依赖和 Native 运行时压缩包; - 全量模式使用预编译的 Universal 运行时,安装时不编译 Native SDK,无需为此安装 Git、Swift 或 Xcode Command Line Tools;应用打包、签名和公证仍需相应的 macOS 工具链;
- 混合模式需要先在 macOS 原生主程序中接入 Native SDK。下文的
configureElectronProcess接入方式从 Native SDK1.6.8-alpha.7开始提供,参见原生主程序集成。
Guance Electron Native Adapter 支持 Electron 22.x(不低于 22.3.27)和 43.x。
全量模式通过 npm 安装:
已发布的 npm 包会在安装时自动下载配套版本的 macOS Universal 运行时,并校验版本、架构和文件完整性,无需再执行构建命令。不要使用 --ignore-scripts 跳过安装脚本;如已跳过,可按下文显式安装运行时。
仅使用混合模式时,由原生主程序提供 Native SDK,安装 Adapter 时跳过不需要的运行时下载:
Renderer 安装 Browser SDK:
如果需要采集页面日志,再安装 Browser Logs:
安装后,按采集页面日志完成配置。
指定或离线安装全量模式 Native 运行时¶
使用 npm 自动安装的运行时时,开发阶段无需设置 native.directory,Adapter 会从自身安装目录中查找运行时。npm 包与 Native SDK 的版本号相互独立,配套的 Native SDK 版本由 npm 包固定,不要求两者版本号相同。
如需指定其他 Native SDK 版本,在 Electron 应用项目根目录执行以下命令,将 <SDK_VERSION> 替换为包含 Electron 运行时资产的 Native SDK Release tag:
该命令下载预编译的 Universal 运行时,同时包含 arm64 和 x86_64,不提供单架构源码构建选项。安装器会校验压缩包、SDK 版本、架构和文件哈希。
离线安装时,提前准备同一 Release 中的 guance-electron-runtime-<SDK_VERSION>-darwin-universal.tar.gz 及其同名 .sha256 文件,将两者放在同一目录:
npx guance-electron-native --sdk-version '<SDK_VERSION>' \
--runtime-archive '/absolute/path/guance-electron-runtime-<SDK_VERSION>-darwin-universal.tar.gz'
离线命令执行前需已安装 Adapter 及其 npm 依赖,否则 npx 自身仍可能访问 npm。也可以在 npm 安装时传入本地运行时压缩包:
GUANCE_NATIVE_RUNTIME_ARCHIVE='/absolute/path/runtime.tar.gz' \
npm install @cloudcare/electron-native-adapter
本地压缩包优先于网络下载,其版本须与本次安装选择的 Native SDK 版本一致。npm 安装时可通过 GUANCE_NATIVE_SDK_VERSION 覆盖配套版本;显式 CLI 安装则使用 --sdk-version。更换版本后,需运行应用确认数据正常上报。
npm 自动安装的运行时位于 node_modules/@cloudcare/electron-native-adapter/.cloudcare/native/darwin/runtime。显式 CLI 安装则输出到应用项目的 .cloudcare/native/darwin/runtime,此时需将 native.directory 设置为该目录的绝对路径。建议将项目中的 .cloudcare/ 加入 Git 忽略规则。
打包时请将完整的 runtime 目录一起复制到应用资源目录中,具体配置见打包资源。
初始化 Native Bridge¶
混合模式¶
混合模式使用 native.mode: 'external',需要先在 macOS 原生主程序中配置 SDK,再由原生主程序启动 Electron。应用信息、上传地址和采集选项统一在原生主程序中设置。
原生主程序集成¶
在原生主程序工程中通过 Swift Package Manager 添加 Native SDK,并将 <SDK_VERSION> 替换为使用的 SDK 版本号:
将以下 Product 添加到 macOS 主程序 Target:
GuanceSDK:Native SDK;GuanceElectronWebView:用于接入 Electron 页面数据;GuanceSessionReplay:仅在需要 Session Replay 时添加。
原生主程序先初始化 SDK 和 RUM。已接入 SDK 的应用保留原有初始化代码,并开启 enableTraceWebView,无需重复初始化:
#import <GuanceSDK/GuanceSDK.h>
#import <GuanceElectronWebView/GuanceElectronWebView.h>
FTSDKConfig *sdkConfig =
[[FTSDKConfig alloc] initWithDatakitUrl:@"http://127.0.0.1:9529"];
[FTSDKAgent startWithConfigOptions:sdkConfig];
FTRumConfig *rumConfig =
[[FTRumConfig alloc] initWithAppid:@"<RUM 应用 ID>"];
rumConfig.enableTraceWebView = YES;
rumConfig.enableTraceUserView = YES;
[[FTSDKAgent sharedInstance] startRumWithConfigOptions:rumConfig];
如果需要 Session Replay,在启动 Electron 子进程前,使用 Native SDK 的 Session Replay API 初始化;如需页面日志,也应在此阶段完成原生 Logger 配置:
#import <GuanceSessionReplay/GuanceSessionReplay.h>
FTSessionReplayConfig *replayConfig = [[FTSessionReplayConfig alloc] init];
replayConfig.sampleRate = 100;
replayConfig.textAndInputPrivacy = FTTextAndInputPrivacyLevelMaskSensitiveInputs;
[[FTRumSessionReplay sharedInstance]
startWithSessionReplayConfig:replayConfig];
配置并启动 Electron 子进程¶
创建 FTElectronBridgeServer 和 NSTask,在启动子进程前调用 configureElectronProcess:error:。该方法会自动启动 Bridge,并把连接参数合并到指定子进程的环境变量中,无需再单独调用 startWithError: 或手动设置 Bridge 环境变量。
在 AppDelegate 或负责子进程生命周期的对象中声明强引用属性:
@property (nonatomic, strong) FTElectronBridgeServer *electronBridgeServer;
@property (nonatomic, strong) NSTask *electronProcess;
完成前面的 Native SDK 配置后,执行以下启动代码:
self.electronBridgeServer = [[FTElectronBridgeServer alloc] init];
self.electronProcess = [[NSTask alloc] init];
self.electronProcess.executableURL =
[NSURL fileURLWithPath:@"<Electron 可执行文件的绝对路径>"];
// 按应用结构设置启动参数,例如开发模式下的 Electron 项目路径。
// self.electronProcess.arguments = @[@"<Electron 项目的绝对路径>"];
NSError *error = nil;
if (![self.electronBridgeServer
configureElectronProcess:self.electronProcess error:&error]) {
[self.electronBridgeServer stop];
// 在应用中处理 error,不要继续启动未配置成功的子进程。
return;
}
// configureElectronProcess 只配置进程,不会自动启动 Electron。
if (![self.electronProcess launchAndReturnError:&error]) {
[self.electronBridgeServer stop];
// 在应用中处理启动失败。
return;
}
Swift 中对应的调用为 try bridgeServer.configureElectronProcess(process),然后执行 try process.run()。
如需传入业务环境变量,在调用 configureElectronProcess 前设置 electronProcess.environment。SDK 会保留已有的非 Bridge 参数;未设置时,继承 NSProcessInfo.processInfo.environment。该方法只修改指定子进程的启动环境,不修改原生主程序的环境;启动前可重复调用,但会用当前 Bridge 的值替换已有的 Bridge 参数。
以下连接参数由 Native Bridge 生成或提供,Adapter 默认从 Electron 主进程的 process.env 读取。用户不需要手动赋值或写入 .env.local,也不要把这些参数暴露给 Renderer:
| 环境变量 | 用途 |
|---|---|
GUANCE_ELECTRON_SOCKET_PATH |
当前 Bridge 的本地 Unix Domain Socket 路径 |
GUANCE_ELECTRON_AUTH_TOKEN |
当前 Bridge 生成的 IPC 认证 Token,不是 DataWay 上传 Token |
GUANCE_ELECTRON_PROTOCOL_VERSION |
Native Bridge 支持的 IPC 协议版本,用于检查与 Adapter 的协议兼容性,不是 SDK 或 npm 版本号 |
使用不支持 configureElectronProcess 的旧 SDK 或自定义启动器时,仍可先调用 startWithError:,再将 environmentByAddingToEnvironment: 的返回值作为 Electron 的启动环境传入。仅启动 Bridge 并不会自动修改另一个进程的环境变量。
配置 Electron 主进程¶
在 Electron 创建或导航第一个窗口前,使用 bootstrap() 连接原生主程序。无需传入 native.settings 或手动读取连接参数:
const electron = require('electron')
const { app, BrowserWindow } = electron
const {
bootstrap,
} = require('@cloudcare/electron-native-adapter')
let client
app.whenReady().then(async () => {
client = await bootstrap({
electron,
native: {
mode: 'external',
},
autoAttach: true,
})
const window = new BrowserWindow({ /* 配置安全 Preload */ })
await window.loadURL('https://example.com')
})
全量模式¶
全量模式使用 native.mode: 'managed',在 Electron 主进程中配置应用信息和采集功能。
在创建或导航第一个 BrowserWindow 前调用 bootstrap(),并设置 native.mode: 'managed':
const electron = require('electron')
const { app, BrowserWindow } = electron
const {
bootstrap,
} = require('@cloudcare/electron-native-adapter')
let client
app.whenReady().then(async () => {
client = await bootstrap({
electron,
native: {
mode: 'managed',
// npm 自动安装的运行时无需设置 directory。
// 如使用显式 CLI 安装,传入安装输出目录的绝对路径。
settings: {
applicationId: '<RUM 应用 ID>',
datakitUrl: 'http://127.0.0.1:9529',
service: 'electron-main',
environment: 'prod',
version: app.getVersion(),
loggingEnabled: true,
replayEnabled: true,
replaySampleRate: 1,
replayPrivacy: 'mask-user-input',
traceEnabled: true,
},
},
autoAttach: true,
})
const window = new BrowserWindow({
webPreferences: {
preload: require.resolve(
'@cloudcare/electron-native-adapter/preload/standalone',
),
contextIsolation: true,
nodeIntegration: false,
sandbox: true,
},
})
await window.loadURL('https://example.com')
})
在 native.settings 中配置应用信息、上传地址和需要开启的采集功能:
| 分类 | 字段 | 是否必填/默认值 | 说明 |
|---|---|---|---|
| 上传 | datakitUrl |
与 datawayUrl 二选一 |
DataKit 地址;存在时优先使用 |
| 上传 | datawayUrl |
与 datakitUrl 二选一 |
DataWay 地址 |
| 上传 | clientToken |
使用 datawayUrl 时必填 |
DataWay Client Token |
| 应用 | applicationId |
必填 | 观测云中创建的原生 RUM 应用 ID |
| 应用 | service |
必填 | 服务名称 |
| 应用 | environment |
必填 | 环境名称 |
| 应用 | version |
必填 | 传入 app.getVersion();macOS 实际上报的应用版本由应用打包信息决定 |
| RUM | sampleRate |
1 |
RUM 采样率 |
| Logger | loggingEnabled |
false |
是否接收 Browser Log |
| Logger | loggingSampleRate |
1 |
Logger 采样率,仅在 Logger 开启时使用 |
| Session Replay | replayEnabled |
false |
是否开启 Session Replay |
| Session Replay | replaySampleRate |
1 |
Session Replay 采样率,仅在 Replay 开启时使用 |
| Session Replay | replayPrivacy |
mask |
可选值:allow、mask-user-input、mask |
| Trace | traceEnabled |
false |
是否开启 Native SDK Trace |
| Trace | traceSampleRate |
1 |
Trace 采样率,仅在 Trace 开启时使用 |
| Trace | traceType |
w3c_traceparent |
Trace Header 类型 |
| 运行时 | debug |
false |
是否输出 Native SDK Debug Log |
native.settings 中的所有采样率取值范围为 0..1,例如 1 表示 100%,0.2 表示 20%。replayPrivacy 用于设置回放中的隐私保护方式,allow、mask-user-input、mask 的保护程度依次增强,默认为 mask。
混合模式直接调用 Native SDK 配置 API 时,sampleRate 使用 0..100;Browser SDK 的 sessionSampleRate 和 sessionReplaySampleRate 也使用 0..100。不要把主进程 Adapter 配置中的 1 直接当作这些 API 的 100%。
如果使用 DataWay 上传,请用 datawayUrl 和 clientToken 替换示例中的 datakitUrl,并仅在主进程中配置 Token。
应用退出¶
退出前调用并等待 client.stop() 完成。
| 模式 | client.stop() 的效果 |
|---|---|
| 全量模式 | 停止窗口采集并关闭由 Electron 初始化的 Native SDK |
| 混合模式 | 断开 Electron 连接,原生主程序中的 SDK 继续运行 |
Electron 不会自动等待退出事件回调中的异步操作。应用需要完成清理后再退出时,可在主进程加入:
let stopping = false
let stopped = false
app.on('before-quit', (event) => {
if (!client || stopped) return
event.preventDefault()
if (stopping) return
stopping = true
client.stop().catch(console.error).finally(() => {
stopped = true
app.quit()
})
})
混合模式的原生主程序仍需按自身退出流程停止 Bridge 和 Native SDK。
接入 Preload 与窗口¶
集成时只使用 Adapter 的公开入口:
@cloudcare/electron-native-adapter:Main Process 初始化入口;@cloudcare/electron-native-adapter/preload/standalone:没有现有 Preload 时直接使用;@cloudcare/electron-native-adapter/preload/install:将安装函数合并到业务 Preload。
不要直接引用或修改包内 internal/、core/ 或 platform/ 下的实现文件。每个需要采集的窗口都必须加载 Preload,并由 Main Process 通过 autoAttach 或 client.attachWindow() 登记。
如果应用没有自定义 Preload,可以直接使用 Adapter 提供的独立 Preload:
const window = new BrowserWindow({
webPreferences: {
preload: require.resolve(
'@cloudcare/electron-native-adapter/preload/standalone',
),
contextIsolation: true,
nodeIntegration: false,
sandbox: true,
},
})
如果应用已有 Preload,在业务 Preload 的源文件中调用一次安装函数:
const {
installElectronRumPreload,
} = require('@cloudcare/electron-native-adapter/preload/install')
installElectronRumPreload()
使用自定义 Preload 时,同样设置 contextIsolation: true、nodeIntegration: false 和 sandbox: true。使用 webpack、esbuild 等 bundler 将上述代码及 Adapter 依赖合并为一个 Preload bundle,保留 electron 为外部依赖,并将 webPreferences.preload 指向该产物的绝对路径。沙箱 Preload 不能直接通过普通 Node.js require() 加载 npm 包。
仓库中的 Electron 示例使用未打包的业务 Preload,因此设置了 sandbox: false;用于启用沙箱的应用时,需要先完成上述打包。独立 Preload 已可直接在沙箱中使用。
指定采集窗口¶
autoAttach 默认为 false。设置 autoAttach: true 后,Adapter 会自动接入启动前已存在的 BrowserWindow 和后续创建的窗口。页面刷新和跳转不需要重复调用。
如果只采集指定窗口,关闭自动接入,再在窗口加载页面前调用 client.attachWindow():
const client = await bootstrap({
electron,
native: {
mode: 'managed',
// 如使用显式 CLI 安装,在此设置 directory。
settings: nativeSettings,
},
autoAttach: false,
})
const window = new BrowserWindow({ /* ... */ })
client.attachWindow(window)
await window.loadURL('https://example.com')
关闭自动接入后,每个需要采集的窗口都必须单独调用 attachWindow(),并传入 BrowserWindow 实例。停止采集某个窗口时,调用 client.detachWindow(window),也可以调用 attachWindow() 返回的移除函数;窗口销毁时 Adapter 会自动移除登记。
autoAttach: true 适用于所有窗口均可信且需要采集的应用。包含不需要采集或不可信页面的应用应设置为 false,只登记目标窗口,并仅为这些窗口加载 Guance Preload。
初始化 Renderer¶
两种模式都需要在每个待采集的页面中初始化 Browser RUM。主进程完成 bootstrap() 和窗口接入后,再加载页面并执行以下代码:
import { datafluxRum } from '@cloudcare/browser-rum'
if (typeof window.FTWebViewJavascriptBridge?.sendEvent !== 'function') {
throw new Error('Guance Electron Bridge 尚未就绪')
}
datafluxRum.init({
applicationId: 'native-bridge',
datakitOrigin: 'http://127.0.0.1',
service: 'electron-renderer',
env: 'prod',
sessionSampleRate: 100,
trackUserInteractions: true,
})
在 Native Bridge 已生效的前提下,此处的 applicationId 和 datakitOrigin 用于满足 Browser SDK 的初始化配置,保持示例占位值即可,不需要另行申请 Web 应用或配置 Web 上传 Token。实际 RUM 应用、数据上传地址和凭据在 Electron 主进程(全量模式)或原生主程序(混合模式)中配置。不要在 Bridge 未就绪时使用占位配置初始化 Browser SDK。
采集用户操作¶
需要采集页面点击等用户操作时,按本节Renderer 初始化示例设置 trackUserInteractions: true。混合模式中,原生控件的自动操作采集通过原生主程序的 RUM 配置开启。
采集页面日志¶
需要采集页面日志时,先按接入模式开启日志采集:
- 全量模式:在 Electron 主进程的
native.settings中设置loggingEnabled: true,通过loggingSampleRate设置采样率。 - 混合模式:在 macOS 原生主程序中初始化 Logger 并开启
enableWebViewLog。
混合模式中,在原生主程序启动 Electron 前配置 Logger;如果已有 Logger 初始化代码,将以下选项合并到原有配置中:
FTLoggerConfig *loggerConfig = [[FTLoggerConfig alloc] init];
loggerConfig.enableWebViewLog = YES;
loggerConfig.enableLinkRumData = YES;
loggerConfig.sampleRate = 100;
[[FTSDKAgent sharedInstance] startLoggerWithConfigOptions:loggerConfig];
主进程可通过 client.capabilities.log 确认 Native 是否支持接收页面日志;仅在启用该能力的页面中初始化 Browser Logs。若通过业务 Preload 向页面传递此状态,只暴露所需布尔值,不传递完整 Native 配置。
enableWebViewLog 用于接收页面日志;需要将日志关联到原生 RUM 会话时,同时设置 enableLinkRumData: YES 并按混合模式示例开启 RUM 的 enableTraceWebView。
两种模式都在页面中按以下方式初始化 Browser Logs:
import { datafluxLogs } from '@cloudcare/browser-logs'
datafluxLogs.init({
datakitOrigin: 'http://127.0.0.1',
sessionSampleRate: 100,
forwardErrorsToLogs: true,
forwardConsoleLogs: ['error', 'warn'],
})
日志采样统一通过 Native Logger 配置控制。示例将 Browser sessionSampleRate 设为 100,避免页面侧再次降低采样率造成双重采样。
开启会话回放¶
先按接入模式开启回放采集:
- 全量模式:在
native.settings中设置replayEnabled: true,并按需设置replaySampleRate和replayPrivacy。 - 混合模式:在原生主程序中按混合模式示例配置 Session Replay 的采样率和隐私保护方式。
回放默认关闭。完成 Native 配置后,在页面的 datafluxRum.init() 之后检查 Bridge 能力,仅在返回 records 时开始录制:
const capabilities = JSON.parse(
window.FTWebViewJavascriptBridge.getCapabilities(),
)
if (capabilities.includes('records')) {
datafluxRum.startSessionReplayRecording()
}
records 表示 Native 已提供回放能力,不代表当前会话必然命中回放采样。不要仅通过页面调用强制开启 Native 尚未启用的回放。主进程也可通过 client.capabilities.replay 检查该能力。
接入完成后,可以在观测云中查看页面访问、用户操作和对应的回放。混合模式下,可以在同一会话中查看原生应用与 Electron 页面的访问数据;原生界面和 Electron 页面的回放分别展示。
混合模式中的页面快照由 Browser SDK 管理,Native Bridge 不反向触发页面完整快照。不要使用 client.updateWindow(..., { visible: false }) 作为混合模式暂停录制的方式。全量模式仍保留 Native 与页面的快照同步机制。
打包资源¶
全量模式¶
managed 模式必须先安装 Native 运行时,再将完整目录复制到 ASAR 外。macOS Universal 产物包含 arm64 和 x86_64。使用 npm 自动安装的运行时时,electron-builder 可通过以下 extraResources 配置复制运行时,并把 .node 加入 macOS 二进制签名配置:
{
"extraResources": [
{
"from": "node_modules/@cloudcare/electron-native-adapter/.cloudcare/native/darwin/runtime",
"to": "native"
}
],
"mac": {
"binaries": [
"Contents/Resources/native/guance_electron.node"
]
}
}
如果使用显式 CLI 安装,将上述 from 改为应用项目的 .cloudcare/native/darwin/runtime。不要只复制 .node 文件,运行时中的资源 Bundle 也必须一起交付。打包后的 Adapter 默认优先使用 process.resourcesPath 下的 native 目录;如果显式配置了 native.directory,打包后也应将其指向该目录,不能继续使用开发机路径。
沿用应用现有的 macOS 签名和公证流程,并将 guance_electron.node 一起签名。发布前需运行打包后的应用,验证 SDK 能正常加载和上报数据。
混合模式¶
混合模式按原生主程序现有流程打包和签名 Native SDK、GuanceElectronWebView 及按需使用的 Session Replay 组件。Electron 按常规方式打包即可。
集成边界¶
- 页面 RUM 事件和日志经 Preload、Main Process 转交 Native SDK;不要自行注册或转发 SDK 内部 IPC Channel。
- Adapter 只接受已登记窗口的主 Frame 事件,子 Frame 不作为独立可信入口。
traceEnabled配置的是 Native SDK Trace,不会自动为 Renderer 的fetch/ XHR 配置链路追踪。页面请求需要链路关联时,在 Browser RUM 中另行设置allowedTracingUrls和匹配后端的traceType;可参考仓库 Electron 示例。- 当前 macOS Adapter 未提供 Windows 接入中的自动
launch_cold、launch_hotAction 上报,不要依赖enableAppLaunch在 macOS 上产生这些事件。 - Renderer JavaScript Error 和 Long Task 由 Browser RUM 采集。Electron 的
unresponsive、render-process-gone不由 Bridge 自动转换为 RUM 错误;原生主程序的崩溃监测也不能替代 Electron 子进程的崩溃采集,需要按应用需求单独接入。 - 限制远程页面的导航、弹窗、权限和允许域名。上传地址和凭据配置在 Electron 主进程或原生主程序中,不写入页面代码。
验证集成¶
- 启动应用,确认主进程和页面控制台没有 SDK 初始化错误;在 Renderer DevTools Network 中确认没有 RUM 或 Log 直传请求。
- 访问页面、点击控件、发送请求并触发一条错误和 Long Task,在观测云中确认能查看到对应数据,且应用 ID 使用 Native 配置;开启页面日志后,再发送一条日志验证。
- 回放关闭时确认
getCapabilities()不包含records;开启并命中采样后查看录制结果,确认文本和输入内容符合所选隐私设置。 - 创建第二个窗口,确认能采集该窗口;使用指定窗口采集时,确认未接入的窗口没有数据。
- 混合模式下,在同一会话中查看原生应用和 Electron 页面的访问记录。
- 退出全量模式应用,确认
client.stop()完成;退出混合模式 Electron 子进程,确认原生 SDK 继续采集和上传。运行打包后的应用,再次验证数据和回放是否正常。
完整示例见 macOS SDK 仓库的 Electron 全量模式示例和原生宿主混合模式示例。
常见问题¶
| 现象 | 排查方式 |
|---|---|
| npm 安装时 Native 运行时下载失败 | 检查 SDK Release 是否包含指定版本的运行时及 .sha256 文件、网络是否可达;离线环境使用本地压缩包,仅混合模式设置 GUANCE_NATIVE_SKIP_DOWNLOAD=1 |
| 提示 Native 运行文件缺失或无法加载 | 检查 native.directory、目标架构及 runtime 目录是否完整;打包后还需检查文件位置与签名 |
| 页面没有监测数据 | 检查 Preload 是否生效、窗口是否已接入,以及 Browser RUM 是否在 Adapter 就绪后初始化 |
| 页面没有回放 | 检查 Native 侧是否开启回放、getCapabilities() 是否包含 records、采样率是否命中,以及页面是否调用 startSessionReplayRecording() |
| 混合模式连接失败 | 检查是否在启动对应 NSTask 前成功调用 configureElectronProcess,之后是否覆盖了其环境变量,以及 Bridge 是否一直被持有 |
| 提示 IPC 协议不支持 | 检查 Adapter 与 Native SDK 是否支持相同的 IPC 协议;不要通过手动修改 GUANCE_ELECTRON_PROTOCOL_VERSION 绕过检查 |