Обработка определенных маршрутов в ссылках приложения Android M

Android M добавил поддержку ссылок на приложения, создав на веб-сервере специальный assetlinks.json, чтобы делегировать обработку ссылок мобильному приложению.

Например, вот содержимое такого файла:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.costingtons.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"]
  }
}]

В настоящее время отношение определяется как common.handle_all_urls это означает, что любой URL будет направлен в приложение.

Я хотел бы, чтобы приложение открывало определенные маршруты, например, https://costingtons.com/products/a-product открывалось бы в приложении, но https://costingtons.com/ открывало веб-версию.

Аналогичный файл конфигурации Apple Universal Links может определять пути, которые будут открыты в приложении, а синтаксис поддерживает сопоставление с шаблоном, например /products/* и т.п.

Есть ли способ сделать что-то подобное с помощью ссылок приложений в Android?

2 ответа

Насколько я могу судить, нет способа настроить файл assetlinks, чтобы определить, какие пути могут / должны открывать приложение (как вы можете это сделать с файлом iOS AASA).

Тем не менее, поскольку Android использует Intent Filters, вы можете использовать их, чтобы ограничить, какие пути должны открывать приложение. Согласно более раннему комментарию, файл assetlinks говорит только о том, какие URL-адреса могут открыть приложение. Приложение должно определить, какие URL-адреса должны открывать приложение.

Итак, в приведенном выше примере вам нужно определить фильтр намерений для одного из ваших действий, который будет выглядеть примерно так:

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

    <!-- Only accept URLs that look like https://costingtons.com/products/* -->
    <data
        android:scheme="https"
        android:host="costingtons.com"
        android:pathPrefix="/products/*" />
</intent-filter>

Самое большое ограничение, которое я обнаружил в этом, заключается в том, что нет никакого способа исключить определенные пути (т.е. НЕ URL-адреса с префиксом xyz), поэтому вам придется придумать исчерпывающий набор Intent Filters, соответствующих всем URL-адресам, которые вы НЕОБХОДИМО впустить в приложение.

Файл assetlinks.json указывает, что этому конкретному приложению разрешено открывать все URL-адреса, но само приложение (через фильтр намерений в его AndroidManifest) может быть более ограничительным, так что оно открывает только ссылки на продукты, а не общую ссылку на веб-сайт.

Более того, даже если фильтр намерений вызывается для определенного URL-адреса, получатель все же может решить не обрабатывать его, оставляя его следующему обработчику (часто браузеру). (Может быть, вы хотите, чтобы приложение обрабатывало ссылки в сотовой сети, но разрешите браузеру обрабатывать их при использовании Wi-Fi).

@zmarties прав, единственное, что вам нужно сделать, это убедиться, что ваш Manifest.xml настроен для поддержки https://yourdomain.com/product/* и нет https://yourdomain.com/otherthings, https://yourdomain.com/otherthings вместо этого откроет веб-браузер.

Как это доказать?

В ASOS и большинстве известных мне приложений электронной коммерции включена индексация приложений.

При установленном приложении ASOS для Android:

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "https://www.asos.com/men/shoes-boots-trainers/cat?cid=4209"

Отобразит экран категорий в своем приложении для Android,

тогда как следующее откроет веб-браузеры:

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "https://www.asos.com/dummycrazyurl"
Другие вопросы по тегам