รับลิงก์แบบไดนามิกของ Firebase ในแอป Flutter

หากต้องการรับลิงก์แบบไดนามิกของ Firebase ที่คุณสร้าง คุณต้องรวม 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 Link ให้ระบุคีย์ SHA-256 ด้วย

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

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

Android

ใน Android คุณต้องเพิ่มตัวกรอง Intent ใหม่เพื่อจับ Deep Link ของโดเมน เนื่องจาก Dynamic Link จะเปลี่ยนเส้นทางไปยังโดเมนหากมีการติดตั้งแอป คุณต้องทำเช่นนี้เพื่อให้แอป ได้รับข้อมูลลิงก์แบบไดนามิกหลังจากที่ติดตั้ง/อัปเดตจาก 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>

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

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

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

  1. สร้างบัญชีนักพัฒนาแอป Apple หากยังไม่มี

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

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

  4. ใน Xcode ให้ทำดังนี้

    1. เปิดแอปในส่วนหัวเป้าหมาย

    2. ในหน้าการลงนามและความสามารถ ให้ตรวจสอบว่าได้ลงทะเบียนทีมและตั้งค่า Provisioning Profile แล้ว

    3. ในหน้าการลงนามและความสามารถ ให้เปิดใช้โดเมนที่เชื่อมโยงและ เพิ่มรายการต่อไปนี้ลงในรายการโดเมนที่เชื่อมโยง (แทนที่ example ด้วยโดเมนของคุณ)

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

    5. หากตั้งค่าโดเมนที่กำหนดเองสำหรับโปรเจ็กต์ Firebase ให้เพิ่ม คำนำหน้า URL ของ Dynamic Link ลงในไฟล์ 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. ไม่บังคับ: ปิดใช้การใช้เพสต์บอร์ด iOS ของ Dynamic Links SDK

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

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

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

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

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

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

  1. FirebaseDynamicLinks.getInitialLink - แสดงผล Future<PendingDynamicLinkData?>
  2. FirebaseDynamicLinks.onLink - ตัวแฮนเดิลเหตุการณ์ที่แสดง Stream ซึ่งมี PendingDynamicLinkData?

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

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 getter ดังนี้

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.) หากทดสอบ Dynamic Link จากสถานะแอปที่สิ้นสุดแล้ว (เช่น มีการปัดแอปปิด)