mirror of
https://gitcode.com/gh_mirrors/re/react-native-pushy.git
synced 2025-11-03 06:43:10 +08:00
ios 接口更新
This commit is contained in:
@@ -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"];
|
||||||
|
|||||||
Reference in New Issue
Block a user