From 6f374efaaba2894c6c89f9aa92845c3c1104da26 Mon Sep 17 00:00:00 2001 From: sunnylqm Date: Wed, 21 May 2025 11:11:04 +0800 Subject: [PATCH] add enhancedfetch for android <=7 --- lib/main.ts | 6 +++--- lib/utils.ts | 31 +++++++++++++++++++++++++++---- package.json | 2 +- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/lib/main.ts b/lib/main.ts index fbd600a..80c717d 100644 --- a/lib/main.ts +++ b/lib/main.ts @@ -16,7 +16,7 @@ import { UpdateAvailableResult, UpdateEventsListener, } from './type'; -import { assertRelease, logger, promiseAny, testUrls } from './utils'; +import { assertRelease, enhancedFetch, logger, promiseAny, testUrls } from './utils'; export { setCustomEndpoints }; const { version: v, @@ -153,7 +153,7 @@ export async function checkUpdate(APPKEY: string) { }; let resp; try { - resp = await fetch(getCheckUrl(APPKEY), fetchPayload); + resp = await enhancedFetch(getCheckUrl(APPKEY), fetchPayload); } catch (e: any) { report({ type: 'errorChecking', @@ -164,7 +164,7 @@ export async function checkUpdate(APPKEY: string) { try { resp = await promiseAny( backupEndpoints.map((endpoint) => - fetch(getCheckUrl(APPKEY, endpoint), fetchPayload), + enhancedFetch(getCheckUrl(APPKEY, endpoint), fetchPayload), ), ); } catch {} diff --git a/lib/utils.ts b/lib/utils.ts index d0b7adc..7272e36 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -33,15 +33,15 @@ 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; } - logger('ping failed', url, status, statusText); + logger('ping failed', finalUrl, status, statusText); throw new Error('Ping failed'); }) .catch((e) => { @@ -73,3 +73,26 @@ export const testUrls = async (urls?: string[]) => { logger('all ping failed, use first url:', urls[0]); return urls[0]; }; + +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[1], +) => { + return fetch(url, params).catch((e) => { + logger('fetch error', url, e); + if (isAndroid70AndBelow()) { + logger( + `try fallback to http because android version: ${Platform.Version}`, + ); + return fetch(url.replace('https', 'http'), params); + } else { + throw e; + } + }); +}; diff --git a/package.json b/package.json index 485252c..dcf1114 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-update", - "version": "8.5.6", + "version": "8.5.7", "description": "react-native hot update", "main": "dist/index.js", "types": "dist/index.d.ts",