From 71b116a6f69edd44ab13308823e0a886692563e8 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Thu, 10 Sep 2015 14:39:25 -0700 Subject: [PATCH] Snapshot current iteration of rollback support (WIP) --- CodePush.h | 2 ++ CodePush.m | 42 +++++++++++++++++++++++++++++++++++++++++- CodePushPackage.m | 28 ++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/CodePush.h b/CodePush.h index f92158f..d6d82f6 100644 --- a/CodePush.h +++ b/CodePush.h @@ -21,6 +21,7 @@ + (NSString *)getBuildVersion; + (void)setRootComponent:(NSString *)rootComponent; + + (NSString *)getRootComponent; + (NSDictionary *)getConfiguration; @@ -44,4 +45,5 @@ + (void)applyPackage:(NSDictionary *)updatePackage error:(NSError **)error; ++ (void)rollbackPackage; @end \ No newline at end of file diff --git a/CodePush.m b/CodePush.m index 1b37faa..7ff23da 100644 --- a/CodePush.m +++ b/CodePush.m @@ -10,6 +10,7 @@ RCT_EXPORT_MODULE() RCTBridge * _bridge; +NSTimer *_timer; BOOL usingTestFolder = NO; @synthesize bridge = _bridge; @@ -62,7 +63,7 @@ BOOL usingTestFolder = NO; NSString *packageFolder = [CodePushPackage getCurrentPackageFolderPath:&error]; if (error || !packageFolder) { - [self getNativeBundleURL]; + return [self getNativeBundleURL]; } NSString *packageFile = [packageFolder stringByAppendingPathComponent:@"app.jsbundle"]; @@ -82,6 +83,28 @@ BOOL usingTestFolder = NO; }); } ++ (void) rollbackPackage:(NSTimer *)timer { + [CodePushPackage rollbackPackage]; + [self loadBundle]; +} + ++ (void) startRollbackTimer:(int)rollbackTimeout +{ + double timeoutInSeconds = rollbackTimeout / 1000; + _timer = [NSTimer scheduledTimerWithTimeInterval:timeoutInSeconds + target:self + selector:@selector(rollbackPackage:) + userInfo:nil + repeats:NO]; +} + ++ (void) cancelRollbackTimer +{ + dispatch_async(dispatch_get_main_queue(), ^{ + [_timer invalidate]; + }); +} + RCT_EXPORT_METHOD(setUsingTestFolder:(BOOL) shouldUseTestFolder) { usingTestFolder = shouldUseTestFolder; @@ -118,6 +141,7 @@ RCT_EXPORT_METHOD(downloadUpdate:(NSDictionary*)updatePackage } RCT_EXPORT_METHOD(applyUpdate:(NSDictionary*)updatePackage + rollbackTimeout:(int)rollbackTimeout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { @@ -132,7 +156,15 @@ RCT_EXPORT_METHOD(applyUpdate:(NSDictionary*)updatePackage } [CodePush loadBundle]; + + if (0 != rollbackTimeout) { + dispatch_async(dispatch_get_main_queue(), ^{ + [CodePush startRollbackTimer:rollbackTimeout]; + }); + + } }); + } RCT_EXPORT_METHOD(getCurrentPackage:(RCTPromiseResolveBlock)resolve @@ -149,4 +181,12 @@ RCT_EXPORT_METHOD(getCurrentPackage:(RCTPromiseResolveBlock)resolve }); } +RCT_EXPORT_METHOD(notifyApplicationReady:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [CodePush cancelRollbackTimer]; + + resolve([NSNull null]); +} + @end diff --git a/CodePushPackage.m b/CodePushPackage.m index f74922a..71d8394 100644 --- a/CodePushPackage.m +++ b/CodePushPackage.m @@ -72,6 +72,18 @@ NSString * const StatusFile = @"codepush.json"; return [self getPackageFolderPath:packageHash]; } ++ (NSString *)getCurrentPackageHash:(NSError **)error +{ + NSDictionary *info = [self getCurrentPackageInfo:error]; + return info[@"currentPackage"]; +} + ++ (NSString *)getPreviousPackageHash:(NSError **)error +{ + NSDictionary *info = [self getCurrentPackageInfo:error]; + return info[@"previousPackage"]; +} + + (NSDictionary *)getCurrentPackage:(NSError **)error { NSString *folderPath = [CodePushPackage getCurrentPackageFolderPath:error]; @@ -185,10 +197,26 @@ NSString * const StatusFile = @"codepush.json"; return; } + [info setValue:info[@"currentPackage"] forKey:@"previousPackage"]; [info setValue:packageHash forKey:@"currentPackage"]; [self updateCurrentPackageInfo:info error:error]; } ++ (void)rollbackPackage +{ + NSError *error; + NSMutableDictionary *info = [self getCurrentPackageInfo:&error]; + + if (error) { + return; + } + + [info setValue:info[@"previousPackage"] forKey:@"currentPackage"]; + [info removeObjectForKey:@"previousPackage"]; + + [self updateCurrentPackageInfo:info error:&error]; +} + @end \ No newline at end of file