Skip to content
This repository was archived by the owner on May 20, 2025. It is now read-only.

Commit 54743b3

Browse files
committed
Simplify the resume check for perf
1 parent 0dd90e9 commit 54743b3

File tree

1 file changed

+39
-42
lines changed

1 file changed

+39
-42
lines changed

CodePush.m

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
#import "RCTUtils.h"
66
#import "CodePush.h"
77

8-
@implementation CodePush
8+
@implementation CodePush {
9+
BOOL _resumablePendingUpdateAvailable;
10+
}
911

1012
RCT_EXPORT_MODULE()
1113

@@ -18,7 +20,6 @@ @implementation CodePush
1820

1921
// These keys are already "namespaced" by the PendingUpdateKey, so
2022
// their values don't need to be obfuscated to prevent collision with app data
21-
NSString * const PendingUpdateAllowsRestartOnResumeKey = @"allowsRestartOnResume";
2223
NSString * const PendingUpdateHashKey = @"hash";
2324
NSString * const PendingUpdateRollbackTimeoutKey = @"rollbackTimeout";
2425

@@ -63,14 +64,13 @@ - (void)cancelRollbackTimer
6364
});
6465
}
6566

66-
- (void)checkForPendingUpdate:(BOOL)isAppStart
67+
- (void)checkForPendingUpdate:(BOOL)needsRestart
6768
{
6869
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
6970
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
7071
NSDictionary *pendingUpdate = [preferences objectForKey:PendingUpdateKey];
7172

72-
if (pendingUpdate)
73-
{
73+
if (pendingUpdate) {
7474
NSError *error;
7575
NSString *pendingHash = pendingUpdate[PendingUpdateHashKey];
7676
NSString *currentHash = [CodePushPackage getCurrentPackageHash:&error];
@@ -79,29 +79,25 @@ - (void)checkForPendingUpdate:(BOOL)isAppStart
7979
// restart "picked up" the new update, but we need to kick off the
8080
// rollback timer and ensure that the necessary state is setup.
8181
if ([pendingHash isEqualToString:currentHash]) {
82-
// We only want to initialize the rollback timer in two scenarios:
83-
// 1) The app has been restarted, and therefore, the pending update is already applied
84-
// 2) The app has been resumed, and the pending update indicates it supports being restarted on resume, so we need to restart the app and the kickoff the rollback timer
85-
if (isAppStart || (!isAppStart && [pendingUpdate[PendingUpdateAllowsRestartOnResumeKey] boolValue]))
86-
{
87-
int rollbackTimeout = [pendingUpdate[PendingUpdateRollbackTimeoutKey] intValue];
88-
89-
// If the app wasn't restarted "naturally", then we need to restart it manually
90-
BOOL needsRestart = !isAppStart;
91-
[self initializeUpdateWithRollbackTimeout:rollbackTimeout needsRestart:needsRestart];
92-
93-
// Clear the pending update and sync
94-
[preferences removeObjectForKey:PendingUpdateKey];
95-
[preferences synchronize];
96-
}
82+
int rollbackTimeout = [pendingUpdate[PendingUpdateRollbackTimeoutKey] intValue];
83+
[self initializeUpdateWithRollbackTimeout:rollbackTimeout needsRestart:needsRestart];
84+
85+
// Clear the pending update and sync
86+
[preferences removeObjectForKey:PendingUpdateKey];
87+
[preferences synchronize];
9788
}
9889
}
9990
});
10091
}
10192

10293
- (void)checkForPendingUpdateDuringResume
10394
{
104-
[self checkForPendingUpdate:NO];
95+
// In order to ensure that CodePush doesn't impact the app's
96+
// resume experience, we're using a simple boolean check to
97+
// check whether we need to restart, before reading the defaults store
98+
if (_resumablePendingUpdateAvailable) {
99+
[self checkForPendingUpdate:YES];
100+
}
105101
}
106102

107103
- (NSDictionary *)constantsToExport
@@ -111,11 +107,13 @@ - (NSDictionary *)constantsToExport
111107
return @{ @"codePushRestartModeNone": @(CodePushRestartModeNone),
112108
@"codePushRestartModeImmediate": @(CodePushRestartModeImmediate),
113109
@"codePushRestartModeOnNextResume": @(CodePushRestartModeOnNextResume)
114-
};
110+
};
115111
};
116112

117113
- (void)dealloc
118114
{
115+
// Ensure the global resume handler is cleared, so that
116+
// this object isn't kept alive unneccesarily
119117
[[NSNotificationCenter defaultCenter] removeObserver:self];
120118
}
121119

@@ -124,7 +122,10 @@ - (CodePush *)init
124122
self = [super init];
125123

126124
if (self) {
127-
[self checkForPendingUpdate:YES];
125+
// Do an async check to see whether
126+
// we need to start the rollback timer
127+
// due to a pending update being applied at start
128+
[self checkForPendingUpdate:NO];
128129

129130
// Register for app resume notifications so that we
130131
// can check for pending updates which support "restart on resume"
@@ -201,16 +202,13 @@ - (void)saveFailedUpdate:(NSString *)packageHash
201202

202203
- (void)savePendingUpdate:(NSString *)packageHash
203204
rollbackTimeout:(int)rollbackTimeout
204-
allowRestartOnResume:(BOOL)allowRestartOnResume
205205
{
206206
// Since we're not restarting, we need to store the fact that the update
207207
// was applied, but hasn't yet become "active".
208208
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
209209
NSDictionary *pendingUpdate = [[NSDictionary alloc] initWithObjectsAndKeys:
210210
packageHash,PendingUpdateHashKey,
211-
[NSNumber numberWithInt:rollbackTimeout],PendingUpdateRollbackTimeoutKey,
212-
[NSNumber numberWithBool:allowRestartOnResume],PendingUpdateAllowsRestartOnResumeKey,
213-
nil];
211+
[NSNumber numberWithInt:rollbackTimeout],PendingUpdateRollbackTimeoutKey, nil];
214212

215213
[preferences setObject:pendingUpdate forKey:PendingUpdateKey];
216214
[preferences synchronize];
@@ -228,10 +226,10 @@ - (void)startRollbackTimer:(int)rollbackTimeout
228226

229227
// JavaScript-exported module methods
230228
RCT_EXPORT_METHOD(applyUpdate:(NSDictionary*)updatePackage
231-
rollbackTimeout:(int)rollbackTimeout
229+
rollbackTimeout:(int)rollbackTimeout
232230
restartMode:(CodePushRestartMode)restartMode
233-
resolver:(RCTPromiseResolveBlock)resolve
234-
rejecter:(RCTPromiseRejectBlock)reject)
231+
resolver:(RCTPromiseResolveBlock)resolve
232+
rejecter:(RCTPromiseRejectBlock)reject)
235233
{
236234
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
237235
NSError *error;
@@ -244,18 +242,17 @@ - (void)startRollbackTimer:(int)rollbackTimeout
244242
if (restartMode == CodePushRestartModeImmediate) {
245243
[self initializeUpdateWithRollbackTimeout:rollbackTimeout needsRestart:YES];
246244
} else {
247-
BOOL allowsRestartOnResume = (restartMode == CodePushRestartModeOnNextResume);
245+
_resumablePendingUpdateAvailable = (restartMode == CodePushRestartModeOnNextResume);
248246
[self savePendingUpdate:updatePackage[@"packageHash"]
249-
rollbackTimeout:rollbackTimeout
250-
allowRestartOnResume:allowsRestartOnResume];
247+
rollbackTimeout:rollbackTimeout];
251248
}
252249
}
253250
});
254251
}
255252

256253
RCT_EXPORT_METHOD(downloadUpdate:(NSDictionary*)updatePackage
257-
resolver:(RCTPromiseResolveBlock)resolve
258-
rejecter:(RCTPromiseRejectBlock)reject)
254+
resolver:(RCTPromiseResolveBlock)resolve
255+
rejecter:(RCTPromiseRejectBlock)reject)
259256
{
260257
[CodePushPackage downloadPackage:updatePackage
261258
progressCallback:^(long expectedContentLength, long receivedContentLength) {
@@ -284,13 +281,13 @@ - (void)startRollbackTimer:(int)rollbackTimeout
284281
}
285282

286283
RCT_EXPORT_METHOD(getConfiguration:(RCTPromiseResolveBlock)resolve
287-
rejecter:(RCTPromiseRejectBlock)reject)
284+
rejecter:(RCTPromiseRejectBlock)reject)
288285
{
289286
resolve([CodePushConfig getConfiguration]);
290287
}
291288

292289
RCT_EXPORT_METHOD(getCurrentPackage:(RCTPromiseResolveBlock)resolve
293-
rejecter:(RCTPromiseRejectBlock)reject)
290+
rejecter:(RCTPromiseRejectBlock)reject)
294291
{
295292
dispatch_async(dispatch_get_main_queue(), ^{
296293
NSError *error;
@@ -304,16 +301,16 @@ - (void)startRollbackTimer:(int)rollbackTimeout
304301
}
305302

306303
RCT_EXPORT_METHOD(isFailedUpdate:(NSString *)packageHash
307-
resolve:(RCTPromiseResolveBlock)resolve
308-
reject:(RCTPromiseRejectBlock)reject)
304+
resolve:(RCTPromiseResolveBlock)resolve
305+
reject:(RCTPromiseRejectBlock)reject)
309306
{
310307
BOOL isFailedHash = [self isFailedHash:packageHash];
311308
resolve(@(isFailedHash));
312309
}
313310

314311
RCT_EXPORT_METHOD(isFirstRun:(NSString *)packageHash
315-
resolve:(RCTPromiseResolveBlock)resolve
316-
rejecter:(RCTPromiseRejectBlock)reject)
312+
resolve:(RCTPromiseResolveBlock)resolve
313+
rejecter:(RCTPromiseRejectBlock)reject)
317314
{
318315
NSError *error;
319316
BOOL isFirstRun = didUpdate
@@ -325,7 +322,7 @@ - (void)startRollbackTimer:(int)rollbackTimeout
325322
}
326323

327324
RCT_EXPORT_METHOD(notifyApplicationReady:(RCTPromiseResolveBlock)resolve
328-
rejecter:(RCTPromiseRejectBlock)reject)
325+
rejecter:(RCTPromiseRejectBlock)reject)
329326
{
330327
[self cancelRollbackTimer];
331328
resolve([NSNull null]);

0 commit comments

Comments
 (0)