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

Commit 3e0bc07

Browse files
author
Will Anderson
committed
Update API and example app to match latest Cordova implementation
1 parent ae19e24 commit 3e0bc07

File tree

6 files changed

+153
-100
lines changed

6 files changed

+153
-100
lines changed

CodePush.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,15 @@
3333

3434
+ (NSString *)getPackageFolderPath:(NSString *)packageHash;
3535

36+
+ (NSDictionary *)getCurrentPackage:(NSError **)error;
37+
38+
+ (NSDictionary *)getPackage:(NSString *)packageHash
39+
error:(NSError **)error;
40+
3641
+ (void)downloadPackage:(NSDictionary *)updatePackage
3742
error:(NSError **)error;
3843

39-
+ (void)applyPackage:(NSString *)packageHash;
44+
+ (void)applyPackage:(NSDictionary *)updatePackage
45+
error:(NSError **)error;
4046

4147
@end

CodePush.ios.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,11 @@ function checkForUpdate() {
6969
return new Promise((resolve, reject) => {
7070
sdk.queryUpdateWithCurrentPackage(queryPackage, (err, update) => {
7171
if (err) return reject(err);
72-
resolve(extend({}, update, packageMixins.remote));
72+
if (update) {
73+
resolve(extend({}, update, packageMixins.remote));
74+
} else {
75+
resolve(update);
76+
}
7377
});
7478
});
7579
});

CodePush.m

Lines changed: 38 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -51,29 +51,29 @@ + (NSString *) getPreviousPackagePath
5151
return [packageFolderPath stringByAppendingPathComponent:appPackageName];
5252
}
5353

54-
5554
+ (NSURL *) getNativeBundleURL
5655
{
5756
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
5857
}
5958

6059
+ (NSURL *) getBundleUrl
6160
{
62-
NSFileManager *fileManager = [NSFileManager defaultManager];
63-
64-
NSString *bundlePath = [self getBundlePath];
65-
if ([fileManager fileExistsAtPath:bundlePath]) {
66-
return [[NSURL alloc] initFileURLWithPath:bundlePath];
67-
} else {
68-
return [self getNativeBundleURL];
61+
NSError *error;
62+
NSString *packageFolder = [CodePushPackage getCurrentPackageFolderPath:&error];
63+
64+
if (error || !packageFolder) {
65+
[self getNativeBundleURL];
6966
}
67+
68+
NSString *packageFile = [packageFolder stringByAppendingPathComponent:@"app.jsbundle"];
69+
return [[NSURL alloc] initFileURLWithPath:packageFile];
7070
}
7171

72-
+ (void) loadBundle:(NSString*)rootComponent
72+
+ (void) loadBundle
7373
{
7474
dispatch_async(dispatch_get_main_queue(), ^{
7575
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:[self getBundleUrl]
76-
moduleName:rootComponent
76+
moduleName:[CodePushConfig getRootComponent]
7777
launchOptions:nil];
7878

7979
UIViewController *rootViewController = [[UIViewController alloc] init];
@@ -103,86 +103,50 @@ + (void) loadBundle:(NSString*)rootComponent
103103
error:&err];
104104

105105
if (err) {
106-
reject(err);
107-
} else {
108-
resolve([NSNull null]);
106+
return reject(err);
107+
}
108+
109+
NSDictionary *newPackage = [CodePushPackage getPackage:updatePackage[@"packageHash"]
110+
error:&err];
111+
112+
if (err) {
113+
return reject(err);
109114
}
115+
116+
resolve(newPackage);
110117
});
111118
}
112119

113120
RCT_EXPORT_METHOD(applyUpdate:(NSDictionary*)updatePackage
114121
resolver:(RCTPromiseResolveBlock)resolve
115122
rejecter:(RCTPromiseRejectBlock)reject)
116123
{
117-
[CodePush loadBundle:[CodePushConfig getRootComponent]];
118-
resolve([NSNull null]);
119-
}
120-
121-
RCT_EXPORT_METHOD(writeToLocalPackage:(NSString*)packageJsonString
122-
callback:(RCTResponseSenderBlock)callback)
123-
{
124-
NSError *saveError;
125-
126-
// Save the package info too.
127-
NSString *packageFolderPath = [CodePush getPackageFolderPath];
128-
if (![[NSFileManager defaultManager] fileExistsAtPath:packageFolderPath]) {
129-
[[NSFileManager defaultManager] createDirectoryAtPath:packageFolderPath withIntermediateDirectories:YES attributes:nil error:&saveError];
130-
}
131-
132-
[packageJsonString writeToFile:[CodePush getPackagePath]
133-
atomically:YES
134-
encoding:NSUTF8StringEncoding
135-
error:&saveError];
136-
137-
if (saveError) {
138-
callback(@[RCTMakeError(@"Error saving file", saveError, [[NSDictionary alloc] initWithObjectsAndKeys:[CodePush getPackagePath],@"packagePath", nil])]);
139-
} else {
140-
callback(@[[NSNull null]]);
141-
}
142-
143-
}
144-
145-
RCT_EXPORT_METHOD(removeLocalPackage: (RCTResponseSenderBlock)callback)
146-
{
147-
NSError *error;
148124

149-
// Save the package info too.
150-
NSString *packagePath = [CodePush getPackagePath];
151-
if ([[NSFileManager defaultManager] fileExistsAtPath:packagePath]) {
152-
[[NSFileManager defaultManager] removeItemAtPath:packagePath error: &error];
153-
}
154-
155-
if (error) {
156-
callback(@[RCTMakeError(@"Error saving file", error, [[NSDictionary alloc] initWithObjectsAndKeys:[CodePush getPackagePath],@"packagePath", nil])]);
157-
} else {
158-
callback(@[[NSNull null]]);
159-
}
125+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
126+
NSError *error;
127+
[CodePushPackage applyPackage:updatePackage
128+
error:&error];
129+
130+
if (error) {
131+
reject(error);
132+
}
133+
134+
[CodePush loadBundle];
135+
136+
//resolve([NSNull null]);
137+
});
160138
}
161139

162-
163140
RCT_EXPORT_METHOD(getCurrentPackage:(RCTPromiseResolveBlock)resolve
164141
rejecter:(RCTPromiseRejectBlock)reject)
165142
{
166-
167-
NSString *path = [CodePush getPackagePath];
168-
169143
dispatch_async(dispatch_get_main_queue(), ^{
170-
171-
NSError* readError;
172-
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&readError];
173-
if (readError) {
174-
reject(readError);
144+
NSError *error;
145+
NSDictionary *package = [CodePushPackage getCurrentPackage:&error];
146+
if (error) {
147+
reject(error);
175148
} else {
176-
NSError * parseError;
177-
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
178-
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data
179-
options:kNilOptions
180-
error:&parseError];
181-
if (parseError) {
182-
reject(parseError);
183-
} else {
184-
resolve(json);
185-
}
149+
resolve(package);
186150
}
187151
});
188152
}

CodePushPackage.m

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,26 @@
22

33
@implementation CodePushPackage
44

5-
NSString * const PackageInfoFile = @"packages.json";
5+
NSString * const StatusFile = @"codepush.json";
66

77
+ (NSString *)getCodePushPath
88
{
99
return [NSHomeDirectory() stringByAppendingPathComponent:@"CodePush"];
1010
}
1111

12-
+ (NSString *)getCurrentPackageInfoPath
12+
+ (NSString *)getStatusFilePath
1313
{
14-
return [[self getCodePushPath] stringByAppendingPathComponent:PackageInfoFile];
14+
return [[self getCodePushPath] stringByAppendingPathComponent:StatusFile];
1515
}
1616

17-
+ (NSDictionary *)getCurrentPackageInfo:(NSError **)error
17+
+ (NSMutableDictionary *)getCurrentPackageInfo:(NSError **)error
1818
{
19-
NSString *content = [NSString stringWithContentsOfFile:[self getCurrentPackageInfoPath]
19+
NSString *statusFilePath = [self getStatusFilePath];
20+
if (![[NSFileManager defaultManager] fileExistsAtPath:statusFilePath]) {
21+
return [NSMutableDictionary dictionary];
22+
}
23+
24+
NSString *content = [NSString stringWithContentsOfFile:statusFilePath
2025
encoding:NSUTF8StringEncoding
2126
error:error];
2227
if (*error) {
@@ -31,7 +36,7 @@ + (NSDictionary *)getCurrentPackageInfo:(NSError **)error
3136
return NULL;
3237
}
3338

34-
return json;
39+
return [json mutableCopy];
3540
}
3641

3742
+ (void)updateCurrentPackageInfo:(NSDictionary *)packageInfo
@@ -44,7 +49,7 @@ + (void)updateCurrentPackageInfo:(NSDictionary *)packageInfo
4449

4550
NSString *packageInfoString = [[NSString alloc] initWithData:packageInfoData
4651
encoding:NSUTF8StringEncoding];
47-
[packageInfoString writeToFile:[self getCurrentPackageInfoPath]
52+
[packageInfoString writeToFile:[self getStatusFilePath]
4853
atomically:YES
4954
encoding:NSUTF8StringEncoding
5055
error:error];
@@ -58,7 +63,65 @@ + (NSString *)getCurrentPackageFolderPath:(NSError **)error
5863
return NULL;
5964
}
6065

61-
return [self getPackageFolderPath:info[@"currentPackage"]];
66+
NSString *packageHash = info[@"currentPackage"];
67+
68+
if (!packageHash) {
69+
return NULL;
70+
}
71+
72+
return [self getPackageFolderPath:packageHash];
73+
}
74+
75+
76+
+ (NSDictionary *)getCurrentPackage:(NSError **)error
77+
{
78+
NSString *folderPath = [CodePushPackage getCurrentPackageFolderPath:error];
79+
if (!*error) {
80+
if (!folderPath) {
81+
return [NSDictionary dictionary];
82+
}
83+
84+
NSString *packagePath = [folderPath stringByAppendingPathComponent:@"app.json"];
85+
NSString *content = [NSString stringWithContentsOfFile:packagePath
86+
encoding:NSUTF8StringEncoding
87+
error:error];
88+
if (!*error) {
89+
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
90+
NSDictionary* jsonDict = [NSJSONSerialization JSONObjectWithData:data
91+
options:kNilOptions
92+
error:error];
93+
94+
return jsonDict;
95+
}
96+
}
97+
98+
return NULL;
99+
}
100+
101+
+ (NSDictionary *)getPackage:(NSString *)packageHash
102+
error:(NSError **)error
103+
{
104+
NSString *folderPath = [self getPackageFolderPath:packageHash];
105+
106+
if (!folderPath) {
107+
return [NSDictionary dictionary];
108+
}
109+
110+
NSString *packageFilePath = [folderPath stringByAppendingPathComponent:@"app.json"];
111+
112+
NSString *content = [NSString stringWithContentsOfFile:packageFilePath
113+
encoding:NSUTF8StringEncoding
114+
error:error];
115+
if (!*error) {
116+
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
117+
NSDictionary* jsonDict = [NSJSONSerialization JSONObjectWithData:data
118+
options:kNilOptions
119+
error:error];
120+
121+
return jsonDict;
122+
}
123+
124+
return NULL;
62125
}
63126

64127
+ (NSString *)getPackageFolderPath:(NSString *)packageHash
@@ -78,31 +141,31 @@ + (void)downloadPackage:(NSDictionary *)updatePackage
78141
error:error];
79142
}
80143

81-
if (error) {
144+
if (*error) {
82145
return;
83146
}
84147

85148
NSURL *url = [[NSURL alloc] initWithString:updatePackage[@"downloadUrl"]];
86149
NSString *updateContents = [[NSString alloc] initWithContentsOfURL:url
87150
encoding:NSUTF8StringEncoding
88151
error:error];
89-
if (error) {
152+
if (*error) {
90153
return;
91154
}
92155

93156
[updateContents writeToFile:[packageFolderPath stringByAppendingPathComponent:@"app.jsbundle"]
94157
atomically:YES
95158
encoding:NSUTF8StringEncoding
96159
error:error];
97-
if (error) {
160+
if (*error) {
98161
return;
99162
}
100163

101164
NSData *updateSerializedData = [NSJSONSerialization dataWithJSONObject:updatePackage
102165
options:0
103166
error:error];
104167

105-
if (error) {
168+
if (*error) {
106169
return;
107170
}
108171

@@ -113,12 +176,13 @@ + (void)downloadPackage:(NSDictionary *)updatePackage
113176
error:error];
114177
}
115178

116-
+ (void)applyPackage:(NSString *)packageHash
179+
+ (void)applyPackage:(NSDictionary *)updatePackage
117180
error:(NSError **)error
118181
{
119-
NSDictionary *info = [self getCurrentPackageInfo:error];
182+
NSString *packageHash = updatePackage[@"packageHash" ];
183+
NSMutableDictionary *info = [self getCurrentPackageInfo:error];
120184

121-
if (error) {
185+
if (*error) {
122186
return;
123187
}
124188

Examples/CodePushDemoApp/index.ios.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ var CodePushDemoApp = React.createClass({
3030
return { update: false };
3131
},
3232
handlePress: function() {
33-
this.state.update.download((localPackage) => {
33+
this.state.update.download().then((localPackage) => {
3434
localPackage.apply().done();
3535
});
3636
},

0 commit comments

Comments
 (0)