🍣

 【Flutter】DynamicLink.getInitialLinkでURLパラメータが取得できない

2023/02/09に公開

firebase_dynamic_links: 5.0.11ではgetInitialLinkが動作しないIssueが報告されています。

https://github.com/firebase/flutterfire/issues/7546

(Issue名はAppStoreインストールについてだが、スレッド内でインストール済みについても触れています)

DynamicLink.getInitialLink をつかっても null が返ってきてしまうのですが、
app_linksを使うと、アプリ起動に利用された DeepLinks が取得できます。

https://pub.dev/packages/app_links

https://stackoverflow.com/a/71665919

ただし、ここで取得されるURLは、iOSの場合、ダイナミックリンクの解釈前です。
ダイナミックリンクからURLを取り出すgetDynamicLinkを利用することでこのバグに対するパッチ処理となります。

まとめると次のコードで動作しました。

init
// リスナーを貼ります
Future<void> init() async {
    final AppLinks _appLinks = AppLinks();

    // Check initial link if app was in cold state (terminated)
    final appLink = await _appLinks.getInitialAppLink();
    if (appLink != null) {
      final Uri? _initialLink = await _patchDynamicLink(appLink);
      _openAppLink(_initialLink!);
    }

    // Handle link when app is in warm state (front or background)
    _appLinks.uriLinkStream.listen((uri) async {
      final Uri? _uri = await _patchDynamicLink(uri);
      if (_uri != null) {
        _openAppLink(_uri);
      }
    });
  }
_patchDynamicLink
  Future<Uri?> _patchDynamicLink(Uri appLink) async {
    if (Platform.isIOS) {
      try {
        final PendingDynamicLinkData? dynamicLink =
            await FirebaseDynamicLinks.instance.getDynamicLink(appLink);
        return dynamicLink?.link;
      } catch (e) {
        log(e);
      }
    }
    return appLink;
  }
_openAppLink
  void _openAppLink(Uri url) {
    // do anything
  }

参考になれば、幸いです!

Discussion