A Flutter plugin to use the Google Dynamic Links for Firebase API.
With Dynamic Links, your users get the best available experience for the platform they open your link on. If a user opens a Dynamic Link on iOS or Android, they can be taken directly to the linked content in your native app. If a user opens the same Dynamic Link in a desktop browser, they can be taken to the equivalent content on your website.
In addition, Dynamic Links work across app installs: if a user opens a Dynamic Link on iOS or Android and doesn't have your app installed, the user can be prompted to install it; then, after installation, your app starts and can access the link.
For Flutter plugins for other Firebase products, see FlutterFire.md.
Note: This plugin is still under development, and some APIs might not be available yet. Feedback and Pull Requests are most welcome!
To use this plugin, add firebase_dynamic_links
as a dependency in your pubspec.yaml file. You must also configure firebase dynamic links for each platform project: Android and iOS (see the example folder or https://codelabs.developers.google.com/codelabs/flutter-firebase/#4 for step by step details).
You create a Dynamic Link either by using the Firebase console, using a REST API, iOS or Android Builder API, Flutter API, or by forming a URL by adding Dynamic Link parameters to a domain specific to your app. These parameters specify the links you want to open, depending on the user's platform and whether your app is installed.
Below are instructions to create Dynamic Links using Flutter with the Firebase Dynamic Links API. This API accepts either a long Dynamic Link or an object containing Dynamic Link parameters, and returns a URL like the following example:
https://abc123.app.goo.gl/WXYZ
You can create a Dynamic Link programmatically by setting the following parameters and using the DynamicLinkParameters.buildUrl()
method.
final DynamicLinkParameters parameters = new DynamicLinkParameters( domain: 'abc123.app.goo.gl', link: Uri.parse('https://example.com/'), androidParameters: new AndroidParameters( packageName: 'com.example.android', minimumVersion: 125, ), iosParameters: new IosParameters( bundleId: 'com.example.ios', minimumVersion: '1.0.1', appStoreId: '123456789', ), googleAnalyticsParameters: new GoogleAnalyticsParameters( campaign: 'example-promo', medium: 'social', source: 'orkut', ), itunesConnectAnalyticsParameters: new ItunesConnectAnalyticsParameters( providerToken: '123456', campaignToken: 'example-promo', ), socialMetaTagParameters: new SocialMetaTagParameters( title: 'Example of a Dynamic Link', description: 'This link works whether app is installed or not!', ), ); final Uri dynamicUrl = await parameters.buildUrl();
To create a short Dynamic Link, build DynamicLinkParameters
the same way, but use the DynamicLinkParameters.buildShortLink()
method.
final ShortDynamicLink shortDynamicLink = await parameters.buildShortLink(); final Uri shortUrl = shortDynamicLink.shortUrl;
To shorten a long Dynamic Link, use the DynamicLinkParameters.shortenUrl method.
final ShortDynamicLink shortenedLink = await DynamicLinkParameters.shortenUrl( Uri.parse('https://abc123.app.goo.gl/?link=https://example.com/&apn=com.example.android&ibn=com.example.ios'), new DynamicLinkParametersOptions(ShortDynamicLinkPathLength.unguessable), ); final Uri shortUrl = shortenedLink.shortUrl;
You can receive a Dynamic Link containing a deep link that takes the user to specific content within your app:
APP_CODE.app.goo.gl
.Receiving dynamic links on iOS requires a couple more steps than Android. If you only want to receive dynamic links on Android, skip to step 4. You can also follow a video on the next two steps here.
applinks:YOUR_SUBDOMAIN.page.link
retrieveDynamicLink()
method from FirebaseDynamicLinks
:void main() { runApp(new MaterialApp( title: 'Dynamic Links Example', routes: <String, WidgetBuilder>{ '/': (BuildContext context) => new MyHomeWidget(), // Default home route '/helloworld': (BuildContext context) => new MyHelloWorldWidget(), }, )); } class _MyHomeWidgetState extends State<_MyHomeWidget> { . . . @override void initState() { super.initState(); _retrieveDynamicLink(); } Future<void> _retrieveDynamicLink() async { final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.retrieveDynamicLink(); final Uri deepLink = data?.link; if (deepLink != null) { Navigator.pushNamed(context, deepLink.path); // '/helloworld' } } . . . }
If your app did not open from a dynamic link, retrieveDynamicLink()
will return null
.
See the example
directory for a complete sample app using Google Dynamic Links for Firebase.