From 1767fe37faee0b53ec9946985d9568022d62995a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=B5=B3=E8=B5=B3?= <28746442+Chenjiujiu@users.noreply.github.com> Date: Tue, 8 Apr 2025 16:00:15 +0800 Subject: [PATCH] feat: add restartApp (#488) --- .../modules/update/UpdateModuleImpl.java | 29 +++++++++++++++++++ .../modules/update/UpdateModule.java | 5 ++++ .../modules/update/UpdateModule.java | 23 +++++++++++++++ ios/RCTPushy/RCTPushy.mm | 20 +++++++++++++ src/NativePushy.ts | 1 + src/client.ts | 3 ++ src/context.ts | 2 ++ src/provider.tsx | 8 +++++ 8 files changed, 91 insertions(+) diff --git a/android/src/main/java/cn/reactnative/modules/update/UpdateModuleImpl.java b/android/src/main/java/cn/reactnative/modules/update/UpdateModuleImpl.java index c32a9b2..f2b8f98 100644 --- a/android/src/main/java/cn/reactnative/modules/update/UpdateModuleImpl.java +++ b/android/src/main/java/cn/reactnative/modules/update/UpdateModuleImpl.java @@ -176,6 +176,35 @@ public class UpdateModuleImpl { }); } + public static void restartApp(final ReactApplicationContext mContext, Promise promise) { + UiThreadUtil.runOnUiThread(new Runnable() { + @Override + public void run() { + try { + final Context application = mContext.getApplicationContext(); + ReactInstanceManager instanceManager = ((ReactApplication) application).getReactNativeHost().getReactInstanceManager(); + + instanceManager.recreateReactContextInBackground(); + promise.resolve(true); + + } catch (Throwable err) { + promise.reject("restartApp failed: "+err.getMessage()); + Log.e("pushy", "restartApp failed", err); + + final Activity currentActivity = mContext.getCurrentActivity(); + if (currentActivity == null) { + return; + } + currentActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + currentActivity.recreate(); + } + }); + } + } + }); + } public static void setNeedUpdate(UpdateContext updateContext, ReadableMap options, Promise promise) { final String hash = options.getString("hash"); diff --git a/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java b/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java index 34077dd..54ffb0a 100644 --- a/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java +++ b/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java @@ -97,6 +97,11 @@ public class UpdateModule extends NativePushySpec { UpdateModuleImpl.reloadUpdate(updateContext, mContext, options,promise); } + @Override + public void restartApp(Promise promise) { + UpdateModuleImpl.restartApp(updateContext, mContext, promise); + } + @Override public void setNeedUpdate(ReadableMap options,Promise promise) { UpdateModuleImpl.setNeedUpdate(updateContext, options,promise); diff --git a/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java b/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java index 0dd3907..ade341e 100644 --- a/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java +++ b/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java @@ -224,6 +224,29 @@ public class UpdateModule extends ReactContextBaseJavaModule { }); } + @ReactMethod + public void restartApp(final Promise promise) { + + UiThreadUtil.runOnUiThread(new Runnable() { + @Override + public void run() { + try { + final Context application = getReactApplicationContext().getApplicationContext(); + ReactInstanceManager instanceManager = updateContext.getCustomReactInstanceManager(); + if (instanceManager == null) { + instanceManager = ((ReactApplication) application).getReactNativeHost().getReactInstanceManager(); + } + instanceManager.recreateReactContextInBackground(); + promise.resolve(true); + + } catch (Throwable err) { + promise.reject(err); + Log.e("pushy", "restartApp failed ", err); + } + } + }); + } + @ReactMethod public void setNeedUpdate(ReadableMap options) { final String hash = options.getString("hash"); diff --git a/ios/RCTPushy/RCTPushy.mm b/ios/RCTPushy/RCTPushy.mm index 009f1d2..f5b16f1 100644 --- a/ios/RCTPushy/RCTPushy.mm +++ b/ios/RCTPushy/RCTPushy.mm @@ -338,6 +338,26 @@ RCT_EXPORT_METHOD(reloadUpdate:(NSDictionary *)options } } +RCT_EXPORT_METHOD(restartApp:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + @try { + dispatch_async(dispatch_get_main_queue(), ^{ + [self.bridge reload]; + }); + #if __has_include("RCTReloadCommand.h") + // reload 0.62+ + RCTReloadCommandSetBundleURL([[self class] bundleURL]); + RCTTriggerReloadCommandListeners(@"pushy restartApp"); + #endif + + resolve(@true); + } + @catch (NSException *exception) { + reject(@"执行报错", exception.reason, nil); + } +} + RCT_EXPORT_METHOD(markSuccess:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { diff --git a/src/NativePushy.ts b/src/NativePushy.ts index d200d57..e1f6afd 100644 --- a/src/NativePushy.ts +++ b/src/NativePushy.ts @@ -15,6 +15,7 @@ export interface Spec extends TurboModule { getLocalHashInfo(hash: string): Promise; setUuid(uuid: string): Promise; reloadUpdate(options: { hash: string }): Promise; + restartApp(): Promise; setNeedUpdate(options: { hash: string }): Promise; markSuccess(): Promise; downloadPatchFromPpk(options: { diff --git a/src/client.ts b/src/client.ts index b11b5d4..4770196 100644 --- a/src/client.ts +++ b/src/client.ts @@ -544,6 +544,9 @@ export class Pushy { delete Pushy.progressHandlers[progressKey]; } }; + restartApp = async () => { + return PushyModule.restartApp(); + }; } // for international users diff --git a/src/context.ts b/src/context.ts index 9372b87..a6297df 100644 --- a/src/context.ts +++ b/src/context.ts @@ -13,6 +13,7 @@ export const defaultContext = { dismissError: noop, downloadUpdate: asyncNoop, downloadAndInstallApk: asyncNoop, + restartApp: asyncNoop, getCurrentVersionInfo: () => Promise.resolve({}), parseTestQrCode: () => false, currentHash: '', @@ -33,6 +34,7 @@ export const UpdateContext = createContext<{ metaInfo?: string; }>; parseTestQrCode: (code: string) => boolean; + restartApp: () => Promise; currentHash: string; packageVersion: string; client?: Pushy | Cresc; diff --git a/src/provider.tsx b/src/provider.tsx index 1f98d23..22746c5 100644 --- a/src/provider.tsx +++ b/src/provider.tsx @@ -316,6 +316,13 @@ export const UpdateProvider = ({ [parseTestPayload], ); + const restartApp = useCallback( + async () => { + return client.restartApp(); + }, + [client], + ); + useEffect(() => { const parseLinking = (url: string | null) => { if (!url) { @@ -361,6 +368,7 @@ export const UpdateProvider = ({ downloadAndInstallApk, getCurrentVersionInfo, parseTestQrCode, + restartApp, }}> {children}