Перейти к содержанию

Linking

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

Каждая ссылка (URL) имеет схему URL, некоторые сайты имеют префикс https:// или http://, а http является схемой URL. Для краткости будем называть ее схемой.

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

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

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

Встроенные схемы URL

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

Схема Описание iOS Android
mailto Открывает почтовое приложение, eg: mailto: [email protected]
tel Открывает приложение телефон, eg: tel:+123456789
sms Открывает смс приложение, eg: sms:+123456789
https / http Открывает браузер, eg: https://expo.io

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

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

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

Инструкции по добавлению поддержки глубоких ссылок на Android см. в разделе Enabling Deep Links for App Content — Add Intent Filters for Your Deep Links.

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

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

ПРИМЕЧАНИЕ

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

1
2
3
4
5
6
7
8
9
// 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 или более старую версию, вместо этого можно использовать следующий код:

1
2
3
4
5
6
7
8
9
// 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];
}

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

1
2
3
4
5
6
7
- (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 передается url

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

Пример

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

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

Методы

addEventListener()

1
2
3
4
static addEventListener(
  type: 'url',
  handler: (event: {url: string}) => void,
): EmitterSubscription;

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

canOpenURL()

1
static canOpenURL(url: string): Promise<boolean>;

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

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

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

Параметры:

Имя Тип Описание
url (обязательно) string 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 необходимо добавить в манифест следующее:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<manifest>
    <queries>
        <intent>
            <action
                android:name="android.intent.action.VIEW"
            />
            <data android:scheme="https" />
        </intent>
    </queries>
</manifest>

getInitialURL()

1
static getInitialURL(): Promise<string | null>;

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

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

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

openSettings()

1
static openSettings(): Promise<void>;

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

openURL()

1
static openURL(url: string): Promise<any>;

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

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

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

Параметры:

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

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

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

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

sendIntent()

1
2
3
4
static sendIntent(
  action: string,
  extras?: Array<{key: string; value: string | number | boolean}>,
): Promise<void>;

Запустите намерение Android с помощью дополнительных функций.

Параметры:

Имя Тип
action (обязательно) string
extras массив из {key: string, value: string \| number \| boolean}

Комментарии