diff --git a/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTUploader.m b/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTUploader.m index 6dd90f2cf93..0b9abeae475 100644 --- a/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTUploader.m +++ b/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCCTUploader.m @@ -35,7 +35,7 @@ @interface GDTCCTUploader () @property(nullable, nonatomic, readwrite) NSURLSessionUploadTask *currentTask; /** If running in the background, the current background ID. */ -@property(nonatomic) GDTBackgroundIdentifier backgroundID; +@property(nonatomic) BOOL runningInBackground; @end @@ -61,7 +61,6 @@ - (instancetype)init { _uploaderQueue = dispatch_queue_create("com.google.GDTCCTUploader", DISPATCH_QUEUE_SERIAL); NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; _uploaderSession = [NSURLSession sessionWithConfiguration:config]; - _backgroundID = GDTBackgroundIdentifierInvalid; } return self; } @@ -86,6 +85,15 @@ - (NSURL *)defaultServerURL { } - (void)uploadPackage:(GDTUploadPackage *)package { + GDTBackgroundIdentifier bgID = GDTBackgroundIdentifierInvalid; + if (_runningInBackground) { + bgID = [[GDTApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ + if (bgID != GDTBackgroundIdentifierInvalid) { + [[GDTApplication sharedApplication] endBackgroundTask:bgID]; + } + }]; + } + dispatch_async(_uploaderQueue, ^{ if (self->_currentTask || self->_currentUploadPackage) { GDTLogWarning(GDTMCWUploadFailed, @"%@", @@ -112,9 +120,10 @@ - (void)uploadPackage:(GDTUploadPackage *)package { } pb_release(gdt_cct_LogResponse_fields, &logResponse); [package completeDelivery]; - if (self->_backgroundID != GDTBackgroundIdentifierInvalid) { - [[GDTApplication sharedApplication] endBackgroundTask:self->_backgroundID]; - self->_backgroundID = GDTBackgroundIdentifierInvalid; + + // End the background task if there was one. + if (bgID != GDTBackgroundIdentifierInvalid) { + [[GDTApplication sharedApplication] endBackgroundTask:bgID]; } self.currentTask = nil; self.currentUploadPackage = nil; @@ -191,12 +200,21 @@ - (void)packageExpired:(GDTUploadPackage *)package { #pragma mark - GDTLifecycleProtocol - (void)appWillBackground:(GDTApplication *)app { - _backgroundID = [app beginBackgroundTaskWithExpirationHandler:^{ - if (self->_backgroundID != GDTBackgroundIdentifierInvalid) { - [app endBackgroundTask:self->_backgroundID]; - self->_backgroundID = GDTBackgroundIdentifierInvalid; + _runningInBackground = YES; + __block GDTBackgroundIdentifier bgID = [app beginBackgroundTaskWithExpirationHandler:^{ + if (bgID != GDTBackgroundIdentifierInvalid) { + [app endBackgroundTask:bgID]; } }]; + if (bgID != GDTBackgroundIdentifierInvalid) { + dispatch_async(_uploaderQueue, ^{ + [[GDTApplication sharedApplication] endBackgroundTask:bgID]; + }); + } +} + +- (void)appWillForeground:(GDTApplication *)app { + _runningInBackground = NO; } - (void)appWillTerminate:(GDTApplication *)application {