簡體   English   中英

Flutter - Firebase 動態鏈接沒有被onLink捕獲但是在iOS上打開應用

[英]Flutter - Firebase Dynamic Link is not caught by onLink but open the app on iOS

在 android 上一切正常,但在 ios 上,當應用程序已經打開時,單擊鏈接會將應用程序置於前台,但不會調用onLink方法。

關聯:

https://<url>/?link=<link>&apn=<apn>&ibi=<bundle>&isi=<isi>

Package:

  • firebase_dynamic_links:^0.6.3

代碼

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

class DynamicLinksService {

  Future handleDynamicLinks(BuildContext context) async {
    final PendingDynamicLinkData data =
        await FirebaseDynamicLinks.instance.getInitialLink();

    await _handleDynamicLink(context, data);

    FirebaseDynamicLinks.instance.onLink(
        onSuccess: (PendingDynamicLinkData dynamicLinkData) async {
      await _handleDynamicLink(context, dynamicLinkData);
    }, onError: (OnLinkErrorException e) async {
      print('Dynamic link failed: ${e.message}');
    });
  }

  Future _handleDynamicLink(
      BuildContext context, PendingDynamicLinkData data) async {
    final Uri deepLink = data?.link;
    if (deepLink != null) {
      print('_handleDeepLink | deepLink $deepLink');

      await _doSomething(context, deepLink.toString());
    } else {
      print('no deepLink');
    }
  }
}

根據我的實驗,onLink 不會在 iOS 上調用,但是您可以調用 getInitialLink() 並且它將包含鏈接。 我不確定這是設計使然還是錯誤,但它似乎跨越了幾個版本。

示例服務代碼:

  Future<Uri> retrieveDynamicLink(BuildContext context) async {
    try {
      final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
      final Uri deepLink = data?.link;
      return deepLink;
    } catch (e) {
      print(e.toString());
    }

    return null;
  }

小部件片段

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }


  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
      if (state == AppLifecycleState.resumed){
        final _timerLink = Timer(
          const Duration(milliseconds: 1000),
              () async {
            final auth = Provider.of<FirebaseAuthService>(context, listen: false);
            final link = await auth.retrieveDynamicLink(context);
            _handleLink(link);
          },
        );
      }
  }

確保添加 WidgetsBindingObserver

class _SignInPageState extends State<SignInPage> with TickerProviderStateMixin, WidgetsBindingObserver{

我不確定為什么會這樣,但您首先必須至少調用FirebaseMessaging.instance.getInitialMessage()一次,然后您的onLink回調才會被 Firebase 激活。

不確定這是設計使然還是錯誤。

讓我知道這個是否奏效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM