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

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

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

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

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

บูรณาการแพลตฟอร์ม

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

หุ่นยนต์

บน 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>

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

ขั้นตอนต่อไปคือตรวจสอบให้แน่ใจว่าลายนิ้วมือ 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. ในหน้าการลงนามและความสามารถ ตรวจสอบให้แน่ใจว่าทีมของคุณลงทะเบียนแล้ว และโปรไฟล์การจัดเตรียมของคุณได้รับการตั้งค่าแล้ว

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

      applinks:example.page.link
      
    4. ในหน้าข้อมูล ให้เพิ่มประเภท URL ให้กับโครงการของคุณ ตั้งค่าฟิลด์ Schemes 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 Links SDK

      ตามค่าเริ่มต้น Dynamic Links 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 คุณจะต้องใช้อุปกรณ์จริง คุณจะต้องเรียกใช้แอปในโหมด release (เช่น flutter run --release ) หากทดสอบลิงก์แบบไดนามิกจากสถานะแอปที่ถูกยกเลิก (เช่น แอปถูกปัดปิด)