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

Commit 4a5eda5

Browse files
committed
Adding new restartImmediately flag
1 parent 7638487 commit 4a5eda5

File tree

2 files changed

+71
-15
lines changed

2 files changed

+71
-15
lines changed

CodePush.m

Lines changed: 69 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ @implementation CodePush
1111
BOOL usingTestFolder = NO;
1212
BOOL didUpdate = NO;
1313

14-
NSString * const FailedUpdatesKey = @"FAILED_UPDATES";
14+
NSString * const FailedUpdatesKey = @"CODE_PUSH_FAILED_UPDATES";
15+
NSString * const PendingUpdateKey = @"CODE_PUSH_PENDING_UPDATE";
1516
NSString * const UpdateBundleFileName = @"app.jsbundle";
1617

1718
@synthesize bridge = _bridge;
@@ -57,6 +58,51 @@ - (void)cancelRollbackTimer
5758
});
5859
}
5960

61+
- (CodePush *)init
62+
{
63+
self = [super init];
64+
65+
if (self) {
66+
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
67+
NSDictionary *pendingUpdate = [preferences objectForKey:PendingUpdateKey];
68+
69+
if (pendingUpdate)
70+
{
71+
NSError *error;
72+
NSString * pendingHash = pendingUpdate[@"hash"];
73+
NSString * currentHash = [CodePushPackage getCurrentPackageHash:&error];
74+
75+
// If the current hash is equivalent to the pending hash, then the app
76+
// restart "picked up" the new update, but we need to kick off the
77+
// rollback timer and ensure that the neccessaey state is setup.
78+
if ([pendingHash isEqualToString:currentHash]) {
79+
int rollbackTimeout = [pendingUpdate[@"rollbackTimeout"] intValue];
80+
[self initializeUpdateWithRollbackTimeout:rollbackTimeout needsRestart:NO];
81+
82+
// Clear the pending update and sync
83+
[preferences removeObjectForKey:PendingUpdateKey];
84+
[preferences synchronize];
85+
}
86+
}
87+
}
88+
89+
return self;
90+
}
91+
92+
- (void)initializeUpdateWithRollbackTimeout:(int)rollbackTimeout needsRestart:(BOOL)needsRestart {
93+
didUpdate = YES;
94+
95+
if (needsRestart) {
96+
[self loadBundle];
97+
}
98+
99+
if (0 != rollbackTimeout) {
100+
dispatch_async(dispatch_get_main_queue(), ^{
101+
[self startRollbackTimer:rollbackTimeout];
102+
});
103+
}
104+
}
105+
60106
- (BOOL)isFailedHash:(NSString*)packageHash {
61107
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
62108
NSMutableArray *failedUpdates = [preferences objectForKey:FailedUpdatesKey];
@@ -101,6 +147,19 @@ - (void)saveFailedUpdate:(NSString *)packageHash {
101147
[preferences synchronize];
102148
}
103149

150+
- (void)savePendingUpdate:(NSString *)packageHash
151+
rollbackTimeout:(int)rollbackTimeout {
152+
// Since we're not restarting, we need to store the fact that the update
153+
// was applied, but hasn't yet become "active".
154+
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
155+
NSDictionary *pendingUpdate = [[NSDictionary alloc] initWithObjectsAndKeys:
156+
packageHash,@"hash",
157+
rollbackTimeout,@"rollbackTimeout", nil];
158+
159+
[preferences setObject:pendingUpdate forKey:PendingUpdateKey];
160+
[preferences synchronize];
161+
}
162+
104163
- (void)startRollbackTimer:(int)rollbackTimeout
105164
{
106165
double timeoutInSeconds = rollbackTimeout / 1000;
@@ -111,13 +170,14 @@ - (void)startRollbackTimer:(int)rollbackTimeout
111170
repeats:NO];
112171
}
113172

173+
// JavaScript-exported module methods
114174
// JavaScript-exported module methods
115175
RCT_EXPORT_METHOD(applyUpdate:(NSDictionary*)updatePackage
116-
rollbackTimeout:(int)rollbackTimeout
117-
resolver:(RCTPromiseResolveBlock)resolve
118-
rejecter:(RCTPromiseRejectBlock)reject)
176+
rollbackTimeout:(int)rollbackTimeout
177+
restartImmediately:(BOOL)restartImmediately
178+
resolver:(RCTPromiseResolveBlock)resolve
179+
rejecter:(RCTPromiseRejectBlock)reject)
119180
{
120-
121181
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
122182
NSError *error;
123183
[CodePushPackage applyPackage:updatePackage
@@ -126,14 +186,10 @@ - (void)startRollbackTimer:(int)rollbackTimeout
126186
if (error) {
127187
reject(error);
128188
} else {
129-
didUpdate = YES;
130-
131-
[self loadBundle];
132-
133-
if (0 != rollbackTimeout) {
134-
dispatch_async(dispatch_get_main_queue(), ^{
135-
[self startRollbackTimer:rollbackTimeout];
136-
});
189+
if (restartImmediately) {
190+
[self initializeUpdateWithRollbackTimeout:rollbackTimeout needsRestart:YES];
191+
} else {
192+
[self savePendingUpdate:updatePackage[@"packageHash"] rollbackTimeout:rollbackTimeout];
137193
}
138194
}
139195
});

package-mixins.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ module.exports = (NativeCodePush) => {
2020
};
2121

2222
var local = {
23-
apply: function apply(rollbackTimeout = 0) {
24-
return NativeCodePush.applyUpdate(this, rollbackTimeout);
23+
apply: function apply(rollbackTimeout = 0, restartImmediately = true) {
24+
return NativeCodePush.applyUpdate(this, rollbackTimeout, restartImmediately);
2525
}
2626
};
2727

0 commit comments

Comments
 (0)