1
0
mirror of https://gitcode.com/gh_mirrors/re/react-native-pushy.git synced 2025-09-16 13:11:39 +08:00
Code Issues Packages Projects Releases Wiki Activity GitHub Gitee

Compare commits

...

16 Commits

Author SHA1 Message Date
sunnylqm
d5194a1ad1 bump version to 10.29.2 and add delayed execution for clearing first-time and rollback marks in UpdateModule 2025-06-16 12:00:19 +08:00
sunnylqm
ebc9b97e70 fix proguard 2025-06-14 23:34:54 +08:00
sunnylqm
40742e16d8 fix expo reload 2025-06-05 16:04:35 +08:00
sunnylqm
598ae1a506 bump example rn 0.79.2 2025-06-05 14:48:18 +08:00
sunnylqm
e5424591d1 fallback for all 2025-05-21 11:46:40 +08:00
sunnylqm
2cf7336b6a add fallback for android <= 7.0 2025-05-21 11:12:01 +08:00
Sunny Luo
7eac48ab5d 更新 package.json 2025-05-12 14:24:17 +08:00
波仔糕
18d9b75545 update pushy reference method (#499)
* update pushy reference method

* update
2025-05-12 14:23:45 +08:00
sunnylqm
e8ec85c65f cleanup 2025-05-01 20:25:26 +08:00
sunnylqm
48a776d506 cleanup expo android config 2025-04-30 15:50:07 +08:00
Sunny Luo
8ad526148f 更新 package.json 2025-04-30 14:12:16 +08:00
波仔糕
cea39f1746 fix FileJSBundleProvider conflict issue (#496)
* fix FileJSBundleProvider conflics issue

* udpate
2025-04-30 14:11:50 +08:00
sunnylqm
aa56c2ec0f improve podspec detection 2025-04-30 11:56:58 +08:00
sunnylqm
00a989d567 do not specify ios platform version 2025-04-29 22:01:45 +08:00
sunnylqm
83ca3a6c05 update deps 2025-04-26 23:09:23 +08:00
sunnylqm
257f2697e0 skip postinstall during dev/publish 2025-04-26 22:52:32 +08:00
61 changed files with 4411 additions and 6570 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,7 @@
"expo-status-bar": "~2.0.1",
"react": "18.3.1",
"react-native": "0.76.9",
"react-native-update": "^10.28.5"
"react-native-update": "^10.28.7"
},
"devDependencies": {
"@babel/core": "^7.25.2",

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
"": {
"name": "harmony_use_pushy",
"dependencies": {
"@react-native-oh/react-native-harmony": "^0.72.43",
"@react-native-oh/react-native-harmony": "^0.72.59",
"react": "18.2.0",
"react-native": "0.72.5",
"react-native-update": "^10.26.4",

View File

@@ -36,10 +36,6 @@
]
}
]
},
{
name: 'pushy',
srcPath: '../node_modules/react-native-update/harmony',
}
]
}

View File

@@ -7,7 +7,7 @@
"license": "",
"dependencies": {
"@rnoh/react-native-openharmony": "0.72.38",
"pushy": "file:../../node_modules/react-native-update/harmony"
"pushy": "file:../../node_modules/react-native-update/harmony/pushy.har",
}
}

View File

@@ -1,4 +1,4 @@
import { FileJSBundleProvider } from 'pushy/src/main/ets/FileJSBundleProvider';
import { PushyFileJSBundleProvider } from 'pushy/src/main/ets/PushyFileJSBundleProvider';
import { ComponentBuilderContext, RNOHCoreContext,RNAbility,
MetroJSBundleProvider } from '@rnoh/react-native-openharmony';
import {
@@ -65,7 +65,7 @@ struct Index {
// local debug mode
new MetroJSBundleProvider(),
// release mode
new FileJSBundleProvider(this.rnohCoreContext.uiAbilityContext),
new PushyFileJSBundleProvider(this.rnohCoreContext.uiAbilityContext),
new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'bundle.harmony.js')
]),
this.rnohCoreContext.logger),

View File

@@ -1,4 +1,4 @@
{
"pushy_build_time": "2025-04-12T11:12:43.423Z",
"pushy_build_time": "2025-04-30T02:46:33.340Z",
"versionName": "1.0.0"
}

View File

@@ -15,10 +15,10 @@
"hash": "pushy hash /Users/yanbo.he/Desktop/HarmonyOS/react-native-pushy/Example/harmony_use_pushy/.pushy/output/harmony.1735048297258.ppk"
},
"dependencies": {
"@react-native-oh/react-native-harmony": "^0.72.43",
"@react-native-oh/react-native-harmony": "^0.72.59",
"react": "18.2.0",
"react-native": "0.72.5",
"react-native-update": "^10.26.4"
"react-native-update": "latest"
},
"devDependencies": {
"@babel/core": "^7.20.0",

View File

@@ -62,3 +62,7 @@ buck-out/
# Ruby / CocoaPods
/ios/Pods/
/vendor/bundle/
# react-native-update
.update
.pushy

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -17,33 +17,33 @@
"form-data": "^4.0.2",
"patch-package": "^8.0.0",
"react": "19.0.0",
"react-native": "0.78.0",
"react-native-camera-kit": "^14.2.0",
"react-native-paper": "^5.13.1",
"react-native-safe-area-context": "^5.3.0",
"react-native-svg": "^15.11.2",
"react-native-update": "^10.26.4",
"react-native": "0.79.2",
"react-native-camera-kit": "^15.0.1",
"react-native-paper": "^5.14.5",
"react-native-safe-area-context": "^5.4.1",
"react-native-svg": "^15.12.0",
"react-native-update": "^10.29.0",
"react-native-vector-icons": "^10.2.0"
},
"devDependencies": {
"@babel/core": "^7.26.0",
"@babel/preset-env": "^7.26.0",
"@babel/runtime": "^7.26.0",
"@react-native-community/cli": "15.0.1",
"@react-native-community/cli-platform-android": "15.0.1",
"@react-native-community/cli-platform-ios": "15.0.1",
"@react-native/babel-preset": "0.78.0",
"@react-native/eslint-config": "0.78.0",
"@react-native/metro-config": "0.78.0",
"@react-native/typescript-config": "0.78.0",
"@babel/core": "^7.27.3",
"@babel/preset-env": "^7.27.2",
"@babel/runtime": "^7.27.3",
"@react-native-community/cli": "18.0.0",
"@react-native-community/cli-platform-android": "18.0.0",
"@react-native-community/cli-platform-ios": "18.0.0",
"@react-native/babel-preset": "0.79.2",
"@react-native/eslint-config": "0.79.2",
"@react-native/metro-config": "0.79.2",
"@react-native/typescript-config": "0.79.2",
"@types/react": "^19.0.0",
"@types/react-test-renderer": "^19.0.0",
"detox": "^20.32.0",
"detox": "^20.39.0",
"eslint": "^8.19.0",
"jest": "^29.6.3",
"prettier": "2.8.8",
"react-test-renderer": "19.0.0",
"typescript": "5.8.2"
"typescript": "5.8.3"
},
"engines": {
"node": ">=18"
@@ -52,4 +52,4 @@
"detox",
"dtrace-provider"
]
}
}

View File

@@ -78,7 +78,7 @@ if (expoProject) {
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
apply from: expoModulesCorePlugin
applyKotlinExpoModulesCorePlugin()
useExpoPublishing()
// useExpoPublishing()
useCoreDependencies()
} else {
group = 'cn.reactnative.modules.update'
@@ -148,7 +148,6 @@ repositories {
dependencies {
implementation 'com.facebook.react:react-native:+'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0'
implementation 'com.jakewharton:process-phoenix:3.0.0'
}
if (isNewArchitectureEnabled()) {
react {

36
android/proguard.pro vendored
View File

@@ -1,3 +1,37 @@
# Keep our update module classes
-keepnames class cn.reactnative.modules.update.DownloadTask { *; }
-keepnames class cn.reactnative.modules.update.UpdateModuleImpl { *; }
-keepnames class com.facebook.react.ReactInstanceManager { *; }
-keepnames class cn.reactnative.modules.update.** { *; }
# Keep React Native classes
-keepnames class com.facebook.react.ReactInstanceManager { *; }
-keepnames class com.facebook.react.** { *; }
-keepnames class com.facebook.react.bridge.** { *; }
-keepnames class com.facebook.react.devsupport.** { *; }
# Keep fields used in reflection
-keepclassmembers class com.facebook.react.ReactInstanceManager {
private JSBundleLoader mBundleLoader;
private String mJSBundleFile;
}
-keepclassmembers class com.facebook.react.ReactDelegate {
private ReactHost mReactHost;
}
-keepclassmembers class com.facebook.react.ReactHost {
private boolean mUseDevSupport;
private ReactHostDelegate mReactHostDelegate;
}
# Keep Expo related classes
-keepnames class expo.modules.ExpoReactHostFactory$ExpoReactHostDelegate { *; }
# Keep methods used in reflection
-keepclassmembers class com.facebook.react.ReactActivity {
public ReactDelegate getReactDelegate();
}
-keepclassmembers class com.facebook.react.ReactHost {
public void reload(java.lang.String);
}

View File

@@ -169,17 +169,19 @@ public class UpdateContext {
}
public void markSuccess() {
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("firstTimeOk", true);
String lastVersion = sp.getString("lastVersion", null);
String curVersion = sp.getString("currentVersion", null);
if (lastVersion != null && !lastVersion.equals(curVersion)) {
editor.remove("lastVersion");
editor.remove("hash_" + lastVersion);
}
editor.apply();
if (!BuildConfig.DEBUG) {
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("firstTimeOk", true);
String lastVersion = sp.getString("lastVersion", null);
String curVersion = sp.getString("currentVersion", null);
if (lastVersion != null && !lastVersion.equals(curVersion)) {
editor.remove("lastVersion");
editor.remove("hash_" + lastVersion);
}
editor.apply();
this.cleanUp();
this.cleanUp();
}
}
public void clearFirstTime() {

View File

@@ -147,13 +147,22 @@ public class UpdateModuleImpl {
reactHostField.setAccessible(true);
Object reactHost = reactHostField.get(reactDelegate);
Field devSupport = reactHost.getClass().getDeclaredField("mUseDevSupport");
devSupport.setAccessible(true);
devSupport.set(reactHost, false);
// Access the mReactHostDelegate field
Field reactHostDelegateField = reactHost.getClass().getDeclaredField("mReactHostDelegate");
reactHostDelegateField.setAccessible(true);
Object reactHostDelegate = reactHostDelegateField.get(reactHost);
String bundleFieldName = "jsBundleLoader";
if (reactHostDelegate.getClass().getCanonicalName().equals("expo.modules.ExpoReactHostFactory.ExpoReactHostDelegate")) {
bundleFieldName = "_jsBundleLoader";
}
// Modify the jsBundleLoader field
Field jsBundleLoaderField = reactHostDelegate.getClass().getDeclaredField("jsBundleLoader");
Field jsBundleLoaderField = reactHostDelegate.getClass().getDeclaredField(bundleFieldName);
jsBundleLoaderField.setAccessible(true);
jsBundleLoaderField.set(reactHostDelegate, loader);

View File

@@ -4,6 +4,8 @@ import static androidx.core.content.FileProvider.getUriForFile;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
@@ -17,6 +19,7 @@ import java.util.Map;
public class UpdateModule extends NativePushySpec {
UpdateContext updateContext;
public static ReactApplicationContext mContext;
private final Handler handler = new Handler(Looper.getMainLooper());
public UpdateModule(ReactApplicationContext reactContext, UpdateContext updateContext) {
super(reactContext);
this.updateContext = updateContext;
@@ -38,12 +41,22 @@ public class UpdateModule extends NativePushySpec {
boolean isFirstTime = updateContext.isFirstTime();
constants.put("isFirstTime", isFirstTime);
if (isFirstTime) {
updateContext.clearFirstTime();
handler.postDelayed(new Runnable() {
@Override
public void run() {
updateContext.clearFirstTime();
}
}, 2000);
}
String rolledBackVersion = updateContext.rolledBackVersion();
constants.put("rolledBackVersion", rolledBackVersion);
if (rolledBackVersion != null) {
updateContext.clearRollbackMark();
handler.postDelayed(new Runnable() {
@Override
public void run() {
updateContext.clearRollbackMark();
}
}, 2000);
}
constants.put("uuid", updateContext.getKv("uuid"));
return constants;

View File

@@ -20,7 +20,6 @@ import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.bridge.JSBundleLoader;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.jakewharton.processphoenix.ProcessPhoenix;
import java.io.File;
import java.lang.reflect.Field;

610
bun.lock Executable file → Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
../../../../../harmony/oh_modules/.ohpm/@rnoh+react-native-openharmony@0.72.38/oh_modules/@rnoh/react-native-openharmony

BIN
harmony/pushy.har Normal file

Binary file not shown.

View File

@@ -3,7 +3,7 @@ import fileIo from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
import { UpdateContext } from './UpdateContext';
export class FileJSBundleProvider extends JSBundleProvider {
export class PushyFileJSBundleProvider extends JSBundleProvider {
private updateContext: UpdateContext;
private filePath: string = ''

View File

@@ -1,6 +1,6 @@
{
"name": "react-native-update",
"version": "10.28.6",
"version": "10.29.2",
"description": "react-native hot update",
"main": "src/index",
"scripts": {
@@ -57,23 +57,20 @@
"devDependencies": {
"@babel/core": "^7.25.8",
"@react-native/babel-preset": "^0.73.21",
"@react-native/eslint-config": "^0.73.2",
"@react-native/typescript-config": "^0.74.0",
"@types/fs-extra": "^11.0.4",
"@types/jest": "^29.5.13",
"@types/node": "^22.7.6",
"@react-native/eslint-config": "0.79.1",
"@react-native/typescript-config": "0.79.1",
"@types/jest": "^29.5.14",
"@types/node": "^22.15.2",
"@types/react": "^18.3.11",
"detox": "^20.27.3",
"detox": "^20.37.0",
"eslint": "^8.57.0",
"eslint-plugin-ft-flow": "^3.0.7",
"firebase-tools": "^13.22.1",
"fs-extra": "^11.2.0",
"jest": "^29.7.0",
"pod-install": "^0.2.2",
"pod-install": "^0.3.7",
"prettier": "^2",
"react": "18.2.0",
"react-native": "0.73",
"ts-jest": "^29.2.5",
"ts-jest": "^29.3.2",
"typescript": "^5.6.3"
}
}

View File

@@ -9,7 +9,6 @@ podspec_dir = File.dirname(__FILE__)
Pod::Spec.new do |s|
is_expo_in_podfile = false
is_version_sufficient = false
begin
# Check Podfile for use_expo_modules!
podfile_path = File.join(Pod::Config.instance.installation_root, 'Podfile')
@@ -17,24 +16,67 @@ Pod::Spec.new do |s|
podfile_content = File.read(podfile_path)
is_expo_in_podfile = podfile_content.include?('use_expo_modules!')
end
# Check root package.json for Expo version >= 50
root_package_json_path = File.join(podspec_dir, '..', '..', 'package.json')
if File.exist?(root_package_json_path)
pkg_json = JSON.parse(File.read(root_package_json_path))
expo_version_string = pkg_json['dependencies']&.[]('expo') || pkg_json['devDependencies']&.[]('expo')
if expo_version_string
match = expo_version_string.match(/\d+/)
rescue => e
# Silently ignore errors during check
end
# Determine final validity by checking Podfile presence AND Expo version
valid_expo_project = false # Default
if is_expo_in_podfile
# Only check expo version if use_expo_modules! is present
is_version_sufficient = false
begin
expo_version_str = `node --print \"require('expo/package.json').version\"`.strip
if expo_version_str && !expo_version_str.empty?
match = expo_version_str.match(/^\d+/)
if match
major_version = match[0].to_i
is_version_sufficient = major_version >= 50
end
end
rescue
# Node command failed, version remains insufficient
end
rescue => e
# Silently ignore errors during check
# Final check
valid_expo_project = is_version_sufficient
end
# Determine final validity
valid_expo_project = is_expo_in_podfile && is_version_sufficient
# Set platform based on whether it's a valid Expo project and if we can parse its target
final_ios_deployment_target = '11.0' # Default target
if valid_expo_project
# --- Try to find and parse ExpoModulesCore.podspec only if it's an Expo project ---
parsed_expo_ios_target = nil
expo_modules_core_podspec_path = begin
package_json_path = `node -p "require.resolve('expo-modules-core/package.json')"`.strip
File.join(File.dirname(package_json_path), 'ExpoModulesCore.podspec') if $?.success? && package_json_path && !package_json_path.empty?
rescue
nil
end
if expo_modules_core_podspec_path && File.exist?(expo_modules_core_podspec_path)
begin
content = File.read(expo_modules_core_podspec_path)
match = content.match(/s\.platforms\s*=\s*\{[\s\S]*?:ios\s*=>\s*'([^\']+)'/) # Match within s.platforms hash
if match && match[1]
parsed_expo_ios_target = match[1]
else
match = content.match(/s\.platform\s*=\s*:ios,\s*'([^\']+)'/) # Fallback to s.platform = :ios, 'version'
if match && match[1]
parsed_expo_ios_target = match[1]
end
end
rescue => e
# Pod::UI.warn "Failed to read or parse ExpoModulesCore.podspec content: #{e.message}"
end
end
if parsed_expo_ios_target
final_ios_deployment_target = parsed_expo_ios_target
end
end
s.platforms = { :ios => final_ios_deployment_target }
s.name = package['name']
s.version = package['version']
@@ -45,8 +87,7 @@ Pod::Spec.new do |s|
s.homepage = package['homepage']
s.cocoapods_version = '>= 1.6.0'
s.platform = :ios, "8.0"
s.platforms = { :ios => "11.0" }
s.source = { :git => 'https://github.com/reactnativecn/react-native-update.git', :tag => '#{s.version}' }
# Conditionally set source files
@@ -92,20 +133,26 @@ Pod::Spec.new do |s|
# Conditionally add Expo subspec and check ExpoModulesCore version
if valid_expo_project
supports_bundle_url_final = false # Default
begin
# Check installed ExpoModulesCore version for bundle URL support
expo_core_package_json_path = File.join(podspec_dir, '..', 'expo-modules-core', 'package.json')
if File.exist?(expo_core_package_json_path)
core_package_json = JSON.parse(File.read(expo_core_package_json_path))
installed_version_str = core_package_json['version']
if installed_version_str
installed_version = Gem::Version.new(installed_version_str)
# 1. Try executing node to get the version string
expo_modules_core_version_str = begin
# Use node to directly require expo-modules-core/package.json and get its version
`node --print \"require('expo-modules-core/package.json').version\"` # Execute, keep raw output
rescue
# Node command failed (e.g., node not found, package not found). Return empty string.
''
end
# 2. Process the obtained version string (if not empty)
if expo_modules_core_version_str && !expo_modules_core_version_str.empty?
begin
# Compare versions using Gem::Version (handles trailing newline)
installed_version = Gem::Version.new(expo_modules_core_version_str)
target_version = Gem::Version.new('1.12.0')
supports_bundle_url_final = installed_version >= target_version
end
end
rescue JSON::ParserError, Errno::ENOENT, ArgumentError, StandardError => e
# Pod::UI.warn "Could not check ExpoModulesCore version: #{e.message}"
rescue ArgumentError
# If Gem::Version fails parsing, supports_bundle_url_final remains false.
end
end
s.subspec 'Expo' do |ss|

View File

@@ -1,3 +1,10 @@
const ownPackageJson = require('../package.json');
if (process.env.npm_package_name === ownPackageJson.name) {
console.log('Skipping postinstall during local development.');
process.exit(0);
}
const fs = require('fs');
const path = require('path');

View File

@@ -1,33 +1,33 @@
import { CheckResult, ClientOptions, ProgressData, EventType } from './type';
import {
assertDev,
DeviceEventEmitter,
EmitterSubscription,
Platform,
} from 'react-native';
import {
PushyModule,
buildTime,
cInfo,
currentVersion,
getCurrentVersionInfo,
isFirstTime,
isRolledBack,
packageVersion,
pushyNativeEventEmitter,
rolledBackVersion,
setLocalHashInfo,
} from './core';
import { PermissionsAndroid } from './permissions';
import { CheckResult, ClientOptions, EventType, ProgressData } from './type';
import {
assertWeb,
emptyObj,
enhancedFetch,
joinUrls,
log,
noop,
promiseAny,
testUrls,
} from './utils';
import {
EmitterSubscription,
Platform,
DeviceEventEmitter,
} from 'react-native';
import { PermissionsAndroid } from './permissions';
import {
PushyModule,
buildTime,
cInfo,
pushyNativeEventEmitter,
currentVersion,
packageVersion,
rolledBackVersion,
setLocalHashInfo,
isFirstTime,
isRolledBack,
getCurrentVersionInfo,
} from './core';
const SERVER_PRESETS = {
// cn
@@ -170,10 +170,12 @@ export class Pushy {
getCheckUrl = (endpoint: string = this.options.server!.main) => {
return `${endpoint}/checkUpdate/${this.options.appKey}`;
};
assertDebug = () => {
assertDebug = (matter: string) => {
if (__DEV__ && !this.options.debug) {
console.info(
'You are currently in the development environment and have not enabled debug mode. The hot update check will not be performed. If you need to debug hot updates in the development environment, please set debug to true in the client.',
`You are currently in the development environment and have not enabled debug mode.
${matter} will not be performed.
If you need to debug ${matter} in the development environment, please set debug to true in the client.`,
);
return false;
}
@@ -188,7 +190,7 @@ export class Pushy {
this.report({ type: 'markSuccess' });
};
switchVersion = async (hash: string) => {
if (!assertDev('switchVersion()')) {
if (!this.assertDebug('switchVersion()')) {
return;
}
if (assertHash(hash) && !sharedState.applyingUpdate) {
@@ -199,7 +201,7 @@ export class Pushy {
};
switchVersionLater = async (hash: string) => {
if (!assertDev('switchVersionLater()')) {
if (!this.assertDebug('switchVersionLater()')) {
return;
}
if (assertHash(hash)) {
@@ -208,7 +210,7 @@ export class Pushy {
}
};
checkUpdate = async (extra?: Record<string, any>) => {
if (!this.assertDebug()) {
if (!this.assertDebug('checkUpdate()')) {
return;
}
if (!assertWeb()) {
@@ -261,7 +263,7 @@ export class Pushy {
type: 'checking',
message: this.options.appKey + ': ' + stringifyBody,
});
resp = await fetch(this.getCheckUrl(), fetchPayload);
resp = await enhancedFetch(this.getCheckUrl(), fetchPayload);
} catch (e: any) {
this.report({
type: 'errorChecking',
@@ -272,7 +274,7 @@ export class Pushy {
try {
resp = await promiseAny(
backupEndpoints.map(endpoint =>
fetch(this.getCheckUrl(endpoint), fetchPayload),
enhancedFetch(this.getCheckUrl(endpoint), fetchPayload),
),
);
} catch (err: any) {
@@ -393,7 +395,7 @@ export class Pushy {
let lastError: any;
let errorMessages: string[] = [];
const diffUrl = await testUrls(joinUrls(paths, diff));
if (diffUrl) {
if (diffUrl && !__DEV__) {
log('downloading diff');
try {
await PushyModule.downloadPatchFromPpk({
@@ -406,60 +408,56 @@ export class Pushy {
const errorMessage = `diff error: ${e.message}`;
errorMessages.push(errorMessage);
lastError = new Error(errorMessage);
if (__DEV__) {
succeeded = 'diff';
} else {
log(errorMessage);
}
log(errorMessage);
}
}
const pdiffUrl = await testUrls(joinUrls(paths, pdiff));
if (!succeeded && pdiffUrl) {
log('downloading pdiff');
try {
await PushyModule.downloadPatchFromPackage({
updateUrl: pdiffUrl,
hash,
});
succeeded = 'pdiff';
} catch (e: any) {
const errorMessage = `pdiff error: ${e.message}`;
errorMessages.push(errorMessage);
lastError = new Error(errorMessage);
if (__DEV__) {
if (!succeeded) {
const pdiffUrl = await testUrls(joinUrls(paths, pdiff));
if (pdiffUrl && !__DEV__) {
log('downloading pdiff');
try {
await PushyModule.downloadPatchFromPackage({
updateUrl: pdiffUrl,
hash,
});
succeeded = 'pdiff';
} else {
} catch (e: any) {
const errorMessage = `pdiff error: ${e.message}`;
errorMessages.push(errorMessage);
lastError = new Error(errorMessage);
log(errorMessage);
}
}
}
const fullUrl = await testUrls(joinUrls(paths, full));
if (!succeeded && fullUrl) {
log('downloading full patch');
try {
await PushyModule.downloadFullUpdate({
updateUrl: fullUrl,
hash,
});
succeeded = 'full';
} catch (e: any) {
const errorMessage = `full patch error: ${e.message}`;
errorMessages.push(errorMessage);
lastError = new Error(errorMessage);
if (__DEV__) {
if (!succeeded) {
const fullUrl = await testUrls(joinUrls(paths, full));
if (fullUrl) {
log('downloading full patch');
try {
await PushyModule.downloadFullUpdate({
updateUrl: fullUrl,
hash,
});
succeeded = 'full';
} else {
} catch (e: any) {
const errorMessage = `full patch error: ${e.message}`;
errorMessages.push(errorMessage);
lastError = new Error(errorMessage);
log(errorMessage);
}
} else if (__DEV__) {
log(
`当前是开发环境,无法执行增量式热更新,重启不会生效。
如果需要在开发环境中测试可生效的全量热更新(但也会在再次重启后重新连接 metro
请打开“忽略时间戳”开关再重试。`,
);
succeeded = 'full';
}
}
if (sharedState.progressHandlers[hash]) {
sharedState.progressHandlers[hash].remove();
delete sharedState.progressHandlers[hash];
}
if (__DEV__) {
return hash;
}
if (!succeeded) {
this.report({
type: 'errorUpdate',

View File

@@ -251,7 +251,7 @@ export const UpdateProvider = ({
const markSuccess = client.markSuccess;
useEffect(() => {
if (!client.assertDebug()) {
if (!client.assertDebug('checkUpdate()')) {
return;
}
const { checkStrategy, dismissErrorAfter, autoMarkSuccess } = options;

View File

@@ -40,13 +40,13 @@ const ping =
: async (url: string) => {
let pingFinished = false;
return Promise.race([
fetch(url, {
enhancedFetch(url, {
method: 'HEAD',
})
.then(({ status, statusText }) => {
.then(({ status, statusText, url: finalUrl }) => {
pingFinished = true;
if (status === 200) {
return url;
return finalUrl;
}
log('ping failed', url, status, statusText);
throw new Error('Ping failed');
@@ -69,7 +69,7 @@ const ping =
export function joinUrls(paths: string[], fileName?: string) {
if (fileName) {
return paths.map(path => 'https://' + path + '/' + fileName);
return paths.map(path => `https://${path}/${fileName}`);
}
}
@@ -99,12 +99,19 @@ export const assertWeb = () => {
return true;
};
export const assertDev = (matter: string) => {
if (__DEV__) {
console.warn(
`${matter} is not supported in development environment; no action taken.`,
);
return false;
}
return true;
// export const isAndroid70AndBelow = () => {
// // android 7.0 and below devices do not support letsencrypt cert
// // https://letsencrypt.org/2023/07/10/cross-sign-expiration/
// return Platform.OS === 'android' && Platform.Version <= 24;
// };
export const enhancedFetch = async (
url: string,
params: Parameters<typeof fetch>[1],
) => {
return fetch(url, params).catch(e => {
log('fetch error', url, e);
log('trying fallback to http');
return fetch(url.replace('https', 'http'), params);
});
};