@@ -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// 日志事件类型
92107type 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)
0 commit comments