Skip to content

Commit

Permalink
fix(dynamic_links): fix initialization process
Browse files Browse the repository at this point in the history
Description:
Fixing race-condition with getInitialLink and actuall setup
this initial link on iOS devices

Closes: #100
Closes: #1847
Closes: #1861
  • Loading branch information
jacek-marchwicki committed Jun 19, 2020
1 parent 8ecdf43 commit 702f71c
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 60 deletions.
17 changes: 8 additions & 9 deletions packages/firebase_dynamic_links/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,7 @@ Receiving dynamic links on *iOS* requires a couple more steps than *Android*. If
applinks:YOUR_SUBDOMAIN.page.link
```

4. To receive a dynamic link, call the `getInitialLink()` method from `FirebaseDynamicLinks` which gets the link that opened the app (or null if it was not opened via a dynamic link)
and configure listeners for link callbacks when the application is active or in background calling `onLink`.
4. To receive a dynamic link, configure listeners for link callbacks when the application is active or in background calling `onLink` and call the `getInitialLink()` method from `FirebaseDynamicLinks` which gets the link that opened the app (or null if it was not opened via a dynamic link).

```dart
void main() {
Expand All @@ -120,13 +119,6 @@ class MyHomeWidgetState extends State<MyHomeWidget> {
}
void initDynamicLinks() async {
final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
if (deepLink != null) {
Navigator.pushNamed(context, deepLink.path);
}
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
Expand All @@ -140,6 +132,13 @@ class MyHomeWidgetState extends State<MyHomeWidget> {
print(e.message);
}
);
final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
if (deepLink != null) {
Navigator.pushNamed(context, deepLink.path);
}
}
.
.
Expand Down
18 changes: 9 additions & 9 deletions packages/firebase_dynamic_links/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';

Expand Down Expand Up @@ -40,14 +40,6 @@ class _MainScreenState extends State<_MainScreen> {
}

void initDynamicLinks() async {
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;

if (deepLink != null) {
Navigator.pushNamed(context, deepLink.path);
}

FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
Expand All @@ -59,6 +51,14 @@ class _MainScreenState extends State<_MainScreen> {
print('onLinkError');
print(e.message);
});

final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;

if (deepLink != null) {
Navigator.pushNamed(context, deepLink.path);
}
}

Future<void> _createDynamicLink(bool short) async {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,63 +118,57 @@ - (NSMutableDictionary *)getInitialLink {
return getDictionaryFromDynamicLink(_initialLink);
}

- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
return [self checkForDynamicLink:url];
}

- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [self checkForDynamicLink:url];
- (void) onDeepLinkResult: (FIRDynamicLink *_Nullable)dynamicLink
error: (NSError *_Nullable) error {
if (_initiated) {
if (error) {
FlutterError *flutterError = getFlutterError(error);
[_channel invokeMethod:@"onLinkError"
arguments:getDictionaryFromFlutterError(flutterError)];
} else {
NSMutableDictionary *dictionary = getDictionaryFromDynamicLink(dynamicLink);
[_channel invokeMethod:@"onLinkSuccess" arguments:dictionary];
}
} else {
if (error) {
_flutterError = getFlutterError(error);
} else {
_initialLink = dynamicLink;
}
}
}

- (BOOL)checkForDynamicLink:(NSURL *)url {
FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
if (dynamicLink) {
if (dynamicLink.url) _initialLink = dynamicLink;
[self onDeepLinkResult: dynamicLink error: nil];
return YES;
}
return NO;
}

- (BOOL)onLink:(NSUserActivity *)userActivity {
BOOL handled = [[FIRDynamicLinks dynamicLinks]
handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) {
if (error) {
FlutterError *flutterError = getFlutterError(error);
[self.channel invokeMethod:@"onLinkError"
arguments:getDictionaryFromFlutterError(flutterError)];
} else {
NSMutableDictionary *dictionary = getDictionaryFromDynamicLink(dynamicLink);
[self.channel invokeMethod:@"onLinkSuccess" arguments:dictionary];
}
}];
return handled;
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
return [self checkForDynamicLink:url];
}

- (BOOL)onInitialLink:(NSUserActivity *)userActivity {
BOOL handled = [[FIRDynamicLinks dynamicLinks]
handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) {
if (error) {
self.flutterError = getFlutterError(error);
}
self.initialLink = dynamicLink;
}];
return handled;
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [self checkForDynamicLink:url];
}

- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *))restorationHandler {
if (_initiated) {
return [self onLink:userActivity];
}
return [self onInitialLink:userActivity];
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *))restorationHandler {
BOOL handled = [[FIRDynamicLinks dynamicLinks]
handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) {
[self onDeepLinkResult: dynamicLink error: error];
}];
return handled;
}

- (FIRDynamicLinkShortenerCompletion)createShortLinkCompletion:(FlutterResult)result {
Expand Down

0 comments on commit 702f71c

Please sign in to comment.