Skip to content

Commit 7bf3d6e

Browse files
committed
docs: document beforeReload hook
1 parent 2332f66 commit 7bf3d6e

2 files changed

Lines changed: 58 additions & 2 deletions

File tree

site/pages/docs/api.mdx

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ interface PushyOptions {
7676
// 在原生包过期时执行,返回 false 则取消内置策略进一步执行,可以配合自定义的 metaInfo 做一些条件控制
7777
// 此选项需 v10.28.2+ 版本
7878
onPackageExpired?: (info: UpdateInfo) => Promise<boolean>;
79+
80+
// 在 switchVersion 或 restartApp 触发立即重启前执行,返回 false 则取消本次重启
81+
// 可用于等待 Sentry 等原生 SDK 停止采样、flush 上报队列后再销毁 RN 实例
82+
// 此选项需 v10.42.2+ 版本
83+
beforeReload?: (
84+
context: BeforeReloadContext,
85+
) => Promise<boolean | void> | boolean | void;
7986
}
8087

8188
// 检查更新结束后的状态
@@ -88,6 +95,14 @@ type UpdateCheckState = {
8895
error?: Error;
8996
};
9097

98+
// beforeReload 接收到的重启上下文
99+
type BeforeReloadContext = {
100+
// switchVersion: 立即应用已下载热更;restartApp: 直接重启当前应用
101+
type: "switchVersion" | "restartApp";
102+
// type 为 switchVersion 时,表示即将应用的热更 hash
103+
hash?: string;
104+
};
105+
91106
// 日志事件类型
92107
type EventType =
93108
// 更新失败,重启后发生回滚
@@ -139,6 +154,35 @@ interface EventData {
139154
}
140155
```
141156

157+
#### beforeReload 示例:重启前清理原生 SDK
158+
159+
`beforeReload` 会在 `switchVersion()``restartApp()` 真正重启前执行。返回 `false` 会取消本次重启;抛出异常或 Promise reject 时也不会继续重启。`switchVersionLater()` 不会立即销毁当前 RN 实例,因此不会触发此钩子。
160+
161+
如果应用接入了 Sentry profiling、性能采样、日志上传等可能跨线程工作的原生 SDK,可以在这里先停止采样并 flush 队列,再让 Pushy 重启:
162+
163+
```ts
164+
import { NativeModules } from "react-native";
165+
import * as Sentry from "@sentry/react-native";
166+
import { Pushy } from "react-native-update";
167+
168+
const pushyClient = new Pushy({
169+
appKey,
170+
beforeReload: async (_context) => {
171+
try {
172+
NativeModules.RNSentry?.stopProfiling?.();
173+
} catch {}
174+
175+
const flushed = await Promise.race([
176+
Sentry.flush(),
177+
new Promise<boolean>((resolve) => setTimeout(() => resolve(false), 1500)),
178+
]);
179+
180+
// 返回 false 会取消本次立即重启,等待下一次检查或手动触发。
181+
return flushed;
182+
},
183+
});
184+
```
185+
142186
#### useUpdate()
143187

144188
热更相关的工具函数。此方法也可使用别名 `usePushy` 引入。
@@ -177,9 +221,9 @@ interface UpdateContext {
177221
// 我们也仍然推荐优先从`useUpdate()`中获取`updateInfo`
178222
checkUpdate: () => Promise<void | UpdateInfo>;
179223
// 下载热更完成后调用,立即重启切换新版本
180-
switchVersion: () => void;
224+
switchVersion: () => Promise<void>;
181225
// 下载热更完成后调用,用户手动重启app后切换新版本(静默更新)
182-
switchVersionLater: () => void;
226+
switchVersionLater: () => Promise<void>;
183227
// 热更完成重启后,手动标记热更完成
184228
markSuccess: () => void;
185229
// 清除最后的报错状态
@@ -208,6 +252,8 @@ interface UpdateContext {
208252
packageVersion: string;
209253
// 当前的pushy热更服务实例
210254
client?: Pushy;
255+
// 立即重启应用,需 v10.28.2+ 版本
256+
restartApp: () => Promise<void>;
211257
// 下载开始后的进度数据
212258
progress?: {
213259
hash: string;
@@ -355,6 +401,8 @@ console.log(currentVersionInfo.name);
355401

356402
立即重启应用。v10.28.2+ 版本可用。
357403

404+
如果配置了 `beforeReload`,会等待它完成后再重启;当 `beforeReload` 返回 `false`、抛出异常或 Promise reject 时,会取消本次重启。
405+
358406
---
359407

360408
#### function switchVersion()
@@ -363,6 +411,8 @@ console.log(currentVersionInfo.name);
363411

364412
> 注意!不可依赖`progress`来判断下载完成,必须要在`await downloadUpdate()`之后再调用此方法。
365413
414+
如果配置了 `beforeReload`,会传入 `{ type: "switchVersion", hash }` 并等待它完成后再重启;当 `beforeReload` 返回 `false`、抛出异常或 Promise reject 时,会取消本次重启。
415+
366416
---
367417

368418
#### function switchVersionLater()
@@ -371,6 +421,8 @@ console.log(currentVersionInfo.name);
371421

372422
> 注意!不可依赖`progress`来判断下载完成,必须要在`await downloadUpdate()`之后再调用此方法。
373423
424+
此方法不会立即销毁当前 RN 实例,因此不会触发 `beforeReload`
425+
374426
---
375427

376428
#### function parseTestQrCode(qrCode: string)

site/pages/docs/integration.mdx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ const pushyClient = new Pushy({
100100

101101
检查策略和更新策略是一个完整更新流水线的上下游,两者可以独立开关,自由搭配,以便不同程度的介入检查频率的控制,或是下载相关的界面交互。
102102

103+
:::tip
104+
如果应用接入了 Sentry profiling、性能采样或类似会在原生线程中持续工作的 SDK,并且使用 `"silentAndNow"`、手动调用 `switchVersion()``restartApp()` 这类立即重启路径,建议升级 `react-native-update` 到 v10.42.2+,并配置 [`beforeReload`](/docs/api) 在重启前完成停止采样和 flush。
105+
:::
106+
103107
下面的章节提供了一个自定义更新策略和界面交互的参考实现。
104108

105109
### 自定义更新界面

0 commit comments

Comments
 (0)