1
0
mirror of https://gitcode.com/gh_mirrors/re/react-native-pushy.git synced 2025-11-03 06:43:10 +08:00
Code Issues Packages Projects Releases Wiki Activity GitHub Gitee

ios 接口更新

This commit is contained in:
lvbingru
2016-04-05 17:51:02 +08:00
parent 786447225b
commit 5093375e38

View File

@@ -14,7 +14,13 @@
#import "RCTLog.h" #import "RCTLog.h"
// //
static NSString *const curVersionKey = @"REACTNATIVECNHOTUPDATECURVERSIONKEY"; //static NSString *const curVersionKey = @"REACTNATIVECNHOTUPDATECURVERSIONKEY";
static NSString *const rnHotUpdatePackageInfoKey = @"REACTNATIVECNHOTUPDATEPACKAGEINFOKEY";
static NSString *const paramLastVersion = @"lastVersion";
static NSString *const paramCurrentVersion = @"currentVersion";
static NSString *const paramIsFirstTime = @"isFirstTime";
static NSString *const paramIsFirstLoadOk = @"isFirstLoadOK";
static NSString *const paramIsRolledBack = @"isRolledBack";
// app info // app info
static NSString * const AppVersionKey = @"appVersion"; static NSString * const AppVersionKey = @"appVersion";
@@ -39,8 +45,8 @@ static NSString * const PARAM_PROGRESS_TOTAL = @"total";
typedef NS_ENUM(NSInteger, HotUpdateType) { typedef NS_ENUM(NSInteger, HotUpdateType) {
HotUpdateTypeFullDownload = 1, HotUpdateTypeFullDownload = 1,
HotUpdateTypePatchFromIpa = 2, HotUpdateTypePatchFromPackage = 2,
HotUpdateTypePatchFromPpa = 3, HotUpdateTypePatchFromPpk = 3,
}; };
@implementation RCTHotUpdate { @implementation RCTHotUpdate {
@@ -52,16 +58,68 @@ typedef NS_ENUM(NSInteger, HotUpdateType) {
RCT_EXPORT_MODULE(RCTHotUpdate); RCT_EXPORT_MODULE(RCTHotUpdate);
+ (NSURL *)bundleURL
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *packageInfo = [defaults dictionaryForKey:rnHotUpdatePackageInfoKey];
if (packageInfo) {
NSString *curVersion = packageInfo[paramCurrentVersion];
NSString *lastVersion = packageInfo[paramLastVersion];
BOOL isFirstTime = [packageInfo[paramIsFirstTime] boolValue];
BOOL isFirstLoadOK = [packageInfo[paramIsFirstLoadOk] boolValue];
NSString *loadVersioin = curVersion;
if ((isFirstTime == NO && isFirstLoadOK == NO) || (loadVersioin.length<=0 && lastVersion.length>0)) {
loadVersioin = lastVersion;
// roll back to last version
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (lastVersion.length) {
[defaults setObject:@{paramCurrentVersion:lastVersion, paramIsFirstTime:@(NO), paramIsFirstLoadOk:@(YES), paramIsRolledBack:@(YES)} forKey:rnHotUpdatePackageInfoKey];
}
else {
[defaults setObject:@{paramIsRolledBack:@(YES)} forKey:rnHotUpdatePackageInfoKey];
}
[defaults setObject:packageInfo forKey:rnHotUpdatePackageInfoKey];
[defaults synchronize];
}
if (loadVersioin.length) {
NSString *downloadDir = [RCTHotUpdate downloadDir];
NSString *bundlePath = [[downloadDir stringByAppendingPathComponent:loadVersioin] stringByAppendingPathComponent:BUNDLE_FILE_NAME];
if ([[NSFileManager defaultManager] fileExistsAtPath:bundlePath isDirectory:NULL]) {
NSURL *bundleURL = [NSURL fileURLWithPath:bundlePath];
return bundleURL;
}
}
}
return [RCTHotUpdate binaryBundleURL];
}
- (NSDictionary *)constantsToExport - (NSDictionary *)constantsToExport
{ {
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
return @{ @"downloadRootDir": [RCTHotUpdate donwloadDir], NSMutableDictionary *packageInfo = [[defaults dictionaryForKey:rnHotUpdatePackageInfoKey] mutableCopy];
@"packageVersion": [infoDictionary objectForKey:@"CFBundleShortVersionString"],
@"currentVersion": @"", NSDictionary *ret = @{ @"downloadRootDir": [RCTHotUpdate downloadDir],
@"isFirstTime":@(YES), @"packageVersion": [infoDictionary objectForKey:@"CFBundleShortVersionString"],
@"isRolledBack":@(NO) @"currentVersion": [packageInfo objectForKey:paramCurrentVersion],
}; @"isFirstTime": [packageInfo objectForKey:paramIsFirstTime],
@"isRolledBack": [packageInfo objectForKey:paramIsRolledBack]
};
if (packageInfo) {
// clear isFirstTime and isRolledBack
packageInfo[paramIsFirstTime] = @(NO);
packageInfo[paramIsRolledBack] = @(NO);
[defaults setObject:packageInfo forKey:rnHotUpdatePackageInfoKey];
[defaults synchronize];
}
return ret;
} }
- (instancetype)init - (instancetype)init
@@ -73,20 +131,6 @@ RCT_EXPORT_MODULE(RCTHotUpdate);
return self; return self;
} }
+ (NSURL *)bundleURL
{
NSString *downloadDir = [RCTHotUpdate donwloadDir];
NSString *curVersion = [self loadCurVersion];
if (curVersion) {
NSString *bundlePath = [[downloadDir stringByAppendingPathComponent:curVersion] stringByAppendingPathComponent:BUNDLE_FILE_NAME];
if ([[NSFileManager defaultManager] fileExistsAtPath:bundlePath isDirectory:NULL]) {
NSURL *bundleURL = [NSURL fileURLWithPath:bundlePath];
return bundleURL;
}
}
return [RCTHotUpdate binaryBundleURL];
}
RCT_EXPORT_METHOD(getVersionInfo:(RCTResponseSenderBlock)callback) RCT_EXPORT_METHOD(getVersionInfo:(RCTResponseSenderBlock)callback)
{ {
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
@@ -115,11 +159,11 @@ RCT_EXPORT_METHOD(downloadUpdate:(NSDictionary *)options
}]; }];
} }
RCT_EXPORT_METHOD(downloadPatchFromIpa:(NSDictionary *)options RCT_EXPORT_METHOD(downloadPatchFromPackage:(NSDictionary *)options
resolver:(RCTPromiseResolveBlock)resolve resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject) rejecter:(RCTPromiseRejectBlock)reject)
{ {
[self hotUpdate:HotUpdateTypePatchFromIpa options:options callback:^(NSError *error) { [self hotUpdate:HotUpdateTypePatchFromPackage options:options callback:^(NSError *error) {
if (error) { if (error) {
[self reject:reject error:error]; [self reject:reject error:error];
} }
@@ -129,11 +173,11 @@ RCT_EXPORT_METHOD(downloadPatchFromIpa:(NSDictionary *)options
}]; }];
} }
RCT_EXPORT_METHOD(downloadPatchFromPpa:(NSDictionary *)options RCT_EXPORT_METHOD(downloadPatchFromPpk:(NSDictionary *)options
resolver:(RCTPromiseResolveBlock)resolve resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject) rejecter:(RCTPromiseRejectBlock)reject)
{ {
[self hotUpdate:HotUpdateTypePatchFromPpa options:options callback:^(NSError *error) { [self hotUpdate:HotUpdateTypePatchFromPpk options:options callback:^(NSError *error) {
if (error) { if (error) {
[self reject:reject error:error]; [self reject:reject error:error];
} }
@@ -147,7 +191,7 @@ RCT_EXPORT_METHOD(setNeedUpdate:(NSDictionary *)options)
{ {
NSString *hashName = options[@"hashName"]; NSString *hashName = options[@"hashName"];
if (hashName.length) { if (hashName.length) {
[[self class] saveCurVersion:hashName]; [self saveCurVersion:hashName];
} }
} }
@@ -155,7 +199,7 @@ RCT_EXPORT_METHOD(reloadUpdate:(NSDictionary *)options)
{ {
NSString *hashName = options[@"hashName"]; NSString *hashName = options[@"hashName"];
if (hashName.length) { if (hashName.length) {
[[self class] saveCurVersion:hashName]; [self saveCurVersion:hashName];
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[_bridge setValue:[[self class] bundleURL] forKey:@"bundleURL"]; [_bridge setValue:[[self class] bundleURL] forKey:@"bundleURL"];
[_bridge reload]; [_bridge reload];
@@ -163,10 +207,21 @@ RCT_EXPORT_METHOD(reloadUpdate:(NSDictionary *)options)
} }
} }
RCT_EXPORT_METHOD(removePreviousUpdates:(NSDictionary *)options) RCT_EXPORT_METHOD(markSuccuss)
{ {
NSString *downloadDir = [RCTHotUpdate donwloadDir]; // update package info
NSString *curVersion = [RCTHotUpdate loadCurVersion]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *packageInfo = [[defaults objectForKey:rnHotUpdatePackageInfoKey] mutableCopy];
[packageInfo setObject:@(NO) forKey:paramIsFirstTime];
[packageInfo setObject:@(YES) forKey:paramIsFirstLoadOk];
[packageInfo setObject:@(NO) forKey:paramIsRolledBack];
[defaults setObject:packageInfo forKey:rnHotUpdatePackageInfoKey];
[defaults synchronize];
// clear other package dir
NSString *downloadDir = [RCTHotUpdate downloadDir];
NSString *curVersion = [packageInfo objectForKey:paramCurrentVersion];
NSError *error = nil; NSError *error = nil;
NSArray *list = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:downloadDir error:&error]; NSArray *list = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:downloadDir error:&error];
@@ -191,12 +246,12 @@ RCT_EXPORT_METHOD(removePreviousUpdates:(NSDictionary *)options)
return; return;
} }
NSString *originHashName = [RCTConvert NSString:options[@"originHashName"]]; NSString *originHashName = [RCTConvert NSString:options[@"originHashName"]];
if (type == HotUpdateTypePatchFromPpa && originHashName<=0) { if (type == HotUpdateTypePatchFromPpk && originHashName<=0) {
callback([self errorWithMessage:ERROR_OPTIONS]); callback([self errorWithMessage:ERROR_OPTIONS]);
return; return;
} }
NSString *dir = [RCTHotUpdate donwloadDir]; NSString *dir = [RCTHotUpdate downloadDir];
BOOL success = [_fileManager createDir:dir]; BOOL success = [_fileManager createDir:dir];
if (!success) { if (!success) {
callback([self errorWithMessage:ERROR_FILE_OPERATION]); callback([self errorWithMessage:ERROR_FILE_OPERATION]);
@@ -234,14 +289,14 @@ RCT_EXPORT_METHOD(removePreviousUpdates:(NSDictionary *)options)
} }
else { else {
switch (type) { switch (type) {
case HotUpdateTypePatchFromIpa: case HotUpdateTypePatchFromPackage:
{ {
NSString *sourceOrigin = [[NSBundle mainBundle] resourcePath]; NSString *sourceOrigin = [[NSBundle mainBundle] resourcePath];
NSString *bundleOrigin = [[RCTHotUpdate binaryBundleURL] path]; NSString *bundleOrigin = [[RCTHotUpdate binaryBundleURL] path];
[self patch:hashName romBundle:bundleOrigin source:sourceOrigin callback:callback]; [self patch:hashName romBundle:bundleOrigin source:sourceOrigin callback:callback];
} }
break; break;
case HotUpdateTypePatchFromPpa: case HotUpdateTypePatchFromPpk:
{ {
NSString *lastVertionDir = [dir stringByAppendingPathComponent:originHashName]; NSString *lastVertionDir = [dir stringByAppendingPathComponent:originHashName];
@@ -263,7 +318,7 @@ RCT_EXPORT_METHOD(removePreviousUpdates:(NSDictionary *)options)
- (void)patch:(NSString *)hashName romBundle:(NSString *)bundleOrigin source:(NSString *)sourceOrigin callback:(void (^)(NSError *error))callback - (void)patch:(NSString *)hashName romBundle:(NSString *)bundleOrigin source:(NSString *)sourceOrigin callback:(void (^)(NSError *error))callback
{ {
NSString *unzipDir = [[RCTHotUpdate donwloadDir] stringByAppendingPathComponent:hashName]; NSString *unzipDir = [[RCTHotUpdate downloadDir] stringByAppendingPathComponent:hashName];
NSString *sourcePatch = [unzipDir stringByAppendingPathComponent:SOURCE_PATCH_NAME]; NSString *sourcePatch = [unzipDir stringByAppendingPathComponent:SOURCE_PATCH_NAME];
NSString *bundlePatch = [unzipDir stringByAppendingPathComponent:BUNDLE_PATCH_NAME]; NSString *bundlePatch = [unzipDir stringByAppendingPathComponent:BUNDLE_PATCH_NAME];
@@ -298,9 +353,9 @@ RCT_EXPORT_METHOD(removePreviousUpdates:(NSDictionary *)options)
switch (type) { switch (type) {
case HotUpdateTypeFullDownload: case HotUpdateTypeFullDownload:
return @".ppk"; return @".ppk";
case HotUpdateTypePatchFromIpa: case HotUpdateTypePatchFromPackage:
return @".apk.patch"; return @".apk.patch";
case HotUpdateTypePatchFromPpa: case HotUpdateTypePatchFromPpk:
return @".ppk.patch"; return @".ppk.patch";
default: default:
break; break;
@@ -312,28 +367,31 @@ RCT_EXPORT_METHOD(removePreviousUpdates:(NSDictionary *)options)
reject([NSString stringWithFormat: @"%lu", (long)error.code], error.localizedDescription, error); reject([NSString stringWithFormat: @"%lu", (long)error.code], error.localizedDescription, error);
} }
+ (void)saveCurVersion:(NSString *)hashCode - (void)saveCurVersion:(NSString *)hashCode
{ {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:hashCode forKey:curVersionKey]; NSMutableDictionary *packageInfo = [[defaults objectForKey:rnHotUpdatePackageInfoKey] mutableCopy];
if (packageInfo == nil) {
packageInfo = [@{} mutableCopy];
}
packageInfo[paramLastVersion] = packageInfo[paramCurrentVersion];
packageInfo[paramCurrentVersion] = hashCode;
packageInfo[paramIsFirstTime] = @(YES);
packageInfo[paramIsFirstLoadOk] = @(NO);
packageInfo[paramIsRolledBack] = @(NO);
[defaults setObject:packageInfo forKey:rnHotUpdatePackageInfoKey];
[defaults synchronize]; [defaults synchronize];
} }
+ (NSString *)loadCurVersion
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *curVersion = [defaults stringForKey:curVersionKey];
return curVersion;
}
- (NSError *)errorWithMessage:(NSString *)errorMessage - (NSError *)errorWithMessage:(NSString *)errorMessage
{ {
return [NSError errorWithDomain:@"cn.reactnative.hotupdate" return [NSError errorWithDomain:@"cn.reactnative.hotupdate"
code:-1 code:-1
userInfo:@{ NSLocalizedDescriptionKey: NSLocalizedString(errorMessage, nil) }]; userInfo:@{ NSLocalizedDescriptionKey: errorMessage}];
} }
+ (NSString *)donwloadDir + (NSString *)downloadDir
{ {
NSString *directory = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) firstObject]; NSString *directory = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) firstObject];
NSString *downloadDir = [directory stringByAppendingPathComponent:@"reactnativecnhotupdate"]; NSString *downloadDir = [directory stringByAppendingPathComponent:@"reactnativecnhotupdate"];