التحقّق من روابط تطبيقات Android

رابط تطبيق Android هو نوع خاص من الروابط لمواضع معيّنة يسمح بعناوين URL لموقعك الإلكتروني لفتح المحتوى المعني في تطبيق Android على الفور، وبدون التي تتطلب من المستخدم اختيار التطبيق. تستخدم ميزة Android App Links مادة العرض الرقمية. Attribution API لإثبات الثقة يشير إلى أنّ تطبيقك قد وافق عليه الموقع الإلكتروني لفتح روابطه تلقائيًا هذا المجال. إذا أثبت النظام ملكية عناوين URL بنجاح، سيتم تلقائيًا بتوجيه أهداف عنوان URL هذه إلى تطبيقك.

لإثبات ملكيتك لعنوان URL لكل من التطبيق والموقع الإلكتروني، أكمِل الخطوات التالية:

  1. إضافة فلاتر الأهداف التي تحتوي على autoVerify . ترسل هذه السمة إشارة إلى النظام بضرورة التحقق مما إذا كان ينتمي تطبيقك إلى نطاقات عناوين URL المستخدَمة في فلاتر الأهداف.

  2. توضيح الرابط بين موقعك الإلكتروني وهدفك عن طريق استضافة ملف روابط التنقل إلى مواد العرض الرقمية بتنسيق JSON في الموقع التالي:

    https://domain.name/.well-known/assetlinks.json

يمكنك العثور على معلومات ذات صلة في المراجع التالية:

إضافة فلاتر الأهداف للتحقّق من روابط التطبيقات

لتفعيل ميزة التحقّق من الروابط في تطبيقك، أضِف فلاتر أهداف مطابقة. بالتنسيق التالي:

<!-- 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 shared link that uses the "http" scheme, your
         app should be able to delegate that traffic to "https". -->
    <data android:scheme="http" />
    <data android:scheme="https" />

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

على الرغم من أنّ تضمين autoVerify في سمة <intent-filter> واحدة فقط كافٍ. لكل مضيف، حتى إذا تم استخدام هذا المضيف عبر بصيغتي، ننصحك بإضافة autoVerify إلى كل <intent-filter> من أجل الاتساق. يضمن ذلك أيضًا أن يظل تطبيقك مرتبطًا بجميع النطاقات التي تحدّدها بعد إزالة العناصر أو إعادة تنظيمها في ملف البيان.

تتطلب عملية إثبات ملكية النطاق اتصالاً بالإنترنت وقد تستغرق بعض الوقت لإنجازها. للمساعدة في تحسين كفاءة هذه العملية، يستخدم النظام إثبات ملكية نطاق لتطبيق يستهدف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث فقط إذا كان هذا النطاق داخل عنصر <intent-filter> يحتوي على بالتنسيق ذاته المحدد في مقتطف الرمز السابق.

إتاحة ربط التطبيقات لمضيفين متعددين

يجب أن يتمكّن النظام من التحقّق من المضيف المحدّد في بيانات فلاتر الأهداف في عناوين URL الخاصة بالتطبيق. العناصر مقابل ملفات "روابط مواد العرض الرقمية" المستضافة على نطاقات الويب المعنيّة في تلك فلتر الأهداف. وفي حال تعذُّر إثبات الملكية، يعود النظام إلى السلوك العادي تلقائيًا. لحل الهدف، كما هو موضح في إنشاء روابط لصفحات معيّنة في محتوى التطبيق: ومع ذلك، لا يزال من الممكن إثبات ملكية التطبيق كمعالج تلقائي. لأي من أنماط عناوين URL المحددة في فلاتر الأهداف الأخرى للتطبيق.

ملاحظة: في نظام التشغيل Android 11 (المستوى 30 لواجهة برمجة التطبيقات) والإصدارات الأقدم، يبدأ النظام لا يتحقّق من تطبيقك كمعالج تلقائي ما لم يعثر على نسخة مطابقة ملف "روابط مواد العرض الرقمية" لجميع المضيفين الذين تحدّدهم في البيان.

على سبيل المثال، تطبيق الغرض التالي ستجتاز الفلاتر عملية التحقق فقط للحساب 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>

ملاحظة: كل عناصر <data> في فلتر الأهداف نفسه معًا لتتناسب مع جميع أشكال سماتها المدمجة. على سبيل المثال، يتضمّن فلتر الأهداف الأولى أعلاه عنصرًا <data> يعرِّف فقط نظام HTTPS. ولكن يتم دمجه مع عنصر <data> الآخر بحيث تكون يتوافق الفلتر مع كل من http://www.example.com وhttps://www.example.com. على هذا النحو، يجب إنشاء فلاتر أهداف منفصلة عندما تريد تحديد تركيبات معيّنة. مخططات ونطاقات معرف الموارد المنتظم (URI).

إتاحة ربط التطبيقات لعدة نطاقات فرعية

يتعامل بروتوكول "روابط مواد العرض الرقمية" مع النطاقات الفرعية في فلاتر الأهداف على أنّها فريدة، مضيفين منفصلين. لذلك إذا أردت يقوم عامل التصفية بإدراج مضيفين متعددين بنطاقات فرعية مختلفة، يجب نشر عنوان URL صالح assetlinks.json على كل نطاق على سبيل المثال: يتضمّن فلتر الأهداف التالي www.example.com mobile.example.com كمضيفات عناوين URL مقبولة للأهداف. لذلك، يجب نشر قيمة 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). على سبيل المثال، سيجتاز التطبيق الذي يتضمّن فلتر الغرض التالي عملية التحقّق لأي اسم فرعي من 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>

البحث عن تطبيقات متعدّدة مرتبطة بالنطاق نفسه

إذا نشرت تطبيقات متعددة مرتبطة كلٌّ منها بالنطاق نفسه، يمكن إثبات ملكية كلٍّ منها بنجاح. ومع ذلك، إذا كان بإمكان التطبيقات حل مشكلة نفس مضيف النطاق ومساره، كما هو الحال مع الإصدارات البسيطة والكاملة من تطبيق معيَّن، وحده التطبيق الذي تم تثبيته مؤخرًا يمكنه تحديد أهداف الويب لذلك النطاق.

في مثل هذه الحالة، تحقق من عدم وجود تطبيقات متعارضة محتملة على جهاز المستخدم، بشرط أن يكون لديك الحزمة الضرورية مستوى الرؤية. بعد ذلك، أظهِر في تطبيقك مربع حوار ملف شخصي مخصّصًا يحتوي على النتائج من استدعاء queryIntentActivities(). يمكن للمستخدم اختيار تطبيقه المفضّل من قائمة التطبيقات المطابقة التي تظهر في مربّع الحوار.

الإفصاح عن عمليات الربط بالمواقع الإلكترونية

الأصل الرقمي يجب نشر ملف JSON للروابط على موقعك الإلكتروني للإشارة إلى تطبيقات Android. المرتبطة بالموقع الإلكتروني وتتحقّق من أهداف عنوان URL للتطبيق. يستخدم ملف JSON الحقول التالية لتحديد التطبيقات المرتبطة:

  • package_name: معرّف التطبيق في ملف build.gradle للتطبيق.
  • sha256_cert_fingerprints: الملفات المرجعية لشهادة SHA256 لشهادة توقيع تطبيقك يمكنك استخدام الأمر التالي لإنشاء بصمة الإصبع عبر أداة مفاتيح Java:
    keytool -list -v -keystore my-release-key.keystore
    
    يتيح هذا الحقل استخدام بصمات متعددة يمكن استخدامها لتتوافق مع إصدارات مختلفة من تطبيقك، مثل إصدارات تصحيح الأخطاء والإصدارات العلنية.

    في حال استخدام ميزة ميزة "توقيع التطبيق" من Play لتطبيقك، سيتم استخدام الشهادة الملف المرجعي الذي يتم إنشاؤه من خلال تشغيل keytool محليًا عادةً لا تتطابق مع تلك الموجودة على الأجهزة. يمكنك التحقق مما إذا كنت تستخدم ميزة "توقيع التطبيق" من Play لتطبيقك في حساب المطوِّر الخاص بك على Play Console ضمن Release > Setup > App signing؛ إذا فعلت ذلك، فستحصل أيضًا العثور على مقتطف JSON الصحيح لروابط مواد العرض الرقمية لتطبيقك على الأداة نفسها .

يمنح المثال التالي ملف assetlinks.json حقوق فتح الروابط إلى تطبيق com.example متوافق مع Android:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

ربط موقع إلكتروني بتطبيقات متعددة

يمكن للموقع الإلكتروني الإفصاح عن عمليات ربط بتطبيقات متعددة ضمن assetlinks.json نفسها. الملف. تعرض قائمة الملفات التالية مثالاً على ملف بيان يذكر وجود اقتران لديها تطبيقان، بشكل منفصل، وتقيم في https://www.example.com/.well-known/assetlinks.json:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.puppies.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
  },
  {
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.monkeys.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

يمكن لتطبيقات مختلفة معالجة روابط موارد مختلفة ضمن مضيف الويب نفسه. على سبيل المثال، قد يعلن التطبيق1 عن فلتر أهداف لـ https://example.com/articles، وقد يعلن التطبيق2 عن فلتر أهداف لـ https://example.com/videos.

ملاحظة: قد يتم توقيع تطبيقات متعددة مرتبطة بنطاق باستخدام التطبيق نفسه أو شهادات مختلفة.

ربط عدة مواقع إلكترونية بتطبيق واحد

يمكن لمواقع إلكترونية متعددة الإفصاح عن عمليات الربط بالتطبيق نفسه فيملفاتها assetlinks.json ذات الصلة. قوائم الملفات التالية مثالاً على كيفية الإعلان عن ارتباط example.com example.net مع app1. تعرِض القائمة الأولى ربط example.com بالتطبيق app1:

https://www.example.com/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

توضح القائمة التالية ارتباط example.net بـ app1. فقط يختلف الموقع الذي تتم فيه استضافة هذه الملفات (.com و.net):

https://www.example.net/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

جارٍ نشر ملف إثبات الملكية بتنسيق JSON

يجب نشر ملف إثبات الملكية بتنسيق JSON في الموقع التالي:

https://domain.name/.well-known/assetlinks.json

تأكّد مما يلي:

  • يتم عرض ملف assetlinks.json بنوع المحتوى. application/json
  • يجب أن يكون بالإمكان الوصول إلى ملف assetlinks.json عبر اتصال HTTPS، بغض النظر عمّا إذا كانت فلاتر الأهداف في تطبيقك تحدّد بروتوكول HTTPS كمخطّط للبيانات.
  • يجب أن يكون بإمكانك الوصول إلى ملف assetlinks.json بدون أي عمليات إعادة توجيه (بدون عمليات إعادة التوجيه 301 أو 302).
  • إذا كانت روابط تطبيقك تتوافق مع نطاقات مضيف متعدّدة، عليك نشر ملف واحد (assetlinks.json) في كل نطاق. اطّلِع على مقالة إتاحة ربط التطبيقات لعدة مضيفين.
  • يُرجى عدم نشر تطبيقك باستخدام عناوين URL للمطوّرين أو الاختبار في ملف البيان الذي قد لا يكون أن تكون متاحة للجميع (مثل أي مواقع لا يمكن الوصول إليها سوى باستخدام شبكة خاصة افتراضية). أحد الحلول البديلة في هذه الحالات هو ضبط ملف بيان مختلف لإصدارات الإصدار لإنشاء ملف بيان مختلف لإصدارات المطوّرين.

التحقّق من ميزة "روابط التطبيقات المتوافقة مع Android"

عند استخدام android:autoVerify="true" في هدف واحد على الأقل من أهداف تطبيقك الفلاتر، أو تثبيت تطبيقك على جهاز يعمل بالإصدار Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات) أو إلى تحقق النظام من المضيفات المرتبطة عناوين URL في فلاتر الأهداف في تطبيقك في نظام التشغيل Android 12 والإصدارات الأحدث، يمكنك أيضًا استدعاء عملية إثبات الملكية يدويًا اختبار منطق التحقق.

إثبات الملكية التلقائي

وتتضمن عملية التحقق التلقائي من النظام ما يلي:

  1. يفحص النظام جميع فلاتر الأهداف التي تتضمّن أيًا مما يلي:
    • الإجراء: android.intent.action.VIEW
    • الفئات: android.intent.category.BROWSABLE و android.intent.category.DEFAULT
    • مخطط البيانات: http أو https
  2. طلبات بحث Android لكل اسم مضيف فريد تم العثور عليه في فلاتر الأهداف أعلاه مواقع الويب المقابلة لملف "روابط الأصول الرقمية" على https://hostname/.well-known/assetlinks.json

بعد تأكيد قائمة المواقع الإلكترونية المطلوب ربطها بتطبيقك، وتأكّد من أنّ ملف JSON المستضاف صالح، ثبِّت التطبيق على جهازك. انتظِر لمدة 20 ثانية على الأقل كي تكتمل عملية إثبات الملكية غير المتزامنة. استخدم الأمر التالي للتحقق مما إذا كان النظام قد تحقق من التطبيق وتعيين سياسات التعامل مع الروابط الصحيحة:

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://domain.name:optional_port"

إثبات الملكية اليدوي

بدءًا من نظام Android 12، يمكنك استدعاء النطاق يدويًا التحقق من تطبيق مثبت على جهاز. يمكنك تنفيذ هذه الخطوات بغض النظر عمّا إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android.

يجب إعداد اتصال بالإنترنت.

لإثبات ملكية النطاق، يجب أن يكون جهاز الاختبار متصلاً الإنترنت.

إتاحة العملية المعدَّلة لإثبات ملكية النطاق

إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android أو إصدارًا أحدث، يستخدم النظام تعديل عملية إثبات ملكية النطاق تلقائيًا.

وبخلاف ذلك، يمكنك تفعيل عملية إثبات الهوية المعدَّلة يدويًا. لإجراء ذلك، نفِّذ الأمر التالي في نافذة وحدة طرفية:

adb shell am compat enable 175408749 PACKAGE_NAME

إعادة ضبط حالة Android App Links على جهاز

قبل استدعاء إثبات ملكية النطاق يدويًا على أحد الأجهزة، يجب إعادة تعيين حالة Android App Links على جهاز الاختبار. للقيام بذلك، قم بتشغيل ما يلي في نافذة طرفية:

adb shell pm set-app-links --package PACKAGE_NAME 0 all

يضع هذا الأمر الجهاز في الحالة نفسها التي كان عليها قبل المستخدم. يختار التطبيقات الافتراضية لأي نطاقات.

استدعاء عملية إثبات ملكية النطاق

بعد إعادة ضبط حالة Android App Links على جهاز، يمكنك تنفيذ ما يلي: التحقق نفسه. لإجراء ذلك، شغِّل الأمر التالي في نافذة طرفية:

adb shell pm verify-app-links --re-verify PACKAGE_NAME

مراجعة نتائج إثبات الملكية

بعد الانتظار لبعض الوقت كي يكمل وكيل إثبات الملكية طلباته، راجِع نتائج إثبات الملكية. للقيام بذلك، قم بتشغيل الأمر التالي:

adb shell pm get-app-links PACKAGE_NAME

تشبه نتيجة هذا الأمر ما يلي:

com.example.pkg:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [***]
    Domain verification state:
      example.com: verified
      sub.example.com: legacy_failure
      example.net: verified
      example.org: 1026

تكون حالة إثبات ملكية النطاق للنطاقات التي تجتاز عملية إثبات الملكية بنجاح. من verified. تشير أي حالة أخرى إلى تعذُّر إثبات ملكية النطاق تنفيذها. وعلى وجه الخصوص، تشير الحالة none إلى أنّ عملية التحقق الوكيل ربما لم يكمل عملية التحقق بعد.

توضح القائمة التالية قيم العرض المحتملة التي يمكن لإثبات ملكية النطاق العائد لنطاق معيّن:

none
لم يتم تسجيل أي بيانات لهذا النطاق. يُرجى الانتظار بضع دقائق أخرى وكيل التحقق لإنهاء الطلبات المتعلقة بإثبات ملكية النطاق، ثم استدعاء عملية إثبات ملكية النطاق مرة أخرى
verified
تم إثبات ملكية النطاق بنجاح لتطبيق الإعلان.
approved
تمت الموافقة على النطاق تلقائيًا من خلال تنفيذ أمر Shell.
denied
تم فرض رفض النطاق، عادةً من خلال تنفيذ أمر Shell.
migrated
احتفظ النظام بنتيجة عملية سابقة استخدمت النطاق القديم. إثبات الهوية
restored
تمت الموافقة على النطاق بعد أن أجرت المستخدم استعادة للبيانات. من المفترض أن أنه تم إثبات ملكية النطاق سابقًا.
legacy_failure
تم رفض النطاق من قِبل أداة إثبات ملكية قديمة. سبب الفشل المحدد هو غير معروفة.
system_configured
تمت الموافقة على النطاق تلقائيًا من خلال إعدادات الجهاز.
رمز خطأ 1024 أو أكثر

رمز خطأ مخصَّص وخاص بأداة التحقّق من الجهاز.

تحقق جيدًا من أنك أنشأت شبكة الاتصال، واستدعاء النطاق التحقق مرة أخرى.

اطلب من المستخدم ربط تطبيقك بأحد النطاقات

هناك طريقة أخرى لكي تتم الموافقة على تطبيقك للحصول على نطاق، وهي أن تطلب من المستخدم ربط تطبيقك بهذا النطاق.

التحقق مما إذا كان قد تمت الموافقة على تطبيقك في النطاق

قبل مطالبة المستخدم، تحقق مما إذا كان تطبيقك هو المعالج الافتراضي لـ النطاقات التي تحدّدها في عناصر <intent-filter>. يمكنك الاستعلام عن حالة الموافقة باستخدام إحدى الطرق التالية:

  • DomainVerificationManager واجهة برمجة التطبيقات (في وقت التشغيل).
  • برنامج سطر أوامر (أثناء الاختبار)

إدارة إثبات ملكية النطاق

يوضح مقتطف الرمز التالي كيفية استخدام واجهة برمجة تطبيقات DomainVerificationManager:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class.java)
val userState = manager.getDomainVerificationUserState(context.packageName)

// Domains that have passed Android App Links verification.
val verifiedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }

// Domains that haven't passed Android App Links verification but that the user
// has associated with an app.
val selectedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }

// All other domains.
val unapprovedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }

Java

Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
        context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
        manager.getDomainVerificationUserState(context.getPackageName());

Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
    Integer stateValue = hostToStateMap.get(key);
    if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
        // Domain has passed Android App Links verification.
        verifiedDomains.add(key);
    } else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
        // Domain hasn't passed Android App Links verification, but the user has
        // associated it with an app.
        selectedDomains.add(key);
    } else {
        // All other domains.
        unapprovedDomains.add(key);
    }
}

برنامج سطر الأوامر

عند اختبار تطبيقك أثناء تطويره، يمكنك تنفيذ الأمر التالي لمحاولة معرفة حالة إثبات ملكية النطاقات التي تملكها مؤسستك:

adb shell pm get-app-links --user cur PACKAGE_NAME

في المثال التالي، على الرغم من أن التطبيق لم ينجح في التحقق من "example.org" النطاق، وافق المستخدم 0 على التطبيق يدويًا في إعدادات النظام، ولم يتم التحقق من أي حزمة أخرى لهذا النطاق.

com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
  example.com: verified
  example.net: verified
  example.org: 1026
User 0:
  Verification link handling allowed: true
  Selection state:
    Enabled:
      example.org
    Disabled:
      example.com
      example.net

يمكنك أيضًا استخدام أوامر واجهة الأوامر لمحاكاة العملية التي يحدد فيها المستخدم التطبيق المرتبط بنطاق معيّن. شرح كامل لهذه تتوفّر من مخرجات adb shell pm.

تقديم سياق للطلب

قبل تقديم هذا الطلب للموافقة على النطاق، يُرجى توفير بعض السياق المستخدم. على سبيل المثال، يمكنك عرض شاشة البداية أو مربّع حوار أو عنصر واجهة مستخدم مشابه يوضّح للمستخدم سبب اختيار تطبيقك كمعالج تلقائي لنطاق معيّن.

تقديم الطلب

بعد أن يفهم المستخدم ما يطلب منه تطبيقك، يمكنك تقديم الطلب. وللقيام بذلك، استحضر هدفًا يتضمن ACTION_APP_OPEN_BY_DEFAULT_SETTINGS والإجراء المطلوب ومطابقة سلسلة البيانات package:com.example.pkg للتطبيق المستهدف كما هو موضح في مقتطف الرمز التالي:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:${context.packageName}"))
context.startActivity(intent)

Java

Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

عند استدعاء الغرض، ستظهر للمستخدمين شاشة إعدادات تُسمى فتح بواسطة التلقائي. تتضمّن هذه الشاشة زر اختيار يُسمى فتح الروابط المتوافقة. كما هو موضح في الشكل 1.

عندما يشغّل المستخدم فتح الروابط المتوافقة، تظهر مجموعة من مربّعات الاختيار ضمن قسم بعنوان الروابط التي سيتم فتحها في هذا التطبيق. ومن هنا، يمكن للمستخدمين اختيار النطاقات التي يريدون ربطها بتطبيقك. ويمكنهم أيضًا اختيار إضافة رابط لإضافة النطاقات، كما هو موضّح في الشكل 2. وعندما يختار المستخدمون في وقت لاحق أي رابط ضمن النطاقات التي يضيفونها، سيتم فتح الرابط في تطبيقك تلقائيًا.

عندما يكون زر الاختيار مفعَّلاً، يظهر قسم بالقرب من الجزء السفلي
    يتضمن مربعات اختيار بالإضافة إلى زر يسمى &quot;إضافة رابط&quot;
الشكل 1. شاشة إعدادات النظام التي يمكن للمستخدمين فيها اختيار الروابط التي يتم فتحها في تطبيقك تلقائيًا
يمثل كل مربع اختيار نطاقًا يمكنك إضافته. زرَّا
    مربّع الحوار هما &quot;إلغاء&quot; و&quot;إضافة&quot;.
الشكل 2. مربّع حوار يمكن للمستخدمين من خلاله اختيار نطاقات إضافية لربطه بتطبيقك

فتح النطاقات التي يتعذّر على تطبيقك إثبات ملكيتها

قد تكون الوظيفة الرئيسية لتطبيقك هي فتح الروابط بصفتك جهة خارجية، بدون إمكانية التحقّق من النطاقات المُدارة. في هذه الحالة، يجب أن تشرح للمستخدمين أنّه في الوقت الذي يختارون فيه رابط ويب، لا يمكنهم الاختيار بين تطبيق تابع لجهة خارجية وتطبيقك (التابع لجهة خارجية). على المستخدمين ربط الدومينات يدوياً بتطبيقك التابع لجهة خارجية.

بالإضافة إلى ذلك، يمكنك تقديم مربع حوار أو نشاط على الترامبولين يسمح أن يفتح المستخدم الرابط في تطبيق الطرف الأول إذا كان يفضّل ذلك والعمل كوكيل. قبل إعداد مربع الحوار أو نشاط الترامبولين، اضبط في تطبيقك لكي يحصل على مستوى ظهور الحزمة. إلى تطبيقات الطرف الأول التي تتطابق مع فلتر أهداف الويب في تطبيقك.

اختبار روابط التطبيق

عند تطبيق ميزة ربط التطبيق، يجب اختبار وظيفة الربط والتأكد من أن النظام يمكنه ربط تطبيقك بمواقعك الإلكترونية ومعالجة طلبات عناوين URL، كما تتوقع.

لاختبار ملف بيانات حالي، يمكنك استخدام أداة أداة إنشاء قائمة البيانات واختبارها.

تأكيد قائمة المضيفين المطلوب إثبات ملكيتهم

عند إجراء الاختبار، يجب عليك تأكيد قائمة المضيفين المرتبطين التي ينبغي أن يتحقق منها النظام. لتطبيقك. أنشئ قائمة بجميع عناوين URL التي تتضمّن فلاتر الأهداف المقابلة لها ما يلي: والسمات والعناصر:

  • سمة android:scheme بقيمة http أو https
  • سمة android:host بنمط عنوان URL للنطاق
  • عنصر الإجراء android.intent.action.VIEW
  • عنصر الفئة android.intent.category.BROWSABLE

استخدِم هذه القائمة للتأكّد من توفير ملف روابط التنقل إلى مواد العرض الرقمية بتنسيق JSON على كل مضيف مُسمّى. والنطاق الفرعي.

تأكيد ملفات روابط التنقل إلى مواد العرض الرقمية

استخدِم واجهة برمجة التطبيقات Digital Asset Links API لكل موقع إلكتروني للتأكّد من أنّ ملف Digital Asset Links بتنسيق JSON. ملف مستضاف وتعريفه بشكل صحيح:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://domain.name:optional_port&
   relation=delegate_permission/common.handle_all_urls

كجزء من عملية الاختبار، يمكنك التحقّق من إعدادات النظام الحالية لمعالجة الروابط. يمكنك استخدام الأمر التالي للحصول على قائمة بسياسات التعامل مع الروابط الحالية لجميع التطبيقات على جهازك المتصل:

adb shell dumpsys package domain-preferred-apps

أو يؤدي ما يلي نفس الشيء:

adb shell dumpsys package d

ملاحظة: يُرجى الانتظار لمدة 20 ثانية على الأقل بعد تثبيت تطبيقك تسمح للنظام بإكمال عملية التحقق.

يعرض الأمر قائمة بكل مستخدم أو ملف شخصي تم تحديده على الجهاز، مسبوقًا بعنوان بالتنسيق التالي:

App linkages for user 0:

بعد هذا العنوان، تستخدِم النتيجة التنسيق التالي لسرد إعدادات معالجة الروابط. لذلك المستخدم:

Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

توضّح بطاقة بيانات المتجر هذه التطبيقات المرتبطة بالنطاقات الخاصة بهذا المستخدم:

  • Package: يتم التعرّف على تطبيق حسب اسم الحزمة، كما هو موضَّح في ملف البيان الخاص به.
  • Domains: يعرض القائمة الكاملة للمضيفين الذين يتعامل معهم هذا التطبيق مع روابط الويب التي يستخدمونها، وذلك باستخدام المسافات الفارغة كمحددات.
  • Status - يعرض الإعداد الحالي للتعامل مع الروابط في هذا التطبيق. أحد التطبيقات التي تم اجتياز التحقق، والذي يحتوي بيانه على android:autoVerify="true"، يعرض الحالة من أصل always. يرتبط الرقم السداسي العشري بعد هذه الحالة سجلّ الإعدادات المفضّلة لربط التطبيقات لدى المستخدِم. لا تشير هذه القيمة إلى ما إذا كان إثبات الهوية تم بنجاح.

ملاحظة: في حال غيّر مستخدم إعدادات رابط التطبيق لأحد التطبيقات قبل إثبات الهوية. قد تظهر لك نتيجة موجبة خاطئة لإثبات الملكية بنجاح، على الرغم من تعذّرت عملية إثبات الملكية. ومع ذلك، لا يهم ما إذا كان المستخدم أتاح للتطبيق بشكل صريح فتح الروابط المتوافقة بدون طلب ذلك. يرجع ذلك إلى أنّه تحظى الإعدادات المفضَّلة للمستخدم بالأولوية على عملية التحقّق الآلي (أو عدم إجرائها). نتيجةً لذلك، ينقل الرابط المستخدمين مباشرةً إلى تطبيقك بدون عرض مربّع حوار، تمامًا كما لو كان إثبات الملكية قد تم بنجاح.

مثال للاختبار

لكي تنجح عملية التحقّق من رابط التطبيق، يجب أن يكون النظام قادرًا على إثبات ملكية تطبيقك في كلٍ من المواقع الإلكترونية التي تحدّدها في فلتر أهداف معيّن يستوفي معايير التطبيق . يوضّح المثال التالي إعداد بيان يتضمّن عدة روابط تطبيقات محدّدة:

<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>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:host="www.example2.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="account.example.com" />
        </intent-filter>
    </activity>

      <activity android:name=”ThirdActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="https" />
            <data android:host="map.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="market" />
            <data android:host="example.com" />
        </intent-filter>
      </activity>

</application>

في ما يلي قائمة المضيفين الذين سيحاول النظام الأساسي إثبات ملكيتهم من البيان أعلاه:

www.example.com
mobile.example.com
www.example2.com
account.example.com

في ما يلي قائمة بالمضيفات التي لن يحاول النظام الأساسي التحقق منها من خلال البيان أعلاه:

map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an "http" or "https" scheme)

لمزيد من المعلومات عن قوائم العبارات، يُرجى مراجعة إنشاء قائمة العبارات.

إصلاح الأخطاء الشائعة في التنفيذ

إذا لم تتمكّن من إثبات ملكية روابط تطبيقات Android، تحقّق مما يلي من الرسائل الخطأ المشترَكة: يستخدم هذا القسم العنصر النائب example.com كاسم نطاق. عند تنفيذ عمليات التحقّق هذه، استبدِل example.com باسم النطاق الفعلي لجهاز الخادم.

إعداد فلتر أهداف غير صحيح
يُرجى التحقّق لمعرفة ما إذا كان يتم تضمين عنوان URL لا يمتلكه تطبيقك في العنصر <intent-filter>
إعدادات الخادم غير صحيحة

يُرجى التحقّق من ضبط JSON للخادم، والتأكُّد من ضبط قيمة SHA. صحيح.

تحقق أيضًا من أن example.com. (مع النقطة اللاحقة) يخدم نفس المحتوى باسم example.com.

عمليات إعادة التوجيه من جهة الخادم

لا يتحقق النظام من أي رابط من روابط تطبيقات Android لتطبيقك في حال إعداد عملية إعادة توجيه مثل ما يلي:

  • من ‎http://example.com إلى ‎https://example.com
  • من ‎example.com إلى ‎www.example.com

يحمي هذا السلوك أمان تطبيقك.

قوة الخادم

يُرجى التحقّق مما إذا كان يمكن للخادم الاتصال بتطبيقات العميل أم لا.

روابط لا يمكن التحقّق منها

ولأغراض الاختبار، يمكنك إضافة روابط لا يمكن التحقق منها عن قصد. يُرجى مراعاة أنّ هذه الروابط تؤدي على نظام التشغيل Android 11 والإصدارات الأقدم إلى عدم فحص النظام لجميع روابط تطبيقات Android الخاصة بتطبيقك.

توقيع غير صحيح في assetlinks.json

تأكَّد من أنّ توقيعك صحيح وأنّه يتطابق مع التوقيع المستخدَم لتوقيع تطبيقك. تشمل الأخطاء الشائعة ما يلي:

  • توقيع التطبيق باستخدام شهادة تصحيح الأخطاء والحصول على الإصدار فقط التوقيع في assetlinks.json.
  • وجود توقيع بأحرف صغيرة في assetlinks.json. يجب أن يكون التوقيع بأحرف كبيرة.
  • في حال استخدام ميزة "توقيع التطبيق" من Play، يُرجى التأكّد من استخدام التوقيع التي تستخدمها Google لتوقيع كل إصدار من إصداراتك. يمكنك التحقق من هذه التفاصيل تضمين مقتطف JSON كامل، من خلال اتّباع التعليمات حول الإعلان عن عمليات ربط المواقع الإلكترونية.