Создавайте глубокие ссылки

Технология глубоких ссылок позволяет напрямую перенаправлять пользователей в ваше приложение из веб-браузеров, уведомлений, социальных сетей, рекламы и других источников. Глубокие ссылки обеспечивают прямые переходы между приложениями и веб-сайтами, что помогает повысить вовлеченность пользователей за счет контекстного, целевого контента.

В этом руководстве объясняется, как работает глубокая перелинковка, а также как создавать и тестировать прямые ссылки на ваш контент.

Для прямых ссылок, ведущих на ваш собственный веб-сайт или домен, мы рекомендуем использовать App Links, которые обеспечивают бесперебойную и надежную работу для ваших пользователей.

Как работает глубокая ссылка

Глубокие ссылки — это общая системная функция Android, поддерживаемая во всех версиях и на всех устройствах. Она использует систему Intents Android для перенаправления глубоких ссылок на заинтересованные приложения. Приложения, которые хотят обрабатывать определенный URI глубокой ссылки, объявляют соответствующий фильтр Intent в своих файлах манифеста приложения.

Во время выполнения, когда пользователь нажимает на ссылку, Android запускает Intent и пытается перенаправить его в приложение. Поскольку несколько приложений могут объявлять фильтры Intent, соответствующие заданному URI, Android выполняет следующие действия в указанном порядке для перенаправления Intent:

  1. Откройте приложение по умолчанию, которое может обрабатывать данный URI, если таковое было указано.
  2. Откройте единственное доступное приложение, которое может обрабатывать этот URI.
  3. Предоставьте пользователю возможность выбрать приложение в диалоговом окне уточнения .

Это означает, что, даже если ваши фильтры намерений соответствуют заданному URI, нет гарантии, что система направит намерение прямой ссылки в ваше приложение. Пользователь играет ключевую роль в управлении тем, какое приложение обработает намерение, что дает ему контроль и возможность выбора. Для большего контроля над прямыми ссылками на ваш собственный веб-сайт и домены попробуйте использовать ссылки приложений.

В диалоговом окне Android пользователь может увидеть все установленные приложения, зарегистрированные для обработки интента глубокой ссылки. Пользователь также может выбрать приложение в качестве приложения по умолчанию для этого типа ссылок. После того, как пользователь выберет приложение по умолчанию, система больше не будет отображать диалоговое окно для этого конкретного интента, и выбранное приложение будет открываться автоматически.

Рисунок 1. Диалог разрешения неоднозначности.

Поведение диалогового окна уточнения ссылок менялось в зависимости от версии Android. Например, в Android 12 и выше веб-ссылки, не являющиеся проверенными ссылками на приложения, обычно открываются в веб-браузере по умолчанию, тогда как в более ранних версиях диалоговое окно уточнения ссылок могло появиться, если приложение могло обработать данную веб-ссылку.

Примечание : Начиная с Android 12 (уровень API 31), универсальный веб-интент разрешается в активность вашего приложения только в том случае, если ваше приложение одобрено для конкретного домена, указанного в этом веб-интенте. Если ваше приложение не одобрено для этого домена, веб-интент разрешается в браузерное приложение пользователя по умолчанию.

Типы глубоких ссылок

На Android можно поддерживать три типа глубоких ссылок:

  • Пользовательские прямые ссылки : это прямые ссылки, использующие пользовательскую схему URI ( example://products/123 ), чтобы перенаправить пользователя непосредственно к определенному контенту внутри приложения. Они эффективны для внутренней навигации или ссылок из контролируемых вами источников, но не являются стандартными веб-ссылками и могут вызвать диалоговое окно уточнения, если другое приложение зарегистрирует ту же пользовательскую схему.
  • Веб-ссылки : это прямые ссылки, использующие стандартные схемы http и https . Они более универсальны, поскольку представляют собой стандартные URL-адреса, но на Android 12 и выше они почти всегда будут вызывать диалоговое окно уточнения, что означает, что они, скорее всего, будут обрабатываться веб-браузером пользователя по умолчанию, а не перенаправляться в ваше приложение.
  • Ссылки на приложения : доступны начиная с Android 6.0 (уровень API 23), это проверенные веб-ссылки. С помощью сопоставления веб-сайтов вы можете доказать системе Android, что являетесь владельцем домена. После проверки система автоматически перенаправляет ссылки с этого домена непосредственно в ваше приложение, минуя диалоговое окно уточнения. Это обеспечивает надежный и бесперебойный пользовательский опыт.

Добавьте фильтры намерений для входящих ссылок.

Чтобы создать ссылку на контент вашего приложения, добавьте в манифест фильтр намерений, содержащий следующие элементы и значения атрибутов:

<action>

Укажите действие ACTION_VIEW для интента, чтобы фильтр интента был доступен из поиска Google.

<data>

Добавьте один или несколько тегов <data> , каждый из которых представляет собой формат URI, указывающий на активность. Как минимум, тег <data> должен содержать атрибут android:scheme .

Вы можете добавить дополнительные атрибуты, чтобы еще точнее определить тип URI, который принимает активность. Например, у вас может быть несколько активностей, принимающих похожие URI, но отличающихся просто именем пути. В этом случае используйте атрибут android:path или его варианты pathPattern или pathPrefix , чтобы различать, какую активность система должна открывать для разных путей URI.

<category>

Добавьте категорию BROWSABLE . Она необходима для того, чтобы фильтр намерений был доступен из веб-браузера. Без неё переход по ссылке в браузере не приведёт к вашему приложению.

Также добавьте категорию DEFAULT . Это позволит вашему приложению реагировать на неявные намерения. Без этого активность может быть запущена только в том случае, если намерение указывает имя компонента вашего приложения.

Следующий фрагмент XML-кода показывает, как можно указать фильтр намерений в манифесте для создания глубоких ссылок. URI "example://gizmos" и "http://www.example.com/gizmos" оба ведут к этому действию.

<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>

Обратите внимание, что два фильтра намерений отличаются только элементом <data> . Хотя в один фильтр можно включить несколько элементов <data> , важно создавать отдельные фильтры, если вы хотите задать уникальные URL-адреса (например, определенную комбинацию scheme и host ), поскольку несколько элементов <data> в одном фильтре намерений фактически объединяются, чтобы учесть все вариации их объединенных атрибутов. Например, рассмотрим следующее:

<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 . Однако на самом деле поддерживаются эти два адреса, а также следующие: app://www.example.com и https://open.my.app .

Внимание : если несколько действий содержат фильтры намерений, которые ссылаются на одну и ту же проверенную ссылку на приложение Android, то нет гарантии, какое именно действие обработает эту ссылку.

После добавления в манифест приложения фильтров намерений с URI для содержимого активности, Android сможет направлять в ваше приложение любое Intent , имеющее соответствующие URI.

Чтобы узнать больше о настройке фильтров намерений, см. раздел «Разрешить другим приложениям запускать вашу активность» .

Считывание данных из входящих интентов.

Как только система запустит вашу активность через фильтр намерений, вы можете использовать данные, предоставленные Intent , чтобы определить, что вам нужно отобразить. Вызовите методы getData() и getAction() чтобы получить данные и действие, связанные с входящим Intent . Вы можете вызывать эти методы в любое время в течение жизненного цикла активности, но обычно это следует делать во время ранних коллбэков, таких как onCreate() или onStart .

Вот фрагмент кода, демонстрирующий, как получить данные из Intent :

Котлин

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();
}

Следуйте этим рекомендациям, чтобы улучшить пользовательский опыт:

  • Прямая ссылка должна вести пользователей непосредственно к контенту без каких-либо подсказок, промежуточных страниц или авторизации. Убедитесь, что пользователи могут видеть контент приложения, даже если они никогда ранее не открывали это приложение. Допустимо запрашивать у пользователей подтверждение при последующих взаимодействиях или при открытии приложения из лаунчера.
  • Следуйте рекомендациям по дизайну, описанным в разделе «Навигация с помощью кнопок «Назад» и «Вверх»» , чтобы ваше приложение соответствовало ожиданиям пользователей в отношении обратной навигации после того, как они попадут в приложение по прямой ссылке.

Проверьте свои прямые ссылки

Вы можете использовать Android Debug Bridge с инструментом Activity Manager (am), чтобы проверить, что указанные вами URI фильтров намерений для глубоких ссылок ведут к правильной активности приложения. Вы можете запустить команду adb на устройстве или эмуляторе.

Общий синтаксис для проверки URI фильтра намерений с помощью 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-адреса для глубокой ссылки будет **basePath?colors={value**} . Если вы попытаетесь указать URI с несколькими параметрами запроса (например, **basepath?colors=red&colors=blue** ), необходимо экранировать амперсанд (например, **basepath?colors=red\&colors=blue** ).

В манифесте и обработчике намерений, которые вы устанавливаете, определяется связь между вашим приложением и веб-сайтом, а также то, что делать с входящими ссылками. Однако, чтобы система рассматривала ваше приложение как обработчик по умолчанию для набора URI, необходимо также запросить у системы проверку этой связи. В руководстве «Проверка ссылок приложения» объясняется, как реализовать эту проверку.

Чтобы узнать больше об интентах и ​​ссылках на приложения, ознакомьтесь со следующими ресурсами: