From 361bbfaa9ea47aa5f85af5ffea02309535a3a5ed Mon Sep 17 00:00:00 2001 From: Christian Hoffmann Date: Mon, 18 May 2020 18:22:27 +0200 Subject: [PATCH 1/4] give the initial link enough time to resolve --- .../Classes/FLTFirebaseDynamicLinksPlugin.m | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m index 2e4cca7207c2..e530dab80efb 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 resolvingInitialLink; @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; + _resolvingInitialLink = 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 (_resolvingInitialLink == 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.resolvingInitialLink = 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.resolvingInitialLink = NO; }]; return handled; } From fae929d4dea6238e1c8423ee683a72a36fdebc24 Mon Sep 17 00:00:00 2001 From: Christian Hoffmann Date: Mon, 18 May 2020 18:48:26 +0200 Subject: [PATCH 2/4] rename property --- .../ios/Classes/FLTFirebaseDynamicLinksPlugin.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m index e530dab80efb..d2e365b90f70 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m +++ b/packages/firebase_dynamic_links/ios/Classes/FLTFirebaseDynamicLinksPlugin.m @@ -43,7 +43,7 @@ @interface FLTFirebaseDynamicLinksPlugin () @property(nonatomic, retain) FlutterMethodChannel *channel; @property(nonatomic, retain) FIRDynamicLink *initialLink; -@property(nonatomic, assign) BOOL resolvingInitialLink; +@property(nonatomic, assign) BOOL isResolvingInitialLink; @property(nonatomic, retain) FlutterError *flutterError; @property(nonatomic) BOOL initiated; @end @@ -68,7 +68,7 @@ - (instancetype)initWithChannel:(FlutterMethodChannel *)channel { self = [super init]; if (self) { _initiated = NO; - _resolvingInitialLink = NO; + _isResolvingInitialLink = NO; _channel = channel; if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { NSLog(@"Configuring the default Firebase app..."); @@ -112,7 +112,7 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } - (void)continueGetInitialLinkWithResult:(FlutterResult)result { - if (_resolvingInitialLink == YES) { + if (_isResolvingInitialLink == YES) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self continueGetInitialLinkWithResult:result]; }); @@ -169,7 +169,7 @@ - (BOOL)onLink:(NSUserActivity *)userActivity { } - (BOOL)onInitialLink:(NSUserActivity *)userActivity { - self.resolvingInitialLink = YES; + self.isResolvingInitialLink = YES; BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL completion:^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) { @@ -177,7 +177,7 @@ - (BOOL)onInitialLink:(NSUserActivity *)userActivity { self.flutterError = getFlutterError(error); } self.initialLink = dynamicLink; - self.resolvingInitialLink = NO; + self.isResolvingInitialLink = NO; }]; return handled; } From 888a9fce2c75e808ba7e4b4f04c01a3020e698e1 Mon Sep 17 00:00:00 2001 From: Christian Hoffmann Date: Mon, 18 May 2020 18:49:09 +0200 Subject: [PATCH 3/4] update changelog --- packages/firebase_dynamic_links/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) 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. From 5b6382cde25c58be1b3dbb12d9c561195727c507 Mon Sep 17 00:00:00 2001 From: Christian Hoffmann Date: Mon, 18 May 2020 18:49:54 +0200 Subject: [PATCH 4/4] update pubspec.yaml --- packages/firebase_dynamic_links/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: