diff --git a/packages/firebase_dynamic_links/CHANGELOG.md b/packages/firebase_dynamic_links/CHANGELOG.md index 70d71d98d108..e3eee534e6fa 100644 --- a/packages/firebase_dynamic_links/CHANGELOG.md +++ b/packages/firebase_dynamic_links/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.0+13 + +- Fix for possible race condition in `getInitialLink` (iOS only). + ## 0.5.0+12 * Fix for missing UserAgent.h compilation failures. diff --git a/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m index 2e4cca7207c2..d2e365b90f70 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m +++ b/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m @@ -43,6 +43,7 @@ @interface FLTFirebaseDynamicLinksPlugin () @property(nonatomic, retain) FlutterMethodChannel *channel; @property(nonatomic, retain) FIRDynamicLink *initialLink; +@property(nonatomic, assign) BOOL isResolvingInitialLink; @property(nonatomic, retain) FlutterError *flutterError; @property(nonatomic) BOOL initiated; @end @@ -67,6 +68,7 @@ - (instancetype)initWithChannel:(FlutterMethodChannel *)channel { self = [super init]; if (self) { _initiated = NO; + _isResolvingInitialLink = NO; _channel = channel; if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { NSLog(@"Configuring the default Firebase app..."); @@ -92,12 +94,7 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result completion:[self createShortLinkCompletion:result]]; } else if ([@"FirebaseDynamicLinks#getInitialLink" isEqualToString:call.method]) { _initiated = YES; - NSMutableDictionary *dict = [self getInitialLink]; - if (dict == nil && self.flutterError) { - result(self.flutterError); - } else { - result(dict); - } + [self continueGetInitialLinkWithResult:result]; } else if ([@"FirebaseDynamicLinks#getDynamicLink" isEqualToString:call.method]) { NSURL *shortLink = [NSURL URLWithString:call.arguments[@"url"]]; FIRDynamicLinkUniversalLinkHandler completion = @@ -114,6 +111,21 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } } +- (void)continueGetInitialLinkWithResult:(FlutterResult)result { + if (_isResolvingInitialLink == YES) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self continueGetInitialLinkWithResult:result]; + }); + return; + } + NSMutableDictionary *dict = [self getInitialLink]; + if (dict == nil && self.flutterError) { + result(self.flutterError); + } else { + result(dict); + } +} + - (NSMutableDictionary *)getInitialLink { return getDictionaryFromDynamicLink(_initialLink); } @@ -157,6 +169,7 @@ - (BOOL)onLink:(NSUserActivity *)userActivity { } - (BOOL)onInitialLink:(NSUserActivity *)userActivity { + self.isResolvingInitialLink = YES; BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL completion:^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) { @@ -164,6 +177,7 @@ - (BOOL)onInitialLink:(NSUserActivity *)userActivity { self.flutterError = getFlutterError(error); } self.initialLink = dynamicLink; + self.isResolvingInitialLink = NO; }]; return handled; } diff --git a/packages/firebase_dynamic_links/pubspec.yaml b/packages/firebase_dynamic_links/pubspec.yaml index 4a270ec3afa8..8299fbf201cc 100644 --- a/packages/firebase_dynamic_links/pubspec.yaml +++ b/packages/firebase_dynamic_links/pubspec.yaml @@ -1,7 +1,7 @@ name: firebase_dynamic_links description: Flutter plugin for Google Dynamic Links for Firebase, an app solution for creating and handling links across multiple platforms. -version: 0.5.0+12 +version: 0.5.0+13 homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_dynamic_links dependencies: