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

Commit d20e9cc

Browse files
committed
feedback
1 parent a44c792 commit d20e9cc

File tree

4 files changed

+99
-139
lines changed

4 files changed

+99
-139
lines changed

CodePush.m

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ @implementation CodePush {
2323
// These keys represent the names we use to store data in NSUserDefaults
2424
static NSString *const FailedUpdatesKey = @"CODE_PUSH_FAILED_UPDATES";
2525
static NSString *const PendingUpdateKey = @"CODE_PUSH_PENDING_UPDATE";
26-
static NSString *const StatusReportsKey = @"CODE_PUSH_STATUS_REPORTS";
26+
static NSString *const LastDeploymentReportKey = @"CODE_PUSH_LAST_DEPLOYMENT_REPORT";
2727

2828
// These keys are already "namespaced" by the PendingUpdateKey, so
2929
// their values don't need to be obfuscated to prevent collision with app data
@@ -211,8 +211,8 @@ - (void)initializeUpdateAfterRestart
211211
- (BOOL)isDeploymentStatusNotYetReported:(NSString *)appVersionOrPackageIdentifier
212212
{
213213
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
214-
NSDictionary *sentStatusReports = [preferences objectForKey:StatusReportsKey];
215-
return sentStatusReports == nil || [sentStatusReports objectForKey:appVersionOrPackageIdentifier] == nil;
214+
NSString *sentStatusReportIdentifier = [preferences objectForKey:LastDeploymentReportKey];
215+
return sentStatusReportIdentifier == nil || ![sentStatusReportIdentifier isEqualToString:appVersionOrPackageIdentifier];
216216
}
217217

218218
/*
@@ -286,18 +286,9 @@ - (void)loadBundle
286286
}
287287

288288
- (void)recordDeploymentStatusReported:(NSString *)appVersionOrPackageIdentifier
289-
status:(NSString *)status
290289
{
291290
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
292-
NSMutableDictionary *sentStatusReports = [preferences objectForKey:StatusReportsKey];
293-
if (sentStatusReports == nil) {
294-
sentStatusReports = [NSMutableDictionary dictionary];
295-
} else {
296-
sentStatusReports = [sentStatusReports mutableCopy];
297-
}
298-
299-
[sentStatusReports setValue:status forKey:appVersionOrPackageIdentifier];
300-
[preferences setValue:sentStatusReports forKey:StatusReportsKey];
291+
[preferences setValue:LastDeploymentReportKey forKey:appVersionOrPackageIdentifier];
301292
[preferences synchronize];
302293
}
303294

@@ -543,45 +534,48 @@ - (void)savePendingUpdate:(NSString *)packageHash
543534
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
544535
NSMutableArray *failedUpdates = [preferences objectForKey:FailedUpdatesKey];
545536
if (failedUpdates) {
546-
NSDictionary* lastFailedPackage = [failedUpdates lastObject];
537+
NSDictionary *lastFailedPackage = [failedUpdates lastObject];
547538
if (lastFailedPackage) {
548-
NSString* lastFailedPackageIdentifier = [self getPackageStatusReportIdentifier:lastFailedPackage];
539+
NSString *lastFailedPackageIdentifier = [self getPackageStatusReportIdentifier:lastFailedPackage];
549540
if (lastFailedPackageIdentifier && [self isDeploymentStatusNotYetReported:lastFailedPackageIdentifier]) {
550-
[self recordDeploymentStatusReported:lastFailedPackageIdentifier
551-
status:DeploymentFailed];
541+
[self recordDeploymentStatusReported:lastFailedPackageIdentifier];
552542
resolve(@{ @"package": lastFailedPackage, @"status": DeploymentFailed });
553543
return;
554544
}
555545
}
556546
}
557-
}
558-
559-
if (_isFirstRunAfterUpdate) {
547+
} else if (_isFirstRunAfterUpdate) {
560548
// Check if the current CodePush package has been reported
561549
NSError *error;
562550
NSDictionary* currentPackage = [CodePushPackage getCurrentPackage:&error];
563551
if (currentPackage) {
564552
NSString* currentPackageIdentifier = [self getPackageStatusReportIdentifier:currentPackage];
565553
if (currentPackageIdentifier && [self isDeploymentStatusNotYetReported:currentPackageIdentifier]) {
566-
[self recordDeploymentStatusReported:currentPackageIdentifier
567-
status:DeploymentSucceeded];
554+
[self recordDeploymentStatusReported:currentPackageIdentifier];
568555
resolve(@{ @"package": currentPackage, @"status": DeploymentSucceeded });
569556
return;
570557
}
571558
}
572-
}
573-
574-
// Check if the current appVersion has been reported.
575-
NSString *appVersion = [[CodePushConfig current] appVersion];
576-
if ([self isDeploymentStatusNotYetReported:appVersion]) {
577-
[self recordDeploymentStatusReported:appVersion
578-
status:DeploymentSucceeded];
579-
resolve(@{ @"appVersion": appVersion });
580-
return;
559+
} else {
560+
NSError *error;
561+
NSString *currentPackageHash = [CodePushPackage getCurrentPackageHash:&error];
562+
if (error || currentPackageHash == nil) {
563+
// Check if the current appVersion has been reported. Use date as the binary identifier to
564+
// handle binary releases that do not modify the appVersion.
565+
NSURL *binaryJsBundleUrl = [CodePush bundleURL];
566+
NSDictionary *binaryFileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[binaryJsBundleUrl path] error:nil];
567+
NSTimeInterval binaryDate = [[binaryFileAttributes objectForKey:NSFileModificationDate] timeIntervalSince1970];
568+
NSString* binaryIdentifier = [NSString stringWithFormat:@"%f", binaryDate];
569+
570+
if ([self isDeploymentStatusNotYetReported:binaryIdentifier]) {
571+
[self recordDeploymentStatusReported:binaryIdentifier];
572+
resolve(@{ @"appVersion": [[CodePushConfig current] appVersion] });
573+
return;
574+
}
575+
}
581576
}
582577

583578
resolve([NSNull null]);
584-
return;
585579
}
586580

587581
/*

android/app/src/main/java/com/microsoft/codepush/react/CodePush.java

Lines changed: 52 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public class CodePush {
6161
private final String PENDING_UPDATE_IS_LOADING_KEY = "isLoading";
6262
private final String PENDING_UPDATE_KEY = "CODE_PUSH_PENDING_UPDATE";
6363
private final String RESOURCES_BUNDLE = "resources.arsc";
64-
private final String STATUS_REPORTS_KEY = "CODE_PUSH_STATUS_REPORTS";
64+
private final String LAST_DEPLOYMENT_REPORT_KEY = "CODE_PUSH_LAST_DEPLOYMENT_REPORT";
6565

6666
// This needs to be kept in sync with https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManager.java#L78
6767
private final String REACT_DEV_BUNDLE_CACHE_FILE_NAME = "ReactNativeDevBundle.js";
@@ -153,10 +153,10 @@ public String getBundleUrl(String assetsBundleFileName) {
153153
binaryModifiedDateDuringPackageInstall = Long.parseLong(binaryModifiedDateDuringPackageInstallString);
154154
}
155155

156-
String pacakgeAppVersion = CodePushUtils.tryGetString(packageMetadata, "appVersion");
156+
String packageAppVersion = CodePushUtils.tryGetString(packageMetadata, "appVersion");
157157
if (binaryModifiedDateDuringPackageInstall != null &&
158158
binaryModifiedDateDuringPackageInstall == binaryResourcesModifiedTime &&
159-
(this.isUsingTestConfiguration() || this.appVersion.equals(pacakgeAppVersion))) {
159+
(this.isUsingTestConfiguration() || this.appVersion.equals(packageAppVersion))) {
160160
CodePushUtils.logBundleUrl(packageFilePath);
161161
return packageFilePath;
162162
} else {
@@ -169,8 +169,6 @@ public String getBundleUrl(String assetsBundleFileName) {
169169
CodePushUtils.logBundleUrl(binaryJsBundleUrl);
170170
return binaryJsBundleUrl;
171171
}
172-
} catch (IOException e) {
173-
throw new CodePushUnknownException("Error in getting current package bundle path", e);
174172
} catch (NumberFormatException e) {
175173
throw new CodePushUnknownException("Error in reading binary modified date from package metadata", e);
176174
}
@@ -263,17 +261,11 @@ private void initializeUpdateAfterRestart() {
263261

264262
private boolean isDeploymentStatusNotYetReported(String appVersionOrPackageIdentifier) {
265263
SharedPreferences settings = applicationContext.getSharedPreferences(CODE_PUSH_PREFERENCES, 0);
266-
String sentStatusReportsString = settings.getString(STATUS_REPORTS_KEY, null);
267-
if (sentStatusReportsString == null) {
264+
String lastDeploymentReportIdentifier = settings.getString(LAST_DEPLOYMENT_REPORT_KEY, null);
265+
if (lastDeploymentReportIdentifier == null) {
268266
return true;
269267
} else {
270-
try {
271-
JSONObject sentStatusReports = new JSONObject(sentStatusReportsString);
272-
return !sentStatusReports.has(appVersionOrPackageIdentifier);
273-
} catch (JSONException e) {
274-
throw new CodePushUnknownException("Unable to parse sent status reports information " +
275-
sentStatusReportsString + " stored in SharedPreferences.", e);
276-
}
268+
return !lastDeploymentReportIdentifier.equals(appVersionOrPackageIdentifier);
277269
}
278270
}
279271

@@ -311,22 +303,9 @@ private boolean isPendingUpdate(String packageHash) {
311303
}
312304
}
313305

314-
private void recordDeploymentStatusReported(String appVersionOrPackageIdentifier, String status) {
306+
private void recordDeploymentStatusReported(String appVersionOrPackageIdentifier) {
315307
SharedPreferences settings = applicationContext.getSharedPreferences(CODE_PUSH_PREFERENCES, 0);
316-
String sentStatusReportsString = settings.getString(STATUS_REPORTS_KEY, null);
317-
JSONObject sentStatusReports;
318-
try {
319-
if (sentStatusReportsString == null) {
320-
sentStatusReports = new JSONObject();
321-
} else {
322-
sentStatusReports = new JSONObject(sentStatusReportsString);
323-
}
324-
325-
sentStatusReports.put(appVersionOrPackageIdentifier, status);
326-
settings.edit().putString(STATUS_REPORTS_KEY, sentStatusReports.toString()).commit();
327-
} catch (JSONException e) {
328-
throw new CodePushUnknownException("Unable to save new entry in SharedPreferences under " + STATUS_REPORTS_KEY + ".", e);
329-
}
308+
settings.edit().putString(LAST_DEPLOYMENT_REPORT_KEY, appVersionOrPackageIdentifier).commit();
330309
}
331310

332311
private void removeFailedUpdates() {
@@ -340,19 +319,9 @@ private void removePendingUpdate() {
340319
}
341320

342321
private void rollbackPackage() {
343-
try {
344-
WritableMap failedPackage = codePushPackage.getCurrentPackage();
345-
saveFailedUpdate(failedPackage);
346-
} catch (IOException e) {
347-
throw new CodePushUnknownException("Attempted a rollback without having a current downloaded package", e);
348-
}
349-
350-
try {
351-
codePushPackage.rollbackPackage();
352-
} catch (IOException e) {
353-
throw new CodePushUnknownException("Error in rolling back package", e);
354-
}
355-
322+
WritableMap failedPackage = codePushPackage.getCurrentPackage();
323+
saveFailedUpdate(failedPackage);
324+
codePushPackage.rollbackPackage();
356325
removePendingUpdate();
357326
}
358327

@@ -464,23 +433,17 @@ public void getCurrentPackage(final Promise promise) {
464433
AsyncTask asyncTask = new AsyncTask() {
465434
@Override
466435
protected Void doInBackground(Object... params) {
467-
try {
468-
WritableMap currentPackage = codePushPackage.getCurrentPackage();
436+
WritableMap currentPackage = codePushPackage.getCurrentPackage();
469437

470-
Boolean isPendingUpdate = false;
438+
Boolean isPendingUpdate = false;
471439

472-
if (currentPackage.hasKey(codePushPackage.PACKAGE_HASH_KEY)) {
473-
String currentHash = currentPackage.getString(codePushPackage.PACKAGE_HASH_KEY);
474-
isPendingUpdate = CodePush.this.isPendingUpdate(currentHash);
475-
}
476-
477-
currentPackage.putBoolean("isPending", isPendingUpdate);
478-
promise.resolve(currentPackage);
479-
} catch (IOException e) {
480-
e.printStackTrace();
481-
promise.reject(e.getMessage());
440+
if (currentPackage.hasKey(codePushPackage.PACKAGE_HASH_KEY)) {
441+
String currentHash = currentPackage.getString(codePushPackage.PACKAGE_HASH_KEY);
442+
isPendingUpdate = CodePush.this.isPendingUpdate(currentHash);
482443
}
483-
444+
445+
currentPackage.putBoolean("isPending", isPendingUpdate);
446+
promise.resolve(currentPackage);
484447
return null;
485448
}
486449
};
@@ -490,16 +453,16 @@ protected Void doInBackground(Object... params) {
490453

491454
@ReactMethod
492455
public void getNewStatusReport(Promise promise) {
493-
// Check if there was a rollback that was not yet reported
494456
if (didRollback) {
457+
// Check if there was a rollback that was not yet reported
495458
JSONArray failedUpdates = getFailedUpdates();
496459
if (failedUpdates != null && failedUpdates.length() > 0) {
497460
try {
498461
JSONObject lastFailedPackageJSON = failedUpdates.getJSONObject(failedUpdates.length() - 1);
499462
WritableMap lastFailedPackage = CodePushUtils.convertJsonObjectToWriteable(lastFailedPackageJSON);
500463
String lastFailedPackageIdentifier = getPackageStatusReportIdentifier(lastFailedPackage);
501464
if (lastFailedPackage != null && isDeploymentStatusNotYetReported(lastFailedPackageIdentifier)) {
502-
recordDeploymentStatusReported(lastFailedPackageIdentifier, DEPLOYMENT_FAILED_STATUS);
465+
recordDeploymentStatusReported(lastFailedPackageIdentifier);
503466
WritableNativeMap reportMap = new WritableNativeMap();
504467
reportMap.putMap("package", lastFailedPackage);
505468
reportMap.putString("status", DEPLOYMENT_FAILED_STATUS);
@@ -510,36 +473,34 @@ public void getNewStatusReport(Promise promise) {
510473
throw new CodePushUnknownException("Unable to read failed updates information stored in SharedPreferences.", e);
511474
}
512475
}
513-
}
514-
515-
// Check if the current CodePush package has been reported
516-
if (didUpdate) {
517-
try {
518-
WritableMap currentPackage = codePushPackage.getCurrentPackage();
519-
if (currentPackage != null) {
520-
String currentPackageIdentifier = getPackageStatusReportIdentifier(currentPackage);
521-
if (currentPackageIdentifier != null && isDeploymentStatusNotYetReported(currentPackageIdentifier)) {
522-
recordDeploymentStatusReported(currentPackageIdentifier, DEPLOYMENT_SUCCEEDED_STATUS);
523-
WritableNativeMap reportMap = new WritableNativeMap();
524-
reportMap.putMap("package", currentPackage);
525-
reportMap.putString("status", DEPLOYMENT_SUCCEEDED_STATUS);
526-
promise.resolve(reportMap);
527-
return;
528-
}
476+
} else if (didUpdate) {
477+
// Check if the current CodePush package has been reported
478+
WritableMap currentPackage = codePushPackage.getCurrentPackage();
479+
if (currentPackage != null) {
480+
String currentPackageIdentifier = getPackageStatusReportIdentifier(currentPackage);
481+
if (currentPackageIdentifier != null && isDeploymentStatusNotYetReported(currentPackageIdentifier)) {
482+
recordDeploymentStatusReported(currentPackageIdentifier);
483+
WritableNativeMap reportMap = new WritableNativeMap();
484+
reportMap.putMap("package", currentPackage);
485+
reportMap.putString("status", DEPLOYMENT_SUCCEEDED_STATUS);
486+
promise.resolve(reportMap);
487+
return;
488+
}
489+
}
490+
} else {
491+
String currentPackageHash = null;
492+
currentPackageHash = codePushPackage.getCurrentPackageHash();
493+
if (currentPackageHash == null) {
494+
// Check if the current appVersion has been reported.
495+
String binaryIdentifier = "" + getBinaryResourcesModifiedTime();
496+
if (isDeploymentStatusNotYetReported(binaryIdentifier)) {
497+
recordDeploymentStatusReported(binaryIdentifier);
498+
WritableNativeMap reportMap = new WritableNativeMap();
499+
reportMap.putString("appVersion", appVersion);
500+
promise.resolve(reportMap);
501+
return;
529502
}
530-
} catch (IOException e) {
531-
// If didUpdate is true, there should be a current package, so this should not happen.
532-
throw new CodePushUnknownException("Error getting current package after an update.", e);
533503
}
534-
}
535-
536-
// Check if the current appVersion has been reported.
537-
if (isDeploymentStatusNotYetReported(appVersion)) {
538-
recordDeploymentStatusReported(appVersion, DEPLOYMENT_SUCCEEDED_STATUS);
539-
WritableNativeMap reportMap = new WritableNativeMap();
540-
reportMap.putString("appVersion", appVersion);
541-
promise.resolve(reportMap);
542-
return;
543504
}
544505

545506
promise.resolve("");
@@ -600,16 +561,11 @@ public void isFailedUpdate(String packageHash, Promise promise) {
600561

601562
@ReactMethod
602563
public void isFirstRun(String packageHash, Promise promise) {
603-
try {
604-
boolean isFirstRun = didUpdate
605-
&& packageHash != null
606-
&& packageHash.length() > 0
607-
&& packageHash.equals(codePushPackage.getCurrentPackageHash());
608-
promise.resolve(isFirstRun);
609-
} catch (IOException e) {
610-
e.printStackTrace();
611-
promise.reject(e.getMessage());
612-
}
564+
boolean isFirstRun = didUpdate
565+
&& packageHash != null
566+
&& packageHash.length() > 0
567+
&& packageHash.equals(codePushPackage.getCurrentPackageHash());
568+
promise.resolve(isFirstRun);
613569
}
614570

615571
@ReactMethod

0 commit comments

Comments
 (0)