Обработка определенных маршрутов в ссылках приложения 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"