From 06f89b9500735dcab584d4974fa75f0acab92ce9 Mon Sep 17 00:00:00 2001 From: huhuanming Date: Fri, 12 Jun 2026 14:05:43 +0800 Subject: [PATCH 1/3] fix: suspend-aware active-time watchdog for iOS split-bundle segments The 30s segment-eval watchdog used a bare dispatch_after; when the app was suspended during cold start while a segment's eval was buffered, the deadline elapsed during suspension and the stale watchdog won the SBLSettleGuard race on resume, false-rejecting the segment as SPLIT_BUNDLE_TIMEOUT (white screen). Replace it with SBLActiveWatchdog: a CLOCK_UPTIME_RAW active-time accumulator + cancelable dispatch_source timer that pauses on WillResignActive (sampling the resign instant synchronously so suspended time can't be folded in) and resumes with a 500ms grace on DidBecomeActive, giving the buffered executor a chance to flush before the watchdog can fire. Fails safe (fireLocked) if the timer source can't be created. --- .../ios/SplitBundleLoader.mm | 356 +++++++++++++++++- 1 file changed, 336 insertions(+), 20 deletions(-) diff --git a/native-modules/react-native-split-bundle-loader/ios/SplitBundleLoader.mm b/native-modules/react-native-split-bundle-loader/ios/SplitBundleLoader.mm index f5e0e42b..cc6598a4 100644 --- a/native-modules/react-native-split-bundle-loader/ios/SplitBundleLoader.mm +++ b/native-modules/react-native-split-bundle-loader/ios/SplitBundleLoader.mm @@ -3,6 +3,7 @@ #import #import #import +#import #import #import #import @@ -74,6 +75,304 @@ - (BOOL)tryClaim { } @end +// ACTIVE-TIME watchdog for the buffered runtime executor (replaces the bare +// dispatch_after C1 watchdog). +// +// WHY: the old watchdog was a single `dispatch_after(NOW + 30s)`. dispatch_after +// arms against an ABSOLUTE wall/uptime deadline that keeps elapsing while the +// app is backgrounded/suspended. If the app is suspended during cold start while +// a segment's eval is still BUFFERED (waiting for the entry bundle to finish), +// the 30s deadline can pass entirely off-screen; on FOREGROUND RESUME the stale +// block fires essentially instantly and wins the SBLSettleGuard race against the +// buffered executor that was ~1ms from succeeding — false-rejecting the segment +// as SPLIT_BUNDLE_TIMEOUT and white-screening the app. +// +// This watchdog instead accumulates ONLY foreground/active wall-time: suspended +// time never accrues toward the 30s, and a fresh foreground-grace window after +// every resume guarantees the buffered executor gets a chance to flush first, so +// a stale deadline can never fire instantly on resume. +// +// Time base: CLOCK_UPTIME_RAW already excludes device sleep; on top of that we +// only count intervals during which the app is in the active state. All mutable +// timing state is confined to a single serial queue (_queue) so the timer tick, +// the start/cancel calls, and the foreground/background notification callbacks +// never race. The fired/cancelled one-shot flag makes both onTimeout and teardown +// happen at most once regardless of which thread triggers them. +@interface SBLActiveWatchdog : NSObject +- (instancetype)initWithTimeoutMs:(uint64_t)timeoutMs + foregroundGraceMs:(uint64_t)foregroundGraceMs + onTimeout:(dispatch_block_t)onTimeout; +- (void)start; +- (void)cancel; +@end + +@implementation SBLActiveWatchdog { + // Serial queue that owns ALL mutable state below — every read/write of these + // ivars happens on _queue, so no additional lock is needed. + dispatch_queue_t _queue; + dispatch_source_t _timer; + + uint64_t _timeoutMs; // active-time budget before firing (e.g. 30000). + uint64_t _foregroundGraceMs; // post-resume window during which we won't fire. + + uint64_t _accumulatedActiveMs; // folded active time from completed intervals. + uint64_t _currentIntervalStartUptimeNs; // CLOCK_UPTIME_RAW at active start. + uint64_t _graceUntilUptimeNs; // no fire before this uptime (grace window). + BOOL _isActive; // app currently in active/foreground state. + BOOL _finished; // one-shot: fired OR cancelled. + + dispatch_block_t _onTimeout; + BOOL _observersRegistered; +} + +- (instancetype)initWithTimeoutMs:(uint64_t)timeoutMs + foregroundGraceMs:(uint64_t)foregroundGraceMs + onTimeout:(dispatch_block_t)onTimeout { + if (self = [super init]) { + _queue = dispatch_queue_create("com.onekey.splitbundle.watchdog", DISPATCH_QUEUE_SERIAL); + _timeoutMs = timeoutMs; + _foregroundGraceMs = foregroundGraceMs; + _onTimeout = [onTimeout copy]; + _accumulatedActiveMs = 0; + _currentIntervalStartUptimeNs = 0; + _graceUntilUptimeNs = 0; + _isActive = NO; + _finished = NO; + _observersRegistered = NO; + } + return self; +} + +static uint64_t SBLNowUptimeNs(void) { + return clock_gettime_nsec_np(CLOCK_UPTIME_RAW); +} + +// Current active-interval elapsed (ms) while _isActive; 0 otherwise. _queue only. +- (uint64_t)currentIntervalMsLocked { + if (!_isActive || _currentIntervalStartUptimeNs == 0) { + return 0; + } + uint64_t now = SBLNowUptimeNs(); + if (now <= _currentIntervalStartUptimeNs) { + return 0; + } + return (now - _currentIntervalStartUptimeNs) / 1000000ULL; +} + +- (void)start { + // Seed initial app-state + register observers on the MAIN thread: + // -applicationState and the notification center are both main-thread concerns. + // We then hop to _queue with the captured `activeNow` to prime timing + timer, + // so the timing-state ivars are only ever touched on _queue. + dispatch_async(dispatch_get_main_queue(), ^{ + [self registerObservers]; + // Treat anything other than Background as "active" for timing purposes + // (Inactive still makes progress toward the wedge). + UIApplicationState appState = UIApplication.sharedApplication.applicationState; + BOOL activeNow = (appState != UIApplicationStateBackground); + dispatch_async(self->_queue, ^{ + [self primeTimerLockedWithActive:activeNow]; + }); + }); +} + +// Initialize timing state and create+resume the polling timer. _queue only. +- (void)primeTimerLockedWithActive:(BOOL)activeNow { + if (_finished) { + return; // cancelled before we got to prime — nothing to do. + } + _isActive = activeNow; + // Apply an initial grace window so a slow first foreground frame doesn't + // immediately trip the watchdog the very first tick. Read the clock ONCE so + // the interval start and the grace deadline share the same base instant. + if (activeNow) { + uint64_t now = SBLNowUptimeNs(); + _currentIntervalStartUptimeNs = now; + _graceUntilUptimeNs = now + _foregroundGraceMs * 1000000ULL; + } else { + _currentIntervalStartUptimeNs = 0; + } + + // Polling timer: survives pause/resume trivially (unlike a one-shot + // dispatch_after). Tick every 500ms. Leeway gives the scheduler slack. + _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _queue); + if (!_timer) { + // Fail safe: if the timer source can't be created we cannot guard against a + // wedge. Settle now (as a RETRYABLE timeout) via fireLocked rather than + // leaving the watchdog half-started (observers registered, _finished=NO, + // tick never firing) — that stuck state would hang loadSegment: forever. + // The JS loader re-attempts on SPLIT_BUNDLE_TIMEOUT, and the buffered + // executor, if it does run, still benefits the module table. + [self fireLocked]; + return; + } + dispatch_source_set_timer(_timer, + dispatch_time(DISPATCH_TIME_NOW, (int64_t)(500 * NSEC_PER_MSEC)), + (uint64_t)(500 * NSEC_PER_MSEC), + (uint64_t)(100 * NSEC_PER_MSEC)); + __weak SBLActiveWatchdog *weakSelf = self; + dispatch_source_set_event_handler(_timer, ^{ + SBLActiveWatchdog *strongSelf = weakSelf; + if (strongSelf) { + [strongSelf tickLocked]; + } + }); + dispatch_resume(_timer); +} + +// Timer tick — runs on _queue (the timer's own queue), so state is consistent. +- (void)tickLocked { + if (_finished) { + return; + } + if (!_isActive) { + return; // only foreground/active time counts toward the timeout. + } + uint64_t now = SBLNowUptimeNs(); + if (now < _graceUntilUptimeNs) { + return; // inside the post-resume grace window — give the executor a chance. + } + uint64_t totalActiveMs = _accumulatedActiveMs + [self currentIntervalMsLocked]; + if (totalActiveMs >= _timeoutMs) { + [self fireLocked]; + } +} + +// Fire onTimeout at most once, then tear everything down. _queue only. +- (void)fireLocked { + if (_finished) { + return; + } + _finished = YES; + dispatch_block_t cb = _onTimeout; + _onTimeout = nil; + [self teardownTimerLocked]; + // Remove observers on the main thread (where they were registered). + dispatch_async(dispatch_get_main_queue(), ^{ + [self removeObservers]; + }); + if (cb) { + cb(); + } +} + +// Cancel the timer source exactly once. _queue only. +- (void)teardownTimerLocked { + if (_timer) { + dispatch_source_cancel(_timer); + _timer = nil; // drop our ref; the source is retained until cancel completes. + } +} + +// Public cancel — thread-safe, may be called from the executor block's success +// path on a DIFFERENT thread. Hops onto _queue so it serializes with the tick. +- (void)cancel { + dispatch_async(_queue, ^{ + if (self->_finished) { + return; + } + self->_finished = YES; + self->_onTimeout = nil; + [self teardownTimerLocked]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self removeObservers]; + }); + }); +} + +// MARK: - App-state observers (main thread) + +- (void)registerObservers { + if (_observersRegistered) { + return; + } + _observersRegistered = YES; + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(handleDidBecomeActive) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + [nc addObserver:self + selector:@selector(handleWillResignActive) + name:UIApplicationWillResignActiveNotification + object:nil]; + // DidEnterBackground is folded in too: on some transitions WillResignActive + // and DidEnterBackground both arrive; the resign handler is idempotent (it + // no-ops when already inactive), so treating background like resign is safe. + [nc addObserver:self + selector:@selector(handleWillResignActive) + name:UIApplicationDidEnterBackgroundNotification + object:nil]; +} + +- (void)removeObservers { + if (!_observersRegistered) { + return; + } + _observersRegistered = NO; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)handleWillResignActive { + // Sample the resign instant SYNCHRONOUSLY here (main thread), BEFORE the app + // can suspend. The _queue block below may not run until the app is resumed + // minutes later; if it sampled the clock then (via currentIntervalMsLocked), + // it would fold all the suspended-but-awake wall time — during which + // CLOCK_UPTIME_RAW keeps advancing — into _accumulatedActiveMs, and the + // watchdog could fire right after the 500ms resume grace, re-introducing the + // exact false-fire this watchdog exists to prevent. Capturing resignAt up + // front caps the accrued interval at the moment the app actually went inactive. + uint64_t resignAtUptimeNs = SBLNowUptimeNs(); + dispatch_async(_queue, ^{ + if (self->_finished || !self->_isActive) { + return; // idempotent: already inactive or already settled. + } + // Fold ONLY the active interval up to resignAt into the accumulator, then + // stop the clock. Suspended time after this point does NOT accrue. + if (self->_currentIntervalStartUptimeNs != 0 && + resignAtUptimeNs > self->_currentIntervalStartUptimeNs) { + self->_accumulatedActiveMs += + (resignAtUptimeNs - self->_currentIntervalStartUptimeNs) / 1000000ULL; + } + self->_isActive = NO; + self->_currentIntervalStartUptimeNs = 0; + }); +} + +- (void)handleDidBecomeActive { + dispatch_async(_queue, ^{ + if (self->_finished || self->_isActive) { + return; + } + // Resume the clock and arm a fresh grace window so the buffered executor + // gets a chance to flush before the watchdog can fire again. One clock read + // so the interval start and the grace deadline share the same base instant. + uint64_t now = SBLNowUptimeNs(); + self->_isActive = YES; + self->_currentIntervalStartUptimeNs = now; + self->_graceUntilUptimeNs = now + self->_foregroundGraceMs * 1000000ULL; + }); +} + +- (void)dealloc { + // Defensive: observers are normally removed via cancel/fire, but if this + // object is released without either (shouldn't happen — the executor block + // retains it until cancel), make sure we don't leave a dangling observer. + if (_observersRegistered) { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + } + // Make the "timer is nil by dealloc" invariant explicit: cancel/fireLocked + // both null _timer before the last retain drops, but guard here so a future + // early-return on those paths can't orphan a running dispatch_source_t. Safe + // to touch _timer without hopping to _queue — no other thread references a + // deallocating object. + if (_timer) { + dispatch_source_cancel(_timer); + _timer = nil; + } +} +@end + // Watchdog window for the buffered runtime executor (C1). Post-entry eval is // sub-millisecond, so this only ever elapses on a genuine wedge (entry bundle // never finished evaluating) — never on a healthy slow device. @@ -362,11 +661,30 @@ + (void)evaluateSegmentAtPath:(NSString *)bundlePath // either order, on a wedge). SBLSettleGuard *settleGuard = [[SBLSettleGuard alloc] init]; + // C1 active-time watchdog. Constructed BEFORE the executor block so the block + // can capture (retain) it and tear it down on the happy path. It fires only + // on a genuine wedge AND only after kSegmentEvalWatchdogSeconds of + // FOREGROUND/active time has accrued — backgrounded/suspended time never + // counts, so a stale deadline can never fire instantly on a foreground + // resume (the white-screen bug this replaces). On fire it settles the SAME + // SBLSettleGuard via tryClaim, so there is still exactly one settle. + SBLActiveWatchdog *watchdog = [[SBLActiveWatchdog alloc] + initWithTimeoutMs:(uint64_t)(kSegmentEvalWatchdogSeconds * 1000.0) + foregroundGraceMs:500 + onTimeout:^{ + if ([settleGuard tryClaim]) { + [SBLLogger error:[NSString stringWithFormat:@"[SplitBundle] loadSegment: %@ (key=%@) WATCHDOG fired after %.0fs active time — runtime executor never ran (entry bundle likely never finished evaluating). Rejecting as retryable timeout.", sourceURL, segmentKey, kSegmentEvalWatchdogSeconds]]; + onEvaluated([NSError errorWithDomain:@"SplitBundleLoader" + code:ESegmentEvalErrorTimeout + userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Segment %@ eval timed out after %.0fs active time (buffered runtime executor never ran)", segmentKey, kSegmentEvalWatchdogSeconds]}]); + } + }]; + [instance callFunctionOnBufferedRuntimeExecutor:^(facebook::jsi::Runtime &runtime) { @autoreleasepool { - // If the watchdog already fired (entry took >30s then unwedged), - // the JS promise is already rejected — still evaluate the segment - // (the module table benefits) but don't double-settle. + // If the watchdog already fired (entry took >30s active then + // unwedged), the JS promise is already rejected — still evaluate the + // segment (the module table benefits) but don't double-settle. BOOL won = [settleGuard tryClaim]; NSError *evalError = nil; CFAbsoluteTime evalStart = CFAbsoluteTimeGetCurrent(); @@ -389,33 +707,31 @@ + (void)evaluateSegmentAtPath:(NSString *)bundlePath userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Segment evaluation failed for %@ (unknown C++ exception)", sourceURL]}]; [SBLLogger warn:[NSString stringWithFormat:@"[SplitBundle] loadSegment: %@ evaluation threw an unknown exception", sourceURL]]; } + // Tear down the active-time watchdog (timer + observers) regardless + // of who won the settle: the buffered executor has now run, so the + // watchdog has no further job. Capturing `watchdog` here is also what + // RETAINS it for the lifetime of this async block (until cancel). It + // is safe to cancel from this (different) thread — cancel hops onto + // the watchdog's own serial queue and is a one-shot. + [watchdog cancel]; if (won) { // Resolve/reject the JS promise from INSIDE this same block, // strictly AFTER the segment eval above — the ordering guarantee // that fixes the "Requiring unknown module" race (see method doc). onEvaluated(evalError); } else { - [SBLLogger warn:[NSString stringWithFormat:@"[SplitBundle] loadSegment: %@ evaluated AFTER watchdog already settled (entry was wedged >%.0fs)", sourceURL, kSegmentEvalWatchdogSeconds]]; + [SBLLogger warn:[NSString stringWithFormat:@"[SplitBundle] loadSegment: %@ evaluated AFTER watchdog already settled (entry was wedged >%.0fs active time)", sourceURL, kSegmentEvalWatchdogSeconds]]; } } }]; - // C1 watchdog. Fires only on a genuine wedge: in steady state the entry - // bundle is long done and the buffered block runs sub-millisecond, so the - // guard is already claimed (tryClaim returns NO) long before this elapses. - // On a real wedge it settles the promise with a distinct, RETRYABLE timeout - // error so the JS loader can re-attempt instead of hanging inflightSegments - // forever. The block retains settleGuard, so the lock stays valid even if - // the executor block later runs (entry finally evaluates). - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kSegmentEvalWatchdogSeconds * NSEC_PER_SEC)), - dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{ - if ([settleGuard tryClaim]) { - [SBLLogger error:[NSString stringWithFormat:@"[SplitBundle] loadSegment: %@ (key=%@) WATCHDOG fired after %.0fs — runtime executor never ran (entry bundle likely never finished evaluating). Rejecting as retryable timeout.", sourceURL, segmentKey, kSegmentEvalWatchdogSeconds]]; - onEvaluated([NSError errorWithDomain:@"SplitBundleLoader" - code:ESegmentEvalErrorTimeout - userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Segment %@ eval timed out after %.0fs (buffered runtime executor never ran)", segmentKey, kSegmentEvalWatchdogSeconds]}]); - } - }); + // Arm the watchdog AFTER scheduling the executor. Fires only on a genuine + // wedge: in steady state the entry bundle is long done and the buffered block + // runs sub-millisecond, so it cancels the watchdog (and the guard is already + // claimed) long before kSegmentEvalWatchdogSeconds of ACTIVE time elapses. + // Because only foreground/active time is counted, a suspend-during-cold-start + // can no longer let a stale deadline false-fire on resume. + [watchdog start]; double dispatchMs = (CFAbsoluteTimeGetCurrent() - dispatchStart) * 1000.0; [SBLLogger info:[NSString stringWithFormat:@"[SplitBundle] loadSegment: %@ dispatched in %.1fms (resolve fires after eval; watchdog %.0fs)", sourceURL, dispatchMs, kSegmentEvalWatchdogSeconds]]; From 246fa89e0ddab6863f1195c93b277c101bb3ec99 Mon Sep 17 00:00:00 2001 From: huhuanming Date: Fri, 12 Jun 2026 14:22:39 +0800 Subject: [PATCH 2/3] fix: pause split-bundle watchdog synchronously to close resume tick race MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The active-time watchdog folded its pause on an async _queue block, so a timer tick already pending on _queue before WillResignActive could run first on resume — tickLocked recomputes `now` at execution time, so a suspension-delayed tick saw stale _isActive==YES + the old interval start and folded suspended-but-awake time, firing a false SPLIT_BUNDLE_TIMEOUT before the resume grace was armed. Fold + pause via dispatch_sync so the clock is stopped (and any pending tick is flushed at a valid pre-suspension instant) before the lifecycle callback returns. No deadlock: _queue blocks never sync back to main. --- .../ios/SplitBundleLoader.mm | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/native-modules/react-native-split-bundle-loader/ios/SplitBundleLoader.mm b/native-modules/react-native-split-bundle-loader/ios/SplitBundleLoader.mm index cc6598a4..7ec0db39 100644 --- a/native-modules/react-native-split-bundle-loader/ios/SplitBundleLoader.mm +++ b/native-modules/react-native-split-bundle-loader/ios/SplitBundleLoader.mm @@ -314,16 +314,25 @@ - (void)removeObservers { } - (void)handleWillResignActive { - // Sample the resign instant SYNCHRONOUSLY here (main thread), BEFORE the app - // can suspend. The _queue block below may not run until the app is resumed - // minutes later; if it sampled the clock then (via currentIntervalMsLocked), - // it would fold all the suspended-but-awake wall time — during which - // CLOCK_UPTIME_RAW keeps advancing — into _accumulatedActiveMs, and the - // watchdog could fire right after the 500ms resume grace, re-introducing the - // exact false-fire this watchdog exists to prevent. Capturing resignAt up - // front caps the accrued interval at the moment the app actually went inactive. + // Sample the resign instant on the main thread BEFORE the app can suspend. uint64_t resignAtUptimeNs = SBLNowUptimeNs(); - dispatch_async(_queue, ^{ + // Fold + pause SYNCHRONOUSLY (dispatch_sync, not async). The pause must take + // effect before this lifecycle callback returns — i.e. before the app is + // suspended. Why sync is required, not just a synchronous timestamp: + // - the polling timer fires on _queue; a tick may already be PENDING on + // _queue when we resign. tickLocked recomputes `now` at EXECUTION time, so + // if that pending tick doesn't run until the app RESUMES (minutes later), + // it would see _isActive==YES + the old interval start and fold all the + // suspended-but-awake time (CLOCK_UPTIME_RAW keeps advancing) → fire a + // false SPLIT_BUNDLE_TIMEOUT before the resume grace is even armed. + // - dispatch_sync drains the serial queue first: any pending tick runs NOW + // (at resign time, pre-suspension, with a valid small interval — no false + // fire), then this fold runs and sets _isActive=NO. So by the time the app + // suspends, the clock is stopped and no stale tick can fire on resume. + // Safe from deadlock: _queue blocks never dispatch_sync back to the main + // thread (observer removal uses dispatch_async), and the queue's blocks are + // all O(1). + dispatch_sync(_queue, ^{ if (self->_finished || !self->_isActive) { return; // idempotent: already inactive or already settled. } From 624d178e0ab0f9a5370ba9c8c960d7979b156c4f Mon Sep 17 00:00:00 2001 From: huhuanming Date: Fri, 12 Jun 2026 14:53:30 +0800 Subject: [PATCH 3/3] chore: bump version to 3.0.65 --- native-modules/native-logger/package.json | 2 +- native-modules/react-native-aes-crypto/package.json | 2 +- native-modules/react-native-app-update/package.json | 2 +- native-modules/react-native-async-storage/package.json | 2 +- native-modules/react-native-background-thread/package.json | 2 +- native-modules/react-native-bundle-crypto/package.json | 2 +- native-modules/react-native-bundle-update/package.json | 2 +- .../react-native-check-biometric-auth-changed/package.json | 2 +- native-modules/react-native-cloud-fs/package.json | 2 +- native-modules/react-native-cloud-kit-module/package.json | 2 +- native-modules/react-native-device-utils/package.json | 2 +- native-modules/react-native-dns-lookup/package.json | 2 +- native-modules/react-native-get-random-values/package.json | 2 +- native-modules/react-native-keychain-module/package.json | 2 +- native-modules/react-native-lite-card/package.json | 2 +- native-modules/react-native-network-info/package.json | 2 +- native-modules/react-native-pbkdf2/package.json | 2 +- native-modules/react-native-perf-memory/package.json | 2 +- native-modules/react-native-perf-stats/package.json | 2 +- native-modules/react-native-ping/package.json | 2 +- native-modules/react-native-range-downloader/package.json | 2 +- native-modules/react-native-splash-screen/package.json | 2 +- native-modules/react-native-split-bundle-loader/package.json | 2 +- native-modules/react-native-tcp-socket/package.json | 2 +- native-modules/react-native-zip-archive/package.json | 2 +- native-views/react-native-auto-size-input/package.json | 2 +- native-views/react-native-chart-webview/package.json | 2 +- native-views/react-native-pager-view/package.json | 2 +- native-views/react-native-perp-depth-bar/package.json | 2 +- native-views/react-native-scroll-guard/package.json | 2 +- native-views/react-native-segment-slider/package.json | 2 +- native-views/react-native-skeleton/package.json | 2 +- native-views/react-native-tab-view/package.json | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/native-modules/native-logger/package.json b/native-modules/native-logger/package.json index e933e36e..1153730c 100644 --- a/native-modules/native-logger/package.json +++ b/native-modules/native-logger/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-native-logger", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-native-logger", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-aes-crypto/package.json b/native-modules/react-native-aes-crypto/package.json index 5a2edba0..604cada2 100644 --- a/native-modules/react-native-aes-crypto/package.json +++ b/native-modules/react-native-aes-crypto/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-aes-crypto", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-aes-crypto", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-app-update/package.json b/native-modules/react-native-app-update/package.json index 4f89fad3..0953d2ba 100644 --- a/native-modules/react-native-app-update/package.json +++ b/native-modules/react-native-app-update/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-app-update", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-app-update", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-async-storage/package.json b/native-modules/react-native-async-storage/package.json index 2826e7a4..b22470e0 100644 --- a/native-modules/react-native-async-storage/package.json +++ b/native-modules/react-native-async-storage/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-async-storage", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-async-storage", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-background-thread/package.json b/native-modules/react-native-background-thread/package.json index c0ca476f..04d08e47 100644 --- a/native-modules/react-native-background-thread/package.json +++ b/native-modules/react-native-background-thread/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-background-thread", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-background-thread", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-bundle-crypto/package.json b/native-modules/react-native-bundle-crypto/package.json index 563f81f5..b5cf90dd 100644 --- a/native-modules/react-native-bundle-crypto/package.json +++ b/native-modules/react-native-bundle-crypto/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-bundle-crypto", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-bundle-crypto", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-bundle-update/package.json b/native-modules/react-native-bundle-update/package.json index 6abde5dc..09a3c700 100644 --- a/native-modules/react-native-bundle-update/package.json +++ b/native-modules/react-native-bundle-update/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-bundle-update", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-bundle-update", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-check-biometric-auth-changed/package.json b/native-modules/react-native-check-biometric-auth-changed/package.json index 58d01eb4..4fac1f6a 100644 --- a/native-modules/react-native-check-biometric-auth-changed/package.json +++ b/native-modules/react-native-check-biometric-auth-changed/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-check-biometric-auth-changed", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-check-biometric-auth-changed", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-cloud-fs/package.json b/native-modules/react-native-cloud-fs/package.json index 7563e06d..a906a661 100644 --- a/native-modules/react-native-cloud-fs/package.json +++ b/native-modules/react-native-cloud-fs/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-cloud-fs", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-cloud-fs TurboModule for OneKey", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-cloud-kit-module/package.json b/native-modules/react-native-cloud-kit-module/package.json index c4b77eea..48e96f25 100644 --- a/native-modules/react-native-cloud-kit-module/package.json +++ b/native-modules/react-native-cloud-kit-module/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-cloud-kit-module", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-cloud-kit-module", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-device-utils/package.json b/native-modules/react-native-device-utils/package.json index ce2f1657..c32a726b 100644 --- a/native-modules/react-native-device-utils/package.json +++ b/native-modules/react-native-device-utils/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-device-utils", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-device-utils", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-dns-lookup/package.json b/native-modules/react-native-dns-lookup/package.json index 66aaa59c..b6844df6 100644 --- a/native-modules/react-native-dns-lookup/package.json +++ b/native-modules/react-native-dns-lookup/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-dns-lookup", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-dns-lookup", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-get-random-values/package.json b/native-modules/react-native-get-random-values/package.json index e12f8f5c..ee5c551d 100644 --- a/native-modules/react-native-get-random-values/package.json +++ b/native-modules/react-native-get-random-values/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-get-random-values", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-get-random-values", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-keychain-module/package.json b/native-modules/react-native-keychain-module/package.json index dc4b7a37..d3755d54 100644 --- a/native-modules/react-native-keychain-module/package.json +++ b/native-modules/react-native-keychain-module/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-keychain-module", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-keychain-module", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-lite-card/package.json b/native-modules/react-native-lite-card/package.json index f8434a5a..3180a08b 100644 --- a/native-modules/react-native-lite-card/package.json +++ b/native-modules/react-native-lite-card/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-lite-card", - "version": "3.0.64", + "version": "3.0.65", "description": "lite card", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-network-info/package.json b/native-modules/react-native-network-info/package.json index 0da99833..a1ef4a3c 100644 --- a/native-modules/react-native-network-info/package.json +++ b/native-modules/react-native-network-info/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-network-info", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-network-info", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-pbkdf2/package.json b/native-modules/react-native-pbkdf2/package.json index 45052487..8850d0d2 100644 --- a/native-modules/react-native-pbkdf2/package.json +++ b/native-modules/react-native-pbkdf2/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-pbkdf2", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-pbkdf2", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-perf-memory/package.json b/native-modules/react-native-perf-memory/package.json index e778a733..6d398a7c 100644 --- a/native-modules/react-native-perf-memory/package.json +++ b/native-modules/react-native-perf-memory/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-perf-memory", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-perf-memory", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-perf-stats/package.json b/native-modules/react-native-perf-stats/package.json index 3e310c7d..a1493062 100644 --- a/native-modules/react-native-perf-stats/package.json +++ b/native-modules/react-native-perf-stats/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-perf-stats", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-perf-stats", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-ping/package.json b/native-modules/react-native-ping/package.json index 69017dca..d4b4d248 100644 --- a/native-modules/react-native-ping/package.json +++ b/native-modules/react-native-ping/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-ping", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-ping TurboModule for OneKey", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-range-downloader/package.json b/native-modules/react-native-range-downloader/package.json index 56f4e2aa..65fdd623 100644 --- a/native-modules/react-native-range-downloader/package.json +++ b/native-modules/react-native-range-downloader/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-range-downloader", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-range-downloader", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-splash-screen/package.json b/native-modules/react-native-splash-screen/package.json index 7401211c..13ae7cc9 100644 --- a/native-modules/react-native-splash-screen/package.json +++ b/native-modules/react-native-splash-screen/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-splash-screen", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-splash-screen", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-split-bundle-loader/package.json b/native-modules/react-native-split-bundle-loader/package.json index f0dd9aa6..218b1ba6 100644 --- a/native-modules/react-native-split-bundle-loader/package.json +++ b/native-modules/react-native-split-bundle-loader/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-split-bundle-loader", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-split-bundle-loader", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-tcp-socket/package.json b/native-modules/react-native-tcp-socket/package.json index 1ba862e0..b2ccbc88 100644 --- a/native-modules/react-native-tcp-socket/package.json +++ b/native-modules/react-native-tcp-socket/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-tcp-socket", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-tcp-socket", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-modules/react-native-zip-archive/package.json b/native-modules/react-native-zip-archive/package.json index bcc9e5e7..964f40a2 100644 --- a/native-modules/react-native-zip-archive/package.json +++ b/native-modules/react-native-zip-archive/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-zip-archive", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-zip-archive Nitro HybridObject for OneKey", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-views/react-native-auto-size-input/package.json b/native-views/react-native-auto-size-input/package.json index 1b23a376..51ef6a2d 100644 --- a/native-views/react-native-auto-size-input/package.json +++ b/native-views/react-native-auto-size-input/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-auto-size-input", - "version": "3.0.64", + "version": "3.0.65", "description": "Auto-sizing text input with font scaling, prefix and suffix support", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-views/react-native-chart-webview/package.json b/native-views/react-native-chart-webview/package.json index fbfa2c93..631353c4 100644 --- a/native-views/react-native-chart-webview/package.json +++ b/native-views/react-native-chart-webview/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-chart-webview", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-chart-webview", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-views/react-native-pager-view/package.json b/native-views/react-native-pager-view/package.json index bbb3cede..19261da0 100644 --- a/native-views/react-native-pager-view/package.json +++ b/native-views/react-native-pager-view/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-pager-view", - "version": "3.0.64", + "version": "3.0.65", "description": "React Native wrapper for Android and iOS ViewPager", "source": "./src/index.tsx", "main": "./lib/module/index.js", diff --git a/native-views/react-native-perp-depth-bar/package.json b/native-views/react-native-perp-depth-bar/package.json index b73a1c9d..31d4ba16 100644 --- a/native-views/react-native-perp-depth-bar/package.json +++ b/native-views/react-native-perp-depth-bar/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-perp-depth-bar", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-perp-depth-bar", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-views/react-native-scroll-guard/package.json b/native-views/react-native-scroll-guard/package.json index 613842f4..86b51fd5 100644 --- a/native-views/react-native-scroll-guard/package.json +++ b/native-views/react-native-scroll-guard/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-scroll-guard", - "version": "3.0.64", + "version": "3.0.65", "description": "A native view wrapper that prevents parent scrollable containers (PagerView/ViewPager2) from intercepting child scroll gestures", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-views/react-native-segment-slider/package.json b/native-views/react-native-segment-slider/package.json index 67f32742..dd177b65 100644 --- a/native-views/react-native-segment-slider/package.json +++ b/native-views/react-native-segment-slider/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-segment-slider", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-segment-slider", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-views/react-native-skeleton/package.json b/native-views/react-native-skeleton/package.json index 579c2e46..702fa0c6 100644 --- a/native-views/react-native-skeleton/package.json +++ b/native-views/react-native-skeleton/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-skeleton", - "version": "3.0.64", + "version": "3.0.65", "description": "react-native-skeleton", "main": "./lib/module/index.js", "types": "./lib/typescript/src/index.d.ts", diff --git a/native-views/react-native-tab-view/package.json b/native-views/react-native-tab-view/package.json index 4bdf8731..2402f943 100644 --- a/native-views/react-native-tab-view/package.json +++ b/native-views/react-native-tab-view/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-tab-view", - "version": "3.0.64", + "version": "3.0.65", "description": "Native Bottom Tabs for React Native (UIKit implementation)", "source": "./src/index.tsx", "main": "./lib/module/index.js",