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

Compare commits

..

13 Commits

Author SHA1 Message Date
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
57 changed files with 4338 additions and 6558 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,7 @@
"expo-status-bar": "~2.0.1", "expo-status-bar": "~2.0.1",
"react": "18.3.1", "react": "18.3.1",
"react-native": "0.76.9", "react-native": "0.76.9",
"react-native-update": "^10.28.5" "react-native-update": "^10.28.7"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.25.2", "@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", "name": "harmony_use_pushy",
"dependencies": { "dependencies": {
"@react-native-oh/react-native-harmony": "^0.72.43", "@react-native-oh/react-native-harmony": "^0.72.59",
"react": "18.2.0", "react": "18.2.0",
"react-native": "0.72.5", "react-native": "0.72.5",
"react-native-update": "^10.26.4", "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": "", "license": "",
"dependencies": { "dependencies": {
"@rnoh/react-native-openharmony": "0.72.38", "@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, import { ComponentBuilderContext, RNOHCoreContext,RNAbility,
MetroJSBundleProvider } from '@rnoh/react-native-openharmony'; MetroJSBundleProvider } from '@rnoh/react-native-openharmony';
import { import {
@@ -65,7 +65,7 @@ struct Index {
// local debug mode // local debug mode
new MetroJSBundleProvider(), new MetroJSBundleProvider(),
// release mode // release mode
new FileJSBundleProvider(this.rnohCoreContext.uiAbilityContext), new PushyFileJSBundleProvider(this.rnohCoreContext.uiAbilityContext),
new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'bundle.harmony.js') new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'bundle.harmony.js')
]), ]),
this.rnohCoreContext.logger), 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" "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" "hash": "pushy hash /Users/yanbo.he/Desktop/HarmonyOS/react-native-pushy/Example/harmony_use_pushy/.pushy/output/harmony.1735048297258.ppk"
}, },
"dependencies": { "dependencies": {
"@react-native-oh/react-native-harmony": "^0.72.43", "@react-native-oh/react-native-harmony": "^0.72.59",
"react": "18.2.0", "react": "18.2.0",
"react-native": "0.72.5", "react-native": "0.72.5",
"react-native-update": "^10.26.4" "react-native-update": "latest"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.20.0", "@babel/core": "^7.20.0",

View File

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

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists 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 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME 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", "form-data": "^4.0.2",
"patch-package": "^8.0.0", "patch-package": "^8.0.0",
"react": "19.0.0", "react": "19.0.0",
"react-native": "0.78.0", "react-native": "0.79.2",
"react-native-camera-kit": "^14.2.0", "react-native-camera-kit": "^15.0.1",
"react-native-paper": "^5.13.1", "react-native-paper": "^5.14.5",
"react-native-safe-area-context": "^5.3.0", "react-native-safe-area-context": "^5.4.1",
"react-native-svg": "^15.11.2", "react-native-svg": "^15.12.0",
"react-native-update": "^10.26.4", "react-native-update": "^10.28.11",
"react-native-vector-icons": "^10.2.0" "react-native-vector-icons": "^10.2.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.0", "@babel/core": "^7.27.3",
"@babel/preset-env": "^7.26.0", "@babel/preset-env": "^7.27.2",
"@babel/runtime": "^7.26.0", "@babel/runtime": "^7.27.3",
"@react-native-community/cli": "15.0.1", "@react-native-community/cli": "18.0.0",
"@react-native-community/cli-platform-android": "15.0.1", "@react-native-community/cli-platform-android": "18.0.0",
"@react-native-community/cli-platform-ios": "15.0.1", "@react-native-community/cli-platform-ios": "18.0.0",
"@react-native/babel-preset": "0.78.0", "@react-native/babel-preset": "0.79.2",
"@react-native/eslint-config": "0.78.0", "@react-native/eslint-config": "0.79.2",
"@react-native/metro-config": "0.78.0", "@react-native/metro-config": "0.79.2",
"@react-native/typescript-config": "0.78.0", "@react-native/typescript-config": "0.79.2",
"@types/react": "^19.0.0", "@types/react": "^19.0.0",
"@types/react-test-renderer": "^19.0.0", "@types/react-test-renderer": "^19.0.0",
"detox": "^20.32.0", "detox": "^20.39.0",
"eslint": "^8.19.0", "eslint": "^8.19.0",
"jest": "^29.6.3", "jest": "^29.6.3",
"prettier": "2.8.8", "prettier": "2.8.8",
"react-test-renderer": "19.0.0", "react-test-renderer": "19.0.0",
"typescript": "5.8.2" "typescript": "5.8.3"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"

View File

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

View File

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

View File

@@ -20,7 +20,6 @@ import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.bridge.JSBundleLoader; import com.facebook.react.bridge.JSBundleLoader;
import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.jakewharton.processphoenix.ProcessPhoenix;
import java.io.File; import java.io.File;
import java.lang.reflect.Field; 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 common from '@ohos.app.ability.common';
import { UpdateContext } from './UpdateContext'; import { UpdateContext } from './UpdateContext';
export class FileJSBundleProvider extends JSBundleProvider { export class PushyFileJSBundleProvider extends JSBundleProvider {
private updateContext: UpdateContext; private updateContext: UpdateContext;
private filePath: string = '' private filePath: string = ''

View File

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

View File

@@ -9,7 +9,6 @@ podspec_dir = File.dirname(__FILE__)
Pod::Spec.new do |s| Pod::Spec.new do |s|
is_expo_in_podfile = false is_expo_in_podfile = false
is_version_sufficient = false
begin begin
# Check Podfile for use_expo_modules! # Check Podfile for use_expo_modules!
podfile_path = File.join(Pod::Config.instance.installation_root, 'Podfile') 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) podfile_content = File.read(podfile_path)
is_expo_in_podfile = podfile_content.include?('use_expo_modules!') is_expo_in_podfile = podfile_content.include?('use_expo_modules!')
end end
# Check root package.json for Expo version >= 50 rescue => e
root_package_json_path = File.join(podspec_dir, '..', '..', 'package.json') # Silently ignore errors during check
if File.exist?(root_package_json_path) end
pkg_json = JSON.parse(File.read(root_package_json_path))
expo_version_string = pkg_json['dependencies']&.[]('expo') || pkg_json['devDependencies']&.[]('expo') # Determine final validity by checking Podfile presence AND Expo version
if expo_version_string valid_expo_project = false # Default
match = expo_version_string.match(/\d+/) 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 if match
major_version = match[0].to_i major_version = match[0].to_i
is_version_sufficient = major_version >= 50 is_version_sufficient = major_version >= 50
end end
end end
rescue
# Node command failed, version remains insufficient
end
# Final check
valid_expo_project = is_version_sufficient
end
# 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 end
rescue => e rescue => e
# Silently ignore errors during check # Pod::UI.warn "Failed to read or parse ExpoModulesCore.podspec content: #{e.message}"
end end
# Determine final validity end
valid_expo_project = is_expo_in_podfile && is_version_sufficient 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.name = package['name']
s.version = package['version'] s.version = package['version']
@@ -45,8 +87,7 @@ Pod::Spec.new do |s|
s.homepage = package['homepage'] s.homepage = package['homepage']
s.cocoapods_version = '>= 1.6.0' 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}' } s.source = { :git => 'https://github.com/reactnativecn/react-native-update.git', :tag => '#{s.version}' }
# Conditionally set source files # Conditionally set source files
@@ -92,21 +133,27 @@ Pod::Spec.new do |s|
# Conditionally add Expo subspec and check ExpoModulesCore version # Conditionally add Expo subspec and check ExpoModulesCore version
if valid_expo_project if valid_expo_project
supports_bundle_url_final = false # Default supports_bundle_url_final = false # Default
# 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 begin
# Check installed ExpoModulesCore version for bundle URL support # Compare versions using Gem::Version (handles trailing newline)
expo_core_package_json_path = File.join(podspec_dir, '..', 'expo-modules-core', 'package.json') installed_version = Gem::Version.new(expo_modules_core_version_str)
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)
target_version = Gem::Version.new('1.12.0') target_version = Gem::Version.new('1.12.0')
supports_bundle_url_final = installed_version >= target_version supports_bundle_url_final = installed_version >= target_version
rescue ArgumentError
# If Gem::Version fails parsing, supports_bundle_url_final remains false.
end end
end end
rescue JSON::ParserError, Errno::ENOENT, ArgumentError, StandardError => e
# Pod::UI.warn "Could not check ExpoModulesCore version: #{e.message}"
end
s.subspec 'Expo' do |ss| s.subspec 'Expo' do |ss|
ss.source_files = 'ios/Expo/**/*.{h,m,mm,swift}' ss.source_files = 'ios/Expo/**/*.{h,m,mm,swift}'

View File

@@ -1,33 +1,33 @@
import { CheckResult, ClientOptions, ProgressData, EventType } from './type';
import { 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, assertWeb,
emptyObj, emptyObj,
enhancedFetch,
joinUrls, joinUrls,
log, log,
noop, noop,
promiseAny, promiseAny,
testUrls, testUrls,
} from './utils'; } 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 = { const SERVER_PRESETS = {
// cn // cn
@@ -170,10 +170,12 @@ export class Pushy {
getCheckUrl = (endpoint: string = this.options.server!.main) => { getCheckUrl = (endpoint: string = this.options.server!.main) => {
return `${endpoint}/checkUpdate/${this.options.appKey}`; return `${endpoint}/checkUpdate/${this.options.appKey}`;
}; };
assertDebug = () => { assertDebug = (matter: string) => {
if (__DEV__ && !this.options.debug) { if (__DEV__ && !this.options.debug) {
console.info( 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; return false;
} }
@@ -188,7 +190,7 @@ export class Pushy {
this.report({ type: 'markSuccess' }); this.report({ type: 'markSuccess' });
}; };
switchVersion = async (hash: string) => { switchVersion = async (hash: string) => {
if (!assertDev('switchVersion()')) { if (!this.assertDebug('switchVersion()')) {
return; return;
} }
if (assertHash(hash) && !sharedState.applyingUpdate) { if (assertHash(hash) && !sharedState.applyingUpdate) {
@@ -199,7 +201,7 @@ export class Pushy {
}; };
switchVersionLater = async (hash: string) => { switchVersionLater = async (hash: string) => {
if (!assertDev('switchVersionLater()')) { if (!this.assertDebug('switchVersionLater()')) {
return; return;
} }
if (assertHash(hash)) { if (assertHash(hash)) {
@@ -208,7 +210,7 @@ export class Pushy {
} }
}; };
checkUpdate = async (extra?: Record<string, any>) => { checkUpdate = async (extra?: Record<string, any>) => {
if (!this.assertDebug()) { if (!this.assertDebug('checkUpdate()')) {
return; return;
} }
if (!assertWeb()) { if (!assertWeb()) {
@@ -261,7 +263,7 @@ export class Pushy {
type: 'checking', type: 'checking',
message: this.options.appKey + ': ' + stringifyBody, message: this.options.appKey + ': ' + stringifyBody,
}); });
resp = await fetch(this.getCheckUrl(), fetchPayload); resp = await enhancedFetch(this.getCheckUrl(), fetchPayload);
} catch (e: any) { } catch (e: any) {
this.report({ this.report({
type: 'errorChecking', type: 'errorChecking',
@@ -272,7 +274,7 @@ export class Pushy {
try { try {
resp = await promiseAny( resp = await promiseAny(
backupEndpoints.map(endpoint => backupEndpoints.map(endpoint =>
fetch(this.getCheckUrl(endpoint), fetchPayload), enhancedFetch(this.getCheckUrl(endpoint), fetchPayload),
), ),
); );
} catch (err: any) { } catch (err: any) {
@@ -393,7 +395,7 @@ export class Pushy {
let lastError: any; let lastError: any;
let errorMessages: string[] = []; let errorMessages: string[] = [];
const diffUrl = await testUrls(joinUrls(paths, diff)); const diffUrl = await testUrls(joinUrls(paths, diff));
if (diffUrl) { if (diffUrl && !__DEV__) {
log('downloading diff'); log('downloading diff');
try { try {
await PushyModule.downloadPatchFromPpk({ await PushyModule.downloadPatchFromPpk({
@@ -406,15 +408,12 @@ export class Pushy {
const errorMessage = `diff error: ${e.message}`; const errorMessage = `diff error: ${e.message}`;
errorMessages.push(errorMessage); errorMessages.push(errorMessage);
lastError = new Error(errorMessage); lastError = new Error(errorMessage);
if (__DEV__) {
succeeded = 'diff';
} else {
log(errorMessage); log(errorMessage);
} }
} }
} if (!succeeded) {
const pdiffUrl = await testUrls(joinUrls(paths, pdiff)); const pdiffUrl = await testUrls(joinUrls(paths, pdiff));
if (!succeeded && pdiffUrl) { if (pdiffUrl && !__DEV__) {
log('downloading pdiff'); log('downloading pdiff');
try { try {
await PushyModule.downloadPatchFromPackage({ await PushyModule.downloadPatchFromPackage({
@@ -426,15 +425,13 @@ export class Pushy {
const errorMessage = `pdiff error: ${e.message}`; const errorMessage = `pdiff error: ${e.message}`;
errorMessages.push(errorMessage); errorMessages.push(errorMessage);
lastError = new Error(errorMessage); lastError = new Error(errorMessage);
if (__DEV__) {
succeeded = 'pdiff';
} else {
log(errorMessage); log(errorMessage);
} }
} }
} }
if (!succeeded) {
const fullUrl = await testUrls(joinUrls(paths, full)); const fullUrl = await testUrls(joinUrls(paths, full));
if (!succeeded && fullUrl) { if (fullUrl) {
log('downloading full patch'); log('downloading full patch');
try { try {
await PushyModule.downloadFullUpdate({ await PushyModule.downloadFullUpdate({
@@ -446,20 +443,21 @@ export class Pushy {
const errorMessage = `full patch error: ${e.message}`; const errorMessage = `full patch error: ${e.message}`;
errorMessages.push(errorMessage); errorMessages.push(errorMessage);
lastError = new Error(errorMessage); lastError = new Error(errorMessage);
if (__DEV__) {
succeeded = 'full';
} else {
log(errorMessage); log(errorMessage);
} }
} else if (__DEV__) {
log(
`当前是开发环境,无法执行增量式热更新,重启不会生效。
如果需要在开发环境中测试可生效的全量热更新(但也会在再次重启后重新连接 metro
请打开“忽略时间戳”开关再重试。`,
);
succeeded = 'full';
} }
} }
if (sharedState.progressHandlers[hash]) { if (sharedState.progressHandlers[hash]) {
sharedState.progressHandlers[hash].remove(); sharedState.progressHandlers[hash].remove();
delete sharedState.progressHandlers[hash]; delete sharedState.progressHandlers[hash];
} }
if (__DEV__) {
return hash;
}
if (!succeeded) { if (!succeeded) {
this.report({ this.report({
type: 'errorUpdate', type: 'errorUpdate',

View File

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

View File

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