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

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

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

  2. เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งปลั๊กอินลิงก์แบบไดนามิกจากไดเรกทอรีรูทของโปรเจ็กต์ Flutter

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

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

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

Android

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

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

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

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

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

      applinks:example.page.link
      
    4. ในหน้าข้อมูล ให้เพิ่มประเภท URL ลงในโครงการ ตั้งค่าช่องรูปแบบ URL เป็นรหัสชุดของแอป (ตัวระบุอาจเป็น 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. ไม่บังคับ: ปิดใช้เพสบอร์ด iOS ของ Dynamic Link SDK

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

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

      หากต้องการปิดใช้การทำงานนี้ ให้แก้ไขไฟล์ 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:

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