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

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

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

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

    flutter pub add firebase_dynamic_links
    
  3. หากสร้างแอป Android ให้เปิดการตั้งค่าโปรเจ็กต์ ของคอนโซล Firebase และตรวจสอบว่าคุณได้ระบุ SHA-1 แล้ว คีย์ Signing หากคุณใช้ 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 ที่เปิดใช้ความสามารถของโดเมนที่เชื่อมโยงไว้

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

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

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

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

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

      ข้อเสียก็คือการใช้เพสบอร์ดจะทริกเกอร์ ใน iOS 14 ขึ้นไป ดังนั้น ครั้งแรกที่ผู้ใช้เปิด หาก Pasteboard มี 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 ขณะที่แอปพลิเคชันเปิดอยู่หรือในเบื้องหลัง 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) ด้วย หากทดสอบลิงก์แบบไดนามิกจากสถานะแอปที่ถูกสิ้นสุดการใช้งาน (เช่น มีการปัดแอปปิด)