เพิ่มตัวกรอง Intent สำหรับ App Link

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

  1. เพิ่มตัวกรอง Intent อย่างน้อย 1 รายการลงในไฟล์ Manifest ของแอปที่ระบุโดเมนหรือ URL ของเว็บไซต์
  2. เพิ่ม autoVerify="true"attribute ลงในองค์ประกอบตัวกรอง Intent ซึ่งจะส่งสัญญาณไปยังระบบว่าควรพยายามยืนยันสคีมและโดเมนโฮสต์กับข้อมูลการกำหนดค่า assetlinks.json ของเว็บไซต์
  3. ประกาศการเชื่อมโยงเว็บไซต์

ต่อไปนี้เป็นตัวอย่างการประกาศ App Link ที่มีสคีมและโฮสต์ รวมถึง well as autoVerify="true":

<activity
    android:name=".MainActivity"
    android:exported="true"
    ...>
    <!-- Make sure you explicitly set android:autoVerify to "true". -->
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <!-- If a user clicks on a link that uses the "http" scheme, your
             app should be able to delegate that traffic to "https". -->
        <!-- Do not include other schemes, as this will prevent verification. -->
        <data android:scheme="http" />
        <data android:scheme="https" />

        <!-- Include one or more domains that should be verified. -->
        <data android:host="www.example.com" />
        <data android:host="*.example.com" />
    </intent-filter>
</activity>

ประเด็นสำคัญเกี่ยวกับโค้ด

  • AutoVerify: ต้องระบุแอตทริบิวต์ android:autoVerify="true" สำหรับ App Links ซึ่งจะส่งสัญญาณไปยังระบบว่าควรพยายามยืนยัน การเชื่อมโยงระหว่างแอปกับสคีมาและโดเมนที่ระบุใน <data>แท็ก เราขอแนะนำให้เพิ่ม autoVerify="true" ลงในตัวกรอง Intent ทุกรายการที่คุณต้องการให้ยืนยันได้
  • องค์ประกอบข้อมูล: ตัวกรอง Intent ของ App Link แต่ละรายการต้องมีองค์ประกอบ <data>อย่างน้อย 1 รายการที่ระบุสคีมและรูปแบบโฮสต์ที่ตรงกับโดเมนเว็บไซต์ที่ ยืนยันได้
  • สคีม: ตัวกรอง Intent ต้องมีองค์ประกอบ <data> สำหรับ http และ https สคีม
  • โฮสต์: คุณสามารถเพิ่มองค์ประกอบ <data> เพื่อให้ตรงกับ โฮสต์อย่างน้อย 1 รายการได้โดยไม่บังคับ ใช้ไวลด์การ์ด (*) เพื่อให้ตรงกับโดเมนย่อยหลายรายการ (เช่น *.example.com) ระบบจะพยายามยืนยันโฮสต์แต่ละรายการกับ ไฟล์ assetlinks.json ในเว็บไซต์ โปรดทราบว่าการกำหนดเส้นทางระดับเส้นทางควรจัดการโดยไฟล์ assetlinks.json (ดูส่วนแนวทางปฏิบัติแนะนำด้านล่าง)

  • โฮสต์หลายรายการ: หากคุณประกาศโดเมนโฮสต์หลายรายการ ระบบ (ใน Android 12 ขึ้นไป) จะพยายามยืนยันโดเมนโฮสต์แต่ละรายการ หากมีการยืนยันโฮสต์ แอปจะกลายเป็นตัวแฮนเดิลเริ่มต้นสำหรับลิงก์จากโฮสต์ที่ยืนยันแล้ว ใน Android 11 และต่ำกว่า การยืนยันจะล้มเหลวหากยืนยันโฮสต์อย่างน้อย 1 รายการไม่ได้

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

ข้อควรพิจารณาสำหรับกฎตัวกรอง Manifest

หากคุณตั้งค่าตัวกรองเพื่อใช้กับ App Link แบบไดนามิกใน Android 15 ขึ้นไป โปรดทราบว่ากฎแบบไดนามิกที่ประกาศไว้ในไฟล์ assetlinks.json ฝั่งเซิร์ฟเวอร์ไม่สามารถขยายขอบเขตของกฎ URL ที่คุณประกาศแบบคงที่ในไฟล์ Manifest ของแอป

ด้วยเหตุนี้ เราจึงแนะนำให้ใช้วิธีการต่อไปนี้

  • กำหนดขอบเขตที่กว้างที่สุดเท่าที่จะเป็นไปได้ในไฟล์ Manifest ของแอป เช่น การประกาศสคีมและโดเมนเท่านั้น
  • ใช้กฎ assetlinks.json ฝั่งเซิร์ฟเวอร์เพื่อปรับแต่งเพิ่มเติม เช่น การกำหนดเส้นทางระดับเส้นทาง

การกำหนดค่าที่เหมาะสมนี้จะช่วยให้คุณเพิ่มเส้นทาง App Link ใหม่แบบไดนามิกในไฟล์ assetlinks.json ได้ตามต้องการ โดยมั่นใจได้ว่าเส้นทางดังกล่าวจะอยู่ในขอบเขตกว้างที่คุณกำหนดไว้ในไฟล์ Manifest ของแอป

รองรับ App Link สำหรับโฮสต์หลายรายการ

ระบบต้องยืนยันโฮสต์ที่ระบุในองค์ประกอบข้อมูลของตัวกรอง Intent ของ URL ของแอปกับไฟล์ลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ที่โฮสต์ในโดเมนเว็บที่เกี่ยวข้องในตัวกรอง Intent นั้นได้ หากการยืนยันไม่สำเร็จ ระบบจะกลับไปใช้ลักษณะการทำงานมาตรฐานเพื่อแก้ไข Intent ตามที่อธิบายไว้ในสร้าง Deep Link ไปยังเนื้อหาแอป อย่างไรก็ตาม แอปจะยังคง ได้รับการยืนยันเป็นตัวแฮนเดิลเริ่มต้นสำหรับรูปแบบ URL ใดก็ตามที่กำหนดไว้ใน ตัวกรอง Intent อื่นๆ ของแอป

ตัวอย่างเช่น แอปที่มีตัวกรอง Intent ต่อไปนี้จะผ่านการยืนยัน สำหรับ https://www.example.com เท่านั้น หากพบไฟล์ assetlinks.json ที่ https://www.example.com/.well-known/assetlinks.json แต่ไม่พบที่ https://www.example.net/.well-known/assetlinks.json

<application>

  <activity android:name="MainActivity">
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="http" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
    </intent-filter>
  </activity>
  <activity android:name="SecondActivity">
    <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:scheme="https" />
     <data android:host="www.example.net" />
    </intent-filter>
  </activity>

</application>

รองรับการลิงก์แอปสำหรับโดเมนย่อยหลายรายการ

โปรโตคอลลิงก์เนื้อหาดิจิทัล (Digital Asset Links) จะถือว่าโดเมนย่อยในตัวกรอง Intent เป็นโฮสต์ที่ไม่ซ้ำกันและแยกกัน ดังนั้น หากตัวกรอง Intent แสดงโฮสต์หลายรายการที่มีโดเมนย่อยต่างๆ คุณต้องเผยแพร่ assetlinks.json ที่ถูกต้องในแต่ละโดเมน ตัวอย่างเช่น ตัวกรอง Intent ต่อไปนี้มี www.example.com และ mobile.example.com เป็นโฮสต์ URL ของ Intent ที่ยอมรับ ดังนั้น คุณต้องเผยแพร่ assetlinks.json ที่ถูกต้องทั้งที่ https://www.example.com/.well-known/assetlinks.json และ https://mobile.example.com/.well-known/assetlinks.json

<application>
  <activity android:name="MainActivity">
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="https" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
      <data android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

หรือหากคุณประกาศชื่อโฮสต์ด้วยไวลด์การ์ด (เช่น *.example.com) คุณต้องเผยแพร่ไฟล์ assetlinks.json ที่ชื่อโฮสต์ระดับรูท (example.com) ตัวอย่างเช่น แอปที่มีตัวกรอง Intent ต่อไปนี้จะผ่านการยืนยันสำหรับชื่อย่อยของ example.com (เช่น foo.example.com) ตราบใดที่เผยแพร่ไฟล์ assetlinks.json ที่ https://example.com/.well-known/assetlinks.json

<application>
  <activity android:name="MainActivity">
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="https" />
      <data android:host="*.example.com" />
    </intent-filter>
  </activity>
</application>

ตรวจสอบแอปหลายรายการที่เชื่อมโยงกับโดเมนเดียวกัน

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

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

ฟีเจอร์ App Link แบบไดนามิก ซึ่งรวมถึงกฎการจับคู่ขั้นสูงใน assetlinks.json และการใช้ <uri-relative-filter-group> ได้รับการรองรับอย่างเต็มที่ใน Android 15 (ระดับ API 35) ขึ้นไปเท่านั้น

ใน Android 14 (ระดับ API 34) และต่ำกว่า ระบบจะพิจารณาเฉพาะ scheme และ host ที่ประกาศไว้ในองค์ประกอบ <data> ของไฟล์ Manifest สำหรับการยืนยัน App Link ระบบจะไม่ใช้กฎ การยกเว้น และการอัปเดตแบบไดนามิกที่เฉพาะเจาะจงเส้นทางจาก assetlinks.json

ซึ่งหมายความว่าหากไฟล์ Manifest ระบุเฉพาะ scheme และ host แอปของคุณอาจจับเส้นทางทั้งหมดสำหรับโดเมนที่ยืนยันแล้วใน Android 14 และต่ำกว่าโดยไม่คาดคิด ไม่ว่ากฎที่เฉพาะเจาะจงเส้นทางที่กำหนดไว้ใน assetlinks.json สำหรับ Android 15 ขึ้นไปจะเป็นอย่างไร

หากต้องการป้องกันไม่ให้แอปจัดการลิงก์ทั้งหมดสำหรับโดเมนใน Android 14 และต่ำกว่าเมื่อคุณต้องการใช้ App Link แบบไดนามิกสำหรับเส้นทางที่เฉพาะเจาะจงมากขึ้นใน Android 15 ขึ้นไป ให้ใส่เส้นทางที่ไม่ตรงกันในตัวกรอง Intent ของไฟล์ Manifest เพิ่มองค์ประกอบ <data> ที่มีแอตทริบิวต์ android:path ซึ่งไม่น่าจะเป็น เส้นทางที่ถูกต้องสำหรับลิงก์ของคุณ วิธีนี้จะช่วยให้มั่นใจได้ว่าตัวกรอง Intent จะไม่ตรงกับเส้นทางทั้งหมดในเวอร์ชันต่ำกว่า

ตัวอย่าง

<activity
    android:name=".MainActivity"
    android:exported="true"
    ...>
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:host="www.example.com" />

        <!-- Add a non-matching path for backward compatibility -->
        <data android:path="/no_match_for_older_android_versions" />

        <uri-relative-filter-group android:allow="true">
          <data android:pathPattern="/.*"/>
        </uri-relative-filter-group>
    </intent-filter>
</activity>

การเพิ่ม <data android:path="/no_match_for_older_android_versions" /> จะช่วยให้มั่นใจได้ว่าใน Android 14 และต่ำกว่า ตัวกรอง Intent นี้จะไม่ตรงกับลิงก์ขาเข้าใดๆ ขณะที่ยังคงอนุญาตให้ยืนยันโดเมนเพื่อใช้กับ App Link แบบไดนามิกใน Android 15 ขึ้นไปตามกฎการจับคู่ขั้นสูงในกฎ assetlinks.json

หากคุณมี App Link ที่มีกฎเส้นทางที่เฉพาะเจาะจง (เช่น android:pathPrefix) ในไฟล์ Manifest อยู่แล้วและต้องการเริ่มใช้ App Link แบบไดนามิก ใน Android 15 ขึ้นไป คุณสามารถเพิ่มองค์ประกอบ <uri-relative-filter-group> ลงในตัวกรอง Intent ที่มีอยู่ได้อย่างปลอดภัย

เนื่องจาก Android 14 และต่ำกว่าจะละเว้นองค์ประกอบ <uri-relative-filter-group> App Link ที่มีอยู่จะยังคงทำงานเหมือนเดิมในอุปกรณ์ ที่ใช้ Android เวอร์ชันต่ำกว่า

อย่างไรก็ตาม คุณต้องพิจารณาอย่างรอบคอบว่า Android 15 ขึ้นไปจะประเมินการกำหนดค่า "แบบผสม" อย่างไร

  • การกรอง 2 ชั้น: ใน Android 15 ขึ้นไป ระบบจะประเมินตัวกรอง Intent เป็นการรวมกัน URL จะผ่านการตรวจสอบไฟล์ Manifest หากเป็นไปตาม แท็กแบบคงที่เดิม <data> หรือกฎกว้างๆ ใน <uri-relative-filter-group> เมื่อ URL ผ่านการตรวจสอบไฟล์ Manifest เริ่มต้นนี้แล้ว ระบบจะใช้กฎแบบไดนามิกที่กำหนดไว้ในไฟล์ assetlinks.json เป็นการกรองแบบละเอียดชั้นที่ 2 ซึ่งหมายความว่ากฎ JSON ฝั่งเซิร์ฟเวอร์จะเป็นตัวกำหนดว่า URL ที่ตรงกันใดจะเปิดแอป

ตัวอย่างการกำหนดค่าแบบไฮบริด:

<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="https" />
    <data android:host="www.example.com" />

    <!-- Legacy rule: Android 14 and lower use this. Android 15 and higher
         also use this. -->
    <data android:pathPrefix="/store" />

    <!--
      Dynamic rule: Android 14 and lower ignore this. Android 15 and higher
      evaluate this as a union between all paths and the configuration
      specified in the assetlinks.json file. Make sure to apply further
      refinements in the assetlinks.json file to prevent all URL paths from
      opening in the app.
    -->
    <uri-relative-filter-group android:allow="true">
        <data android:pathPrefix="/" />
    </uri-relative-filter-group>
</intent-filter>