@@ -148,6 +148,7 @@ + (void)clearUpdates
148
148
#pragma mark - Private API methods
149
149
150
150
@synthesize bridge = _bridge;
151
+ @synthesize methodQueue = _methodQueue;
151
152
152
153
+ (NSURL *)binaryBundleURL
153
154
{
@@ -393,27 +394,29 @@ - (void)savePendingUpdate:(NSString *)packageHash
393
394
resolver:(RCTPromiseResolveBlock)resolve
394
395
rejecter:(RCTPromiseRejectBlock)reject)
395
396
{
396
- dispatch_async ( dispatch_get_main_queue (), ^{
397
- NSDictionary *mutableUpdatePackage = [updatePackage mutableCopy ];
398
- NSURL * binaryBundleURL = [CodePush binaryBundleURL ];
399
- if (binaryBundleURL != nil ) {
400
- [mutableUpdatePackage setValue: [CodePush modifiedDateStringOfFileAtURL: binaryBundleURL]
401
- forKey: BinaryBundleDateKey];
402
- }
403
-
404
- [CodePushPackage downloadPackage: mutableUpdatePackage
405
- // The download is progressing forward
406
- progressCallback: ^( long long expectedContentLength, long long receivedContentLength) {
397
+ NSDictionary *mutableUpdatePackage = [updatePackage mutableCopy ];
398
+ NSURL *binaryBundleURL = [CodePush binaryBundleURL ];
399
+ if ( binaryBundleURL != nil ) {
400
+ [mutableUpdatePackage setValue: [CodePush modifiedDateStringOfFileAtURL: binaryBundleURL]
401
+ forKey: BinaryBundleDateKey];
402
+ }
403
+
404
+ [CodePushPackage downloadPackage: mutableUpdatePackage
405
+ // The download is progressing forward
406
+ progressCallback: ^( long long expectedContentLength, long long receivedContentLength) {
407
+ dispatch_async (_methodQueue, ^ {
407
408
// Notify the script-side about the progress
408
409
[self .bridge.eventDispatcher
409
410
sendDeviceEventWithName: @" CodePushDownloadProgress"
410
411
body: @{
411
412
@" totalBytes" :[NSNumber numberWithLongLong: expectedContentLength],
412
413
@" receivedBytes" :[NSNumber numberWithLongLong: receivedContentLength]
413
414
}];
414
- }
415
- // The download completed
416
- doneCallback: ^{
415
+ });
416
+ }
417
+ // The download completed
418
+ doneCallback: ^{
419
+ dispatch_async (_methodQueue, ^{
417
420
NSError *err;
418
421
NSDictionary *newPackage = [CodePushPackage getPackage: mutableUpdatePackage[PackageHashKey] error: &err];
419
422
@@ -422,16 +425,18 @@ - (void)savePendingUpdate:(NSString *)packageHash
422
425
}
423
426
424
427
resolve (newPackage);
425
- }
426
- // The download failed
427
- failCallback: ^(NSError *err) {
428
+ });
429
+ }
430
+ // The download failed
431
+ failCallback: ^(NSError *err) {
432
+ dispatch_async (_methodQueue, ^{
428
433
if ([CodePushPackage isCodePushError: err]) {
429
434
[self saveFailedUpdate: mutableUpdatePackage];
430
435
}
431
436
432
437
reject ([NSString stringWithFormat: @" %lu " , (long )err.code], err.localizedDescription , err);
433
- }] ;
434
- }) ;
438
+ }) ;
439
+ }] ;
435
440
}
436
441
437
442
/*
@@ -452,21 +457,19 @@ - (void)savePendingUpdate:(NSString *)packageHash
452
457
RCT_EXPORT_METHOD (getCurrentPackage:(RCTPromiseResolveBlock)resolve
453
458
rejecter:(RCTPromiseRejectBlock)reject)
454
459
{
455
- dispatch_async (dispatch_get_main_queue (), ^{
456
- NSError *error;
457
- NSMutableDictionary *package = [[CodePushPackage getCurrentPackage: &error] mutableCopy ];
458
-
459
- if (error) {
460
- reject ([NSString stringWithFormat: @" %lu " , (long )error.code], error.localizedDescription , error);
461
- }
462
-
463
- // Add the "isPending" virtual property to the package at this point, so that
464
- // the script-side doesn't need to immediately call back into native to populate it.
465
- BOOL isPendingUpdate = [self isPendingUpdate: [package objectForKey: PackageHashKey]];
466
- [package setObject: @(isPendingUpdate) forKey: PackageIsPendingKey];
467
-
468
- resolve (package);
469
- });
460
+ NSError *error;
461
+ NSMutableDictionary *package = [[CodePushPackage getCurrentPackage: &error] mutableCopy ];
462
+
463
+ if (error) {
464
+ reject ([NSString stringWithFormat: @" %lu " , (long )error.code], error.localizedDescription , error);
465
+ }
466
+
467
+ // Add the "isPending" virtual property to the package at this point, so that
468
+ // the script-side doesn't need to immediately call back into native to populate it.
469
+ BOOL isPendingUpdate = [self isPendingUpdate: [package objectForKey: PackageHashKey]];
470
+ [package setObject: @(isPendingUpdate) forKey: PackageIsPendingKey];
471
+
472
+ resolve (package);
470
473
}
471
474
472
475
/*
@@ -477,32 +480,30 @@ - (void)savePendingUpdate:(NSString *)packageHash
477
480
resolver:(RCTPromiseResolveBlock)resolve
478
481
rejecter:(RCTPromiseRejectBlock)reject)
479
482
{
480
- dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
481
- NSError *error;
482
- [CodePushPackage installPackage: updatePackage
483
- removePendingUpdate: [self isPendingUpdate: nil ]
484
- error: &error];
483
+ NSError *error;
484
+ [CodePushPackage installPackage: updatePackage
485
+ removePendingUpdate: [self isPendingUpdate: nil ]
486
+ error: &error];
487
+
488
+ if (error) {
489
+ reject ([NSString stringWithFormat: @" %lu " , (long )error.code], error.localizedDescription , error);
490
+ } else {
491
+ [self savePendingUpdate: updatePackage[PackageHashKey]
492
+ isLoading: NO ];
485
493
486
- if (error) {
487
- reject ([NSString stringWithFormat: @" %lu " , (long )error.code], error.localizedDescription , error);
488
- } else {
489
- [self savePendingUpdate: updatePackage[PackageHashKey]
490
- isLoading: NO ];
491
-
492
- if (installMode == CodePushInstallModeOnNextResume && !_hasResumeListener) {
493
- // Ensure we do not add the listener twice.
494
- // Register for app resume notifications so that we
495
- // can check for pending updates which support "restart on resume"
496
- [[NSNotificationCenter defaultCenter ] addObserver: self
497
- selector: @selector (loadBundle )
498
- name: UIApplicationWillEnterForegroundNotification
499
- object: [UIApplication sharedApplication ]];
500
- _hasResumeListener = YES ;
501
- }
502
- // Signal to JS that the update has been applied.
503
- resolve (nil );
494
+ if (installMode == CodePushInstallModeOnNextResume && !_hasResumeListener) {
495
+ // Ensure we do not add the listener twice.
496
+ // Register for app resume notifications so that we
497
+ // can check for pending updates which support "restart on resume"
498
+ [[NSNotificationCenter defaultCenter ] addObserver: self
499
+ selector: @selector (loadBundle )
500
+ name: UIApplicationWillEnterForegroundNotification
501
+ object: [UIApplication sharedApplication ]];
502
+ _hasResumeListener = YES ;
504
503
}
505
- });
504
+ // Signal to JS that the update has been applied.
505
+ resolve (nil );
506
+ }
506
507
}
507
508
508
509
/*
@@ -551,33 +552,31 @@ - (void)savePendingUpdate:(NSString *)packageHash
551
552
RCT_EXPORT_METHOD (getNewStatusReport:(RCTPromiseResolveBlock)resolve
552
553
rejecter:(RCTPromiseRejectBlock)reject)
553
554
{
554
- dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
555
- if (needToReportRollback) {
556
- needToReportRollback = NO ;
557
- NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults ];
558
- NSMutableArray *failedUpdates = [preferences objectForKey: FailedUpdatesKey];
559
- if (failedUpdates) {
560
- NSDictionary *lastFailedPackage = [failedUpdates lastObject ];
561
- if (lastFailedPackage) {
562
- resolve ([CodePushTelemetryManager getRollbackReport: lastFailedPackage]);
563
- return ;
564
- }
565
- }
566
- } else if (_isFirstRunAfterUpdate) {
567
- NSError *error;
568
- NSDictionary *currentPackage = [CodePushPackage getCurrentPackage: &error];
569
- if (!error && currentPackage) {
570
- resolve ([CodePushTelemetryManager getUpdateReport: currentPackage]);
555
+ if (needToReportRollback) {
556
+ needToReportRollback = NO ;
557
+ NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults ];
558
+ NSMutableArray *failedUpdates = [preferences objectForKey: FailedUpdatesKey];
559
+ if (failedUpdates) {
560
+ NSDictionary *lastFailedPackage = [failedUpdates lastObject ];
561
+ if (lastFailedPackage) {
562
+ resolve ([CodePushTelemetryManager getRollbackReport: lastFailedPackage]);
571
563
return ;
572
564
}
573
- } else if (isRunningBinaryVersion) {
574
- NSString *appVersion = [[CodePushConfig current ] appVersion ];
575
- resolve ([CodePushTelemetryManager getBinaryUpdateReport: appVersion]);
565
+ }
566
+ } else if (_isFirstRunAfterUpdate) {
567
+ NSError *error;
568
+ NSDictionary *currentPackage = [CodePushPackage getCurrentPackage: &error];
569
+ if (!error && currentPackage) {
570
+ resolve ([CodePushTelemetryManager getUpdateReport: currentPackage]);
576
571
return ;
577
572
}
578
-
579
- resolve (nil );
580
- });
573
+ } else if (isRunningBinaryVersion) {
574
+ NSString *appVersion = [[CodePushConfig current ] appVersion ];
575
+ resolve ([CodePushTelemetryManager getBinaryUpdateReport: appVersion]);
576
+ return ;
577
+ }
578
+
579
+ resolve (nil );
581
580
}
582
581
583
582
/*
0 commit comments