สร้าง Deep Link

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

คู่มือนี้อธิบายวิธีการทำงานของ Deep Link รวมถึงวิธีสร้างและทดสอบ Deep Link ไปยังเนื้อหาของคุณ

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

วิธีการทำงานของการทำ Deep Link

Deep Link เป็นความสามารถของระบบทั่วไปของ Android ซึ่งรองรับในทุกเวอร์ชันและทุกอุปกรณ์ โดยจะใช้ประโยชน์จากระบบ Intent ของ Android เพื่อ กำหนดเส้นทาง Deep Link ไปยังแอปที่สนใจ แอปที่ต้องการจัดการ URI ของ Deep Link ที่เฉพาะเจาะจงจะประกาศตัวกรอง Intent ที่ตรงกันในไฟล์ Manifest ของแอป

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

  1. เปิดแอปเริ่มต้นของผู้ใช้ที่สามารถจัดการ URI ได้ หากมีการกำหนดไว้
  2. เปิดแอปเดียวที่พร้อมใช้งานซึ่งจัดการ URI ได้
  3. อนุญาตให้ผู้ใช้เลือกแอปจากกล่องโต้ตอบการแยกความกำกวม

ซึ่งหมายความว่าแม้ว่าตัวกรอง Intent จะตรงกับ URI ที่ระบุ แต่ก็ไม่มี การรับประกันว่าระบบจะกำหนดเส้นทาง Intent ของ Deep Link ไปยังแอปของคุณ ผู้ใช้มี บทบาทสำคัญในการจัดการแอปที่จัดการ Intent ซึ่งช่วยให้ผู้ใช้ ควบคุมและมีตัวเลือก หากต้องการควบคุม Deep Link ไปยังเว็บไซต์และโดเมนของคุณเองได้มากขึ้น ให้ลองใช้ App Link

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

รูปที่ 1 กล่องโต้ตอบการแยกความกำกวม

ลักษณะการทำงานของกล่องโต้ตอบการแยกความกำกวมมีการเปลี่ยนแปลงใน Android เวอร์ชันต่างๆ ตัวอย่างเช่น ใน Android 12 ขึ้นไป โดยทั่วไปแล้ว ลิงก์เว็บที่ไม่ได้ยืนยัน App Link จะเปิดในเว็บเบราว์เซอร์โดยค่าเริ่มต้น ในขณะที่ในเวอร์ชันก่อนหน้า กล่องโต้ตอบที่มีคำอธิบายอาจปรากฏขึ้นหากแอปจัดการลิงก์เว็บได้

หมายเหตุ: ตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป Intent เว็บทั่วไปจะเปลี่ยนเส้นทาง ไปยังกิจกรรมในแอปของคุณก็ต่อเมื่อแอปได้รับอนุมัติสำหรับโดเมนที่เฉพาะเจาะจง ซึ่งอยู่ใน Intent เว็บนั้น หากแอปไม่ได้รับอนุมัติสำหรับโดเมนนั้น Web Intent จะเปลี่ยนเส้นทางไปยังแอปเบราว์เซอร์เริ่มต้นของผู้ใช้แทน

ประเภทของ Deep Link

คุณรองรับ Deep Link ได้ 3 ประเภทใน Android ดังนี้

  • Deep Link ที่กำหนดเอง: Deep Link เหล่านี้ใช้รูปแบบ URI ที่กำหนดเอง (เช่น example://products/123) เพื่อนำผู้ใช้ไปยังเนื้อหาที่เฉพาะเจาะจงภายในแอปโดยตรง Deep Link เหล่านี้มีประสิทธิภาพสำหรับการนำทางภายในหรือลิงก์จากแหล่งที่มาที่คุณควบคุม แต่ไม่ใช่เว็บลิงก์มาตรฐานและยังคงทริกเกอร์กล่องโต้ตอบการแยกความกำกวมได้หากแอปอื่นลงทะเบียนรูปแบบที่กำหนดเองเดียวกัน
  • ลิงก์เว็บ: เป็น Deep Link ที่ใช้รูปแบบ http และ https มาตรฐาน URL เหล่านี้มีความหลากหลายมากกว่าเนื่องจากเป็น URL มาตรฐาน แต่ใน Android 12 ขึ้นไป URL เหล่านี้จะทําให้เกิดกล่องโต้ตอบการแยกความกำกวมเกือบทุกครั้ง ซึ่งหมายความว่ามีแนวโน้มที่เบราว์เซอร์ของผู้ใช้จะจัดการ URL เหล่านี้โดยค่าเริ่มต้น แทนที่จะกำหนดเส้นทางไปยังแอปของคุณ
  • App Link: พร้อมใช้งานตั้งแต่ Android 6.0 (API ระดับ 23) เป็นต้นไป ซึ่งเป็นลิงก์เว็บที่ยืนยันแล้ว คุณสามารถพิสูจน์ให้ระบบ Android ทราบว่าคุณเป็นเจ้าของโดเมนผ่านกระบวนการเชื่อมโยงเว็บไซต์ เมื่อยืนยันแล้ว ระบบ จะกำหนดเส้นทางลิงก์สำหรับโดเมนนั้นไปยังแอปของคุณโดยอัตโนมัติ โดยไม่ต้องแสดง กล่องโต้ตอบที่มีคำอธิบาย ซึ่งจะช่วยสร้างประสบการณ์การใช้งานที่ราบรื่นและเชื่อถือได้ สำหรับผู้ใช้

เพิ่มตัวกรอง Intent สำหรับลิงก์ขาเข้า

หากต้องการสร้างลิงก์ไปยังเนื้อหาแอป ให้เพิ่มตัวกรอง Intent ที่มีองค์ประกอบและค่าแอตทริบิวต์ต่อไปนี้ในไฟล์ Manifest

<action>

ระบุการดำเนินการผ่าน Intent ของ ACTION_VIEW เพื่อให้เข้าถึงตัวกรอง Intent ได้จาก Google Search

<data>

เพิ่มแท็ก <data> อย่างน้อย 1 รายการ ซึ่งแต่ละแท็กแสดงรูปแบบ URI ที่ เปลี่ยนเส้นทางไปยังกิจกรรม แท็ก <data> ต้องมีแอตทริบิวต์ android:scheme เป็นอย่างน้อย

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

<category>

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

รวมถึงหมวดหมู่ DEFAULT ด้วย ซึ่งช่วยให้แอปตอบสนองต่อ Implicit Intent ได้ หากไม่มีการระบุชื่อคอมโพเนนต์ของแอปใน Intent จะเริ่มกิจกรรมได้ก็ต่อเมื่อมีการระบุชื่อคอมโพเนนต์ของแอปใน Intent เท่านั้น

ข้อมูลโค้ด XML ต่อไปนี้แสดงวิธีระบุตัวกรอง Intent ใน ไฟล์ Manifest สำหรับ Deep Link URI "example://gizmos" และ "http://www.example.com/gizmos" ทั้ง 2 รายการจะเปลี่ยนเส้นทางไปยังกิจกรรมนี้

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

โปรดทราบว่าตัวกรอง Intent ทั้ง 2 รายการแตกต่างกันเฉพาะองค์ประกอบ <data> แม้ว่าคุณจะรวมองค์ประกอบ <data> หลายรายการไว้ในตัวกรองเดียวกันได้ แต่คุณควรสร้างตัวกรองแยกต่างหากเมื่อต้องการประกาศ URL ที่ไม่ซ้ำกัน (เช่น การผสมผสานระหว่าง scheme และ host) เนื่องจากองค์ประกอบ <data> หลายรายการในตัวกรอง Intent เดียวกันจะผสานรวมกันเพื่อพิจารณาการเปลี่ยนแปลงทั้งหมดของแอตทริบิวต์ที่รวมกัน ตัวอย่างเช่น โปรดพิจารณาสิ่งต่อไปนี้

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

ดูเหมือนว่าฟีเจอร์นี้จะรองรับเฉพาะ https://www.example.com และ app://open.my.app แต่จริงๆ แล้วฟีเจอร์นี้รองรับทั้ง 2 อย่าง รวมถึงรายการต่อไปนี้ app://www.example.com และ https://open.my.app

ข้อควรระวัง: หากกิจกรรมหลายรายการมีตัวกรอง Intent ที่เชื่อมโยงกับ Android App Link ที่ยืนยันแล้วเดียวกัน จะไม่มีการรับประกันว่ากิจกรรมใดจะจัดการลิงก์

เมื่อเพิ่มตัวกรอง Intent ที่มี URI สำหรับเนื้อหากิจกรรมลงในไฟล์ Manifest ของแอปแล้ว Android จะกำหนดเส้นทาง Intent ที่มี URI ตรงกันไปยังแอปของคุณได้ ในขณะรันไทม์

ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดตัวกรอง Intent ได้ที่อนุญาตให้แอปอื่นๆ เริ่มกิจกรรมของคุณ

อ่านข้อมูลจาก Intent ขาเข้า

เมื่อระบบเริ่มกิจกรรมผ่านตัวกรอง Intent คุณจะใช้ข้อมูล ที่ได้รับจาก Intent เพื่อพิจารณาว่าคุณต้องแสดงผลอะไร เรียกใช้เมธอด getData() และ getAction() เพื่อดึงข้อมูลและ การดำเนินการที่เชื่อมโยงกับ Intent ที่เข้ามา คุณเรียกใช้เมธอดเหล่านี้ได้ทุกเมื่อในวงจรของกิจกรรม แต่โดยทั่วไปแล้วคุณควรเรียกใช้ในระหว่างการเรียกกลับช่วงแรกๆ เช่น onCreate() หรือ onStart

ต่อไปนี้คือข้อมูลโค้ดที่แสดงวิธีดึงข้อมูลจาก Intent

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

ทำตามแนวทางปฏิบัติแนะนำต่อไปนี้เพื่อปรับปรุงประสบการณ์ของผู้ใช้

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

ทดสอบ Deep Link

คุณสามารถใช้ Android Debug Bridge กับเครื่องมือ Activity Manager (am) เพื่อทดสอบว่า URI ของตัวกรอง Intent ที่คุณระบุสำหรับ Deep Link จะเปลี่ยนเส้นทางไปยัง กิจกรรมของแอปที่ถูกต้อง คุณเรียกใช้คำสั่ง adb กับอุปกรณ์หรือ โปรแกรมจำลองได้

ไวยากรณ์ทั่วไปสำหรับการทดสอบ URI ของตัวกรอง Intent ด้วย adb มีดังนี้

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

ตัวอย่างเช่น คำสั่งต่อไปนี้จะพยายามดูกิจกรรมของแอปเป้าหมายที่ เชื่อมโยงกับ URI ที่ระบุ

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

หมายเหตุ: เมื่อกำหนดคอลเล็กชันของประเภทดั้งเดิมในเส้นทาง เช่น **@Serializable data class Product(val colors: List)** รูปแบบ URL ของ Deep Link ที่สร้างขึ้นโดยอัตโนมัติ คือ **basePath?colors={value**} หากพยายาม ระบุ URI ที่มีพารามิเตอร์การค้นหาหลายรายการ (เช่น **basepath?colors=red&colors=blue**) คุณต้องหลีกเลี่ยงเครื่องหมายแอมเพอร์แซนด์ (เช่น **basepath?colors=red\&colors=blue**)

ประกาศเกี่ยวกับไฟล์ Manifest และตัวแฮนเดิล Intent ที่คุณตั้งค่าจะกำหนดการเชื่อมต่อ ระหว่างแอปกับเว็บไซต์ รวมถึงสิ่งที่ต้องทำกับลิงก์ขาเข้า อย่างไรก็ตาม หากต้องการให้ระบบถือว่าแอปของคุณเป็นตัวแฮนเดิลเริ่มต้นสำหรับชุด URI คุณต้องขอให้ระบบยืนยันการเชื่อมต่อนี้ด้วย ยืนยัน App Link อธิบายวิธีใช้การยืนยันนี้

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Intent และ App Link ได้ที่แหล่งข้อมูลต่อไปนี้