Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dynamic_links]: fix initialization process #2817

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,6 +118,33 @@ - (NSMutableDictionary *)getInitialLink {
return getDictionaryFromDynamicLink(_initialLink);
}

- (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) {
[self onDeepLinkResult:dynamicLink error:nil];
return YES;
}
return NO;
}

- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
Expand All @@ -131,52 +158,17 @@ - (BOOL)application:(UIApplication *)application
return [self checkForDynamicLink:url];
}

- (BOOL)checkForDynamicLink:(NSURL *)url {
FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
if (dynamicLink) {
if (dynamicLink.url) _initialLink = dynamicLink;
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)onInitialLink:(NSUserActivity *)userActivity {
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *))restorationHandler {
BOOL handled = [[FIRDynamicLinks dynamicLinks]
handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) {
if (error) {
self.flutterError = getFlutterError(error);
}
self.initialLink = dynamicLink;
[self onDeepLinkResult:dynamicLink error:error];
}];
return handled;
}

- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *))restorationHandler {
if (_initiated) {
return [self onLink:userActivity];
}
return [self onInitialLink:userActivity];
}

- (FIRDynamicLinkShortenerCompletion)createShortLinkCompletion:(FlutterResult)result {
return ^(NSURL *_Nullable shortURL, NSArray *_Nullable warnings, NSError *_Nullable error) {
if (error) {
Expand Down