Spec-Zone.ru › React Native

Связывание

Linking предоставляет общий интерфейс для взаимодействия с входящими и исходящими ссылками приложения.

У каждой ссылки (URL) есть схема URL-адреса; некоторые веб-сайты имеют префиксы https:// или http://, а http — это схема URL-адреса. Назовём её коротко схемой.

В дополнение к https, вы, вероятно, также знакомы со схемой mailto. При открытии ссылки со схемой mailto ваша операционная система откроет установленное приложение для электронной почты. Аналогично, существуют схемы для совершения телефонных звонков и отправки SMS. Подробнее о встроенных схемах URL-адресов см. ниже в разделе встроенные схемы URL.

Так же, как и при использовании схемы mailto, можно установить ссылки на другие приложения, используя пользовательские схемы URL. Например, при получении электронного письма с магической ссылкой от Slack, кнопка Запустить Slack представляет собой тег ссылки с атрибутом href, похожим на: slack://secret/magic-login/other-secret. Как и в случае с Slack, вы можете указать операционной системе, что хотите обработать пользовательскую схему. При открытии приложения Slack оно получит URL, который использовался для его запуска. Это часто называется глубокой ссылкой. Подробнее о том, как получить глубокую ссылку в ваше приложение, см. в разделе получение глубокой ссылки.

Пользовательская схема URL — не единственный способ открыть ваше приложение на мобильном устройстве. Вы не хотите использовать пользовательскую схему URL в ссылках в электронных письмах, потому что тогда ссылки будут нерабочими на настольных компьютерах. Вместо этого вы хотите использовать обычные https ссылки, такие как https://www.myapp.io/records/1234546. На мобильных устройствах вы хотите, чтобы по этой ссылке открывалось ваше приложение. Android называет это глубокими ссылками (универсальные ссылки — iOS).

Встроенные схемы URL-адресов

Как упоминалось во введении, существуют некоторые схемы URL-адресов для основных функций, которые существуют на каждой платформе. Следующий список не является исчерпывающим, но охватывает наиболее часто используемые схемы.

Схема Описание iOS Android
mailto Открыть приложение электронной почты, например: mailto: support@expo.io ✅ ✅
tel Открыть приложение для звонков, например: tel:+123456789 ✅ ✅
sms Открыть приложение для SMS, например: sms:+123456789 ✅ ✅
https / http Открыть приложение веб-браузера, например: https://expo.io ✅ ✅

Включение глубоких ссылок

Проекты только с нативным кодом

Следующий раздел применим только к проектам с открытым нативным кодом. Если вы используете управляемый рабочий процесс Expo, см. руководство по связыванию в документации Expo для соответствующей альтернативы.

Если вы хотите включить глубокие ссылки в своём приложении, пожалуйста, прочитайте нижеследующее руководство:

  • Android
  • iOS

Инструкции по добавлению поддержки глубоких ссылок для Android см. в разделе Включение глубоких ссылок для содержимого приложения — добавление фильтров намерений для ваших глубоких ссылок.

Если вы хотите получить намерение в существующем экземпляре MainActivity, вы можете установить launchMode MainActivity на singleTask в AndroidManifest.xml. См. документацию <activity> для получения дополнительной информации.

<activity
  android:name=".MainActivity"
  android:launchMode="singleTask">

ПРИМЕЧАНИЕ: В iOS необходимо добавить папку LinkingIOS в пути поиска заголовков, как описано в шаге 3 здесь. Если вы также хотите прослушивать входящие ссылки приложений во время выполнения вашего приложения, вам необходимо добавить следующие строки в свой *AppDelegate.m:

// iOS 9.x or newer
#import <React/RCTLinkingManager.h>

- (BOOL)application:(UIApplication *)application
   openURL:(NSURL *)url
   options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  return [RCTLinkingManager application:application openURL:url options:options];
}

Если вы используете iOS 8.x или более ранние версии, вы можете использовать следующий код вместо этого:

// iOS 8.x or older
#import <React/RCTLinkingManager.h>

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
  return [RCTLinkingManager application:application openURL:url
                      sourceApplication:sourceApplication annotation:annotation];
}

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

- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
 restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
 return [RCTLinkingManager application:application
                  continueUserActivity:userActivity
                    restorationHandler:restorationHandler];
}

Обработка глубоких ссылок

Существует два способа обработки URL-адресов, которые открывают ваше приложение.

1. Если приложение уже открыто, приложение выходит на передний план, и срабатывает событие Linking «url»

Вы можете обработать эти события с помощью Linking.addEventListener('url', callback) — оно вызывает callback({ url }) с связанным URL-адресом

2. Если приложение ещё не открыто, оно открывается, а URL передаётся в качестве initialURL

Вы можете обработать эти события с помощью Linking.getInitialURL() — оно возвращает промис, который разрешается до URL-адреса, если он есть.

Открытие ссылок и глубокие ссылки (универсальные ссылки)

Открыть пользовательские настройки

Получить глубокую ссылку

Отправка намерений (Android)

Справочник

Методы

addEventListener()

addEventListener(type, handler);

Добавьте обработчик изменений в связывании, прослушав тип события url и предоставив обработчик.

canOpenURL()

canOpenURL(url);

Определите, может ли установленное приложение обработать данный URL-адрес.

Метод возвращает объект Promise . Когда определяется, может ли быть обработан данный URL-адрес, промис разрешается, а первым параметром является значение, может ли он быть открыт или нет.

Промис Promise отклонится в Android, если невозможно проверить, может ли быть открыт URL-адрес, или при использовании Android 11 (SDK 30), если вы не указали соответствующие запросы намерений в AndroidManifest.xml. Аналогично, в iOS промис отклонится, если вы не добавили определённую схему в ключ LSApplicationQueriesSchemes внутри Info.plist (см. ниже).

Параметры:

Имя Тип Описание
url
Обязательно
строка URL-адрес для открытия.

Для веб-URL-адресов протокол ("http://", "https://") должен быть установлен соответствующим образом!

У этого метода есть ограничения на iOS 9+. Согласно официальной документации Apple:

  • Если ваше приложение связано с более ранней версией iOS, но выполняется в iOS 9.0 или более поздней версии, вы можете вызвать этот метод до 50 раз. После достижения этого предела последующие вызовы всегда возвращают false. Если пользователь переустановит или обновит приложение, iOS сбросит ограничение.

Начиная с iOS 9, ваше приложение также должно предоставить ключ LSApplicationQueriesSchemes внутри Info.plist или canOpenURL() всегда будет возвращать false.

При использовании Android 11 (SDK 30) вы должны указать намерения для схем, которые вы хотите обработать в AndroidManifest.xml . Список общих намерений можно найти здесь.

Например, для обработки схем https необходимо добавить следующее в ваш манифест:

<manifest ...>
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="https"/>
        </intent>
    </queries>
</manifest>

getInitialURL()

getInitialURL();

Если запуск приложения был вызван ссылкой приложения, то он передаст URL ссылки, в противном случае он вернёт null.

Чтобы поддерживать глубокие ссылки на Android, см. http://developer.android.com/training/app-indexing/deep-linking.html#handling-intents

getInitialURL может возвращать null во время отладки. Отключите отладчик, чтобы убедиться, что он передаётся.

openSettings()

openSettings();

Открыть приложение Настройки и отобразить пользовательские настройки приложения, если таковые имеются.

openURL()

openURL(url);

Попытаться открыть указанный url с помощью любого установленного приложения.

Вы можете использовать другие URL-адреса, например, местоположение (например, «geo:37.484847,-122.148386» в Android или «http://maps.apple.com/?ll=37.484847,-122.148386» в iOS), контакт или любой другой URL-адрес, который может быть открыт установленным приложением.

Метод возвращает объект Promise . Если пользователь подтвердит диалог открытия или URL автоматически откроется, промис разрешится. Если пользователь отменит диалог открытия или не зарегистрированы приложения для URL-адреса, промис отклонится.

Параметры:

Имя Тип Описание
url
Обязательно
строка URL-адрес для открытия.

Этот метод завершится неудачей, если система не знает, как открыть указанный URL-адрес. Если вы передаёте URL-адрес без http(s), лучше сначала проверить canOpenURL().

Для веб-URL-адресов протокол ("http://", "https://") должен быть установлен соответствующим образом!

Этот метод может вести себя по-разному в эмуляторе, например, "tel:" ссылки не могут быть обработаны в эмуляторе iOS, так как нет доступа к приложению для звонков.

removeEventListener()

removeEventListener(type, handler);

Устаревший. Используйте метод remove() для подписки на событие, возвращаемой методом addEventListener().

sendIntent()
Android

sendIntent(action, extras);

Запуск Android интента с дополнительными данными.

Параметры:

Имя Тип
действие
Обязательный
строка
дополнительные данные массив {key: string, value: string \| number \| boolean}

© 2022 Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://reactnative.dev/docs/linking

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API