รับ Firebase Dynamic Links ในแอป Flutter

ในการรับ Firebase Dynamic Links ที่ คุณสร้าง คุณต้องรวม Dynamic Links SDK ในแอปของคุณและเรียกเมธอด FirebaseDynamicLinks.getDynamicLink() เมื่อแอปของคุณโหลดเพื่อรับข้อมูลที่ส่งผ่านในลิงก์ไดนามิก

  1. ติดตั้งและเริ่มต้น Firebase SDK สำหรับ Flutter หากคุณยังไม่ได้ดำเนินการ

  2. จากไดเรกทอรีรากของโครงการ Flutter ให้รันคำสั่งต่อไปนี้เพื่อติดตั้งปลั๊กอิน Dynamic Links:

    flutter pub add firebase_dynamic_links
    
  3. หากคุณกำลังสร้างแอป Android ให้เปิดหน้า การตั้งค่าโครงการ ของคอนโซล Firebase และตรวจสอบว่าคุณได้ระบุคีย์การลงนาม SHA-1 แล้ว หากคุณใช้ App Links ให้ระบุคีย์ SHA-256 ของคุณด้วย

การรวมแพลตฟอร์ม

ทำตามขั้นตอนการรวมแพลตฟอร์มต่อไปนี้สำหรับแพลตฟอร์มที่คุณกำลังสร้างแอปของคุณ

แอนดรอยด์

ใน Android คุณต้องเพิ่มตัวกรองเจตนาใหม่เพื่อจับลิงก์ในรายละเอียดสำหรับโดเมนของคุณ เนื่องจากลิงก์แบบไดนามิกจะเปลี่ยนเส้นทางไปยังโดเมนของคุณหากติดตั้งแอปของคุณ สิ่งนี้จำเป็นสำหรับแอปของคุณในการรับข้อมูลลิงก์แบบไดนามิกหลังจากติดตั้ง/อัปเดตจาก Play Store และแตะหนึ่งครั้งที่ปุ่มดำเนินการต่อ ใน AndroidManifest.xml :

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:host="example.com"
        android:scheme="https"/>
</intent-filter>

เมื่อผู้ใช้เปิดลิงก์แบบไดนามิกที่มีลิงก์ในรายละเอียดไปยังโครงร่างและโฮสต์ที่คุณระบุ แอปของคุณจะเริ่มกิจกรรมด้วยตัวกรองความตั้งใจนี้เพื่อจัดการลิงก์

ขั้นตอนต่อไปคือการตรวจสอบว่ามีการลงทะเบียนลายนิ้วมือ SHA-256 ของใบรับรองการลงนามในคอนโซล Firebase สำหรับแอป คุณสามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีดึงลายนิ้วมือ SHA-256 ของคุณได้ที่หน้า การตรวจสอบลูกค้าของคุณ

แพลตฟอร์มของ Apple

  1. สร้างบัญชีนักพัฒนา Apple หากคุณยังไม่มี

  2. ในหน้า การตั้งค่าโปรเจ็กต์ ของคอนโซล Firebase ตรวจสอบให้แน่ใจว่าแอป iOS ได้รับการกำหนดค่าอย่างถูกต้องด้วย App Store ID และ Team ID

  3. บนไซต์ Apple Developer ให้สร้างโปรไฟล์การจัดเตรียมสำหรับแอปของคุณโดยเปิดใช้งานความสามารถ Associated Domain

  4. ใน Xcode ให้ทำดังต่อไปนี้:

    1. เปิดแอปของคุณภายใต้หัวข้อ TARGETS

    2. ในหน้า Signing & Capabilities ตรวจสอบให้แน่ใจว่าทีมของคุณลงทะเบียนแล้ว และตั้งค่าโปรไฟล์การจัดสรรของคุณแล้ว

    3. ในหน้า Signing & Capabilities ให้เปิดใช้งาน Associated Domains และเพิ่มสิ่งต่อไปนี้ลงในรายการ Associated Domains (แทนที่ตัวอย่างด้วยโดเมนของคุณ):

      applinks:example.page.link
      
    4. ในหน้าข้อมูล ให้เพิ่มประเภท URL ในโครงการของคุณ ตั้งค่าช่อง URL Schemes เป็น ID Bundle ของแอป (ตัวระบุสามารถเป็น Bundle ID หรืออะไรก็ตามที่คุณต้องการ)

    5. หากคุณตั้งค่าโดเมนที่กำหนดเองสำหรับโครงการ Firebase ให้เพิ่มคำนำหน้า URL ลิงก์แบบไดนามิกในไฟล์ Info.plist ของโครงการ iOS โดยใช้คีย์ FirebaseDynamicLinksCustomDomains

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      <key>FirebaseDynamicLinksCustomDomains</key>
      <array>
          <string>https://custom.domain.io/path1</string>
          <string>https://custom.domain.io/path2</string>
      </array>
      
      ...other settings
      
      </dict>
      </plist>
      
    6. ทางเลือก: ปิดใช้งานไดนามิกลิงก์ SDK ของ iOS เพสต์บอร์ด

      ตามค่าเริ่มต้น SDK ลิงก์แบบไดนามิกจะใช้เพสต์บอร์ดเพื่อปรับปรุงความน่าเชื่อถือของลิงก์ในรายละเอียดหลังการติดตั้ง เมื่อใช้เพสต์บอร์ด ไดนามิกลิงก์จะช่วยให้แน่ใจว่าเมื่อผู้ใช้เปิดไดนามิกลิงก์แต่จำเป็นต้องติดตั้งแอปของคุณก่อน ผู้ใช้สามารถไปยังเนื้อหาที่ลิงก์ดั้งเดิมได้ทันทีเมื่อเปิดแอปเป็นครั้งแรกหลังการติดตั้ง

      ข้อเสียคือการใช้เพสต์บอร์ดทริกเกอร์การแจ้งเตือนบน iOS 14 และใหม่กว่า ดังนั้น ในครั้งแรกที่ผู้ใช้เปิดแอปของคุณ หากเพสต์บอร์ดมี URL ลิงก์แบบไดนามิก พวกเขาจะเห็นการแจ้งเตือนว่าแอปของคุณเข้าถึงเพสต์บอร์ด ซึ่งอาจทำให้เกิดความสับสน

      หากต้องการปิดใช้งานลักษณะการทำงานนี้ ให้แก้ไขไฟล์ Info.plist ของโปรเจ็กต์ Xcode และตั้งค่าคีย์ FirebaseDeepLinkPasteboardRetrievalEnabled เป็น NO

ในการจัดการลิงก์แบบไดนามิกในแอปพลิเคชันของคุณ จำเป็นต้องดำเนินการสองสถานการณ์

สถานะสิ้นสุด

ตั้งค่าวิธีการต่อไปนี้:

  1. FirebaseDynamicLinks.getInitialLink - ส่งคืน Future<PendingDynamicLinkData?>
  2. FirebaseDynamicLinks.onLink - ตัวจัดการเหตุการณ์ที่ส่งคืน Stream ที่มี PendingDynamicLinkData?

Android จะได้รับลิงก์ผ่าน FirebaseDynamicLinks.getInitialLink จากสถานะสิ้นสุดเสมอ แต่ใน iOS จะไม่รับประกัน ดังนั้นจึงควรตั้งค่าทั้งสองตามลำดับต่อไปนี้เพื่อให้แน่ใจว่าแอปพลิเคชันของคุณได้รับลิงก์:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseConfig.platformOptions);

  // Check if you received the link via `getInitialLink` first
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  if (initialLink != null) {
    final Uri deepLink = initialLink.link;
    // Example of using the dynamic link to push the user to a different screen
    Navigator.pushNamed(context, deepLink.path);
  }

  FirebaseDynamicLinks.instance.onLink.listen(
        (pendingDynamicLinkData) {
          // Set up the `onLink` event listener next as it may be received here
          if (pendingDynamicLinkData != null) {
            final Uri deepLink = pendingDynamicLinkData.link;
            // Example of using the dynamic link to push the user to a different screen
            Navigator.pushNamed(context, deepLink.path);
          }
        },
      );

  runApp(MyApp(initialLink));
}

ภายในลอจิกแอปพลิเคชันของคุณ คุณสามารถตรวจสอบว่าลิงก์ได้รับการจัดการและดำเนินการหรือไม่ ตัวอย่างเช่น:

if (initialLink != null) {
  final Uri deepLink = initialLink.link;
  // Example of using the dynamic link to push the user to a different screen
  Navigator.pushNamed(context, deepLink.path);
}

พื้นหลัง / สถานะเบื้องหน้า

ในขณะที่แอปพลิเคชันเปิดอยู่หรือในพื้นหลัง ให้ใช้ตัวรับ FirebaseDynamicLinks.onLink :

FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
  Navigator.pushNamed(context, dynamicLinkData.link.path);
}).onError((error) {
  // Handle errors
});

อีกทางหนึ่ง หากคุณต้องการระบุว่ามีการใช้ลิงก์ไดนามิกในการเปิดแอปพลิเคชันหรือไม่ ให้ส่งต่อไปยังเมธอด getDynamicLink แทน:

String link = 'https://dynamic-link-domain/ke2Qa';

final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getDynamicLink(Uri.parse(link));

หากต้องการทดสอบลิงก์แบบไดนามิกบน iOS คุณต้องใช้อุปกรณ์จริง คุณจะต้องเรียกใช้แอปในโหมดเผยแพร่ (เช่น flutter run --release .) หากทดสอบลิงก์แบบไดนามิกจากสถานะแอปที่ยกเลิก (เช่น แอปถูกปัดปิดแล้ว)