логотип PurpleSchool
логотип PurpleSchool

Как реализовать linking на React Native

Автор

Олег Марков

Введение

В мобильных приложениях часто возникает необходимость открывать внешние ресурсы, интегрироваться с другими приложениями или реагировать на определённые ссылки. В экосистеме React Native этим занимается Linking API. С помощью Linking вы сможете не только открывать внешние URL, но и реализовать deep linking — механизм, благодаря которому приложение может запускаться и выполнять определённые действия по заданным схемам URI. Давайте подробно рассмотрим, как Linking работает, какие есть особенности и как на практике соединить ваше приложение с остальным миром.

Что такое Linking в React Native

Linking — это модуль, который объединяет ваше приложение с внешними источниками через ссылки (URL). На практике это означает три основных сценария:

  • Открытие внешних ссылок (обычных сайтов, номеров телефонов, email и т.д.).
  • Получение и обработка ссылок, по которым было запущено приложение (deep linking).
  • Взаимодействие между приложениями (например, запускаем карты или мессенджеры).

В основе Linking лежит использование URI-схем и специальных методов API, обеспечивающих взаимодействие с системой мобильного устройства.

Linking позволяет вашему приложению взаимодействовать с другими приложениями и веб-сайтами, открывать ссылки и обрабатывать deeplinks. Правильная реализация Linking обеспечивает seamless пользовательский опыт и позволяет расширить функциональность вашего приложения. Если вы хотите детально разобраться в реализации Linking на React Native и создавать приложения, которые легко взаимодействуют с внешним миром — приходите на наш большой курс React Native и Expo Router. На курсе 184 уроков и 11 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Открытие внешних ссылок через Linking

Самый простой случай использования Linking — открыть внешний адрес (например, сайт или видеоролик).

Как использовать Linking для открытия URL

Смотрите, я покажу вам, как это реализовать на практике.

import { Linking, Button } from 'react-native';

const openWebsite = async () => {
  const url = 'https://reactnative.dev';
  // Проверяем, может ли устройство открыть этот URL
  const supported = await Linking.canOpenURL(url);

  if (supported) {
    // Если поддерживается, открываем сайт в браузере
    await Linking.openURL(url);
  } else {
    // Если нет, например, при ошибке в схеме — выводим сообщение
    alert("Не могу открыть ссылку: " + url);
  }
};

// Внутри компонента размещаем кнопку
<Button title="Открыть сайт React Native" onPress={openWebsite} />

Что делает этот код:

  • canOpenURL(url) — проверяет, можно ли открыть этот адрес на устройстве.
  • openURL(url) — инициирует открытие ссылки.
  • Обычно это используется для перехода на сайты, запусков почтового клиента (mailto:), звонков (tel:), мессенджеров (их схемы).

Открытие специальных схем

Вы можете открывать приложение по другим схемам. Например, для звонка:

await Linking.openURL('tel:88005553535') // Открывает телефонный набор

Для отправки письма:

await Linking.openURL('mailto:example@example.com')

Чтобы открыть карту с координатами, используйте сервисную ссылку платформы, например:

  • Для Google Maps (Android):
await Linking.openURL('geo:37.484847,-122.148386') // Открывается Google Maps
  • Для Apple Maps (iOS):
await Linking.openURL('http://maps.apple.com/?ll=37.484847,-122.148386')

Deep Linking: запуск и обработка ссылок в приложении

Deep linking — ключевая часть Linking API. Она позволяет запускать ваше приложение через специальные ссылки (схемы), а также реагировать на переходы по таким ссылкам.

Типы deep linking

В React Native поддерживаются два вида deep linking:

  1. Custom URL Scheme — собственная схема приложения (myapp://profile/42).
  2. Universal Links (iOS) и App Links (Android) — ссылки на реальные домены (https://myapp.com/profile/42), которые открывают приложение, если оно установлено.

Добавление custom URL scheme

Настройка для iOS

  1. Откройте Xcode, найдите ваш проект в навигации слева.
  2. Перейдите во вкладку InfoURL Types.
  3. Добавьте новый тип URL:
    • В поле Identifier — любое название (не влияет на работу).
    • В поле URL Schemes — имя схемы (например, myapp).

Теперь по переходу на ссылку типа myapp://profile система будет запускать ваше приложение.

Настройка для Android

Откройте файл android/app/src/main/AndroidManifest.xml и добавьте в раздел <activity ...> следующий intent-filter:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="myapp" />
</intent-filter>

Теперь Android будет ассоциировать ваши ссылки с приложением.

Если вам нужно поддержать открытие по обычным https-ссылкам — настройка чуть сложнее, с использованием ассоциированных доменов. Обычно такие сценарии требуют:

  • владения доменом
  • настройки ассоциаций на вашем сервере

Рекомендуется изучить официальное руководство по deep linking для расширенной интеграции.

Получение URL, по которому запущено приложение

Когда пользователь запускает приложение по ссылке, React Native позволяет получить этот URL.

import { Linking } from 'react-native';

const handleInitialURL = async () => {
  const initialUrl = await Linking.getInitialURL();
  if (initialUrl) {
    // Приложение запущено по ссылке initialUrl
    // Можно распарсить ссылку и открыть необходимый экран
    console.log('App launched with URL:', initialUrl);
  }
};

Обработка ссылок во время работы приложения

Чтобы реагировать на новые ссылки, используйте подписку:

import { useEffect } from 'react';
import { Linking } from 'react-native';

useEffect(() => {
  // Получаем функцию-обработчик
  const onUrlChange = ({ url }) => {
    // При любом открытии ссылки через scheme (или universal link)
    // Эта функция сработает
    console.log('Received URL:', url);
  };

  // Подписка на событие linking
  const subscription = Linking.addEventListener('url', onUrlChange);

  // Очистка при размонтировании компонента
  return () => {
    subscription.remove();
  };
}, []);

Теперь ваше приложение сможет реагировать на любые открытия ссылок, пока оно работает.

Парсинг ссылки для навигации

Обычно ссылки содержат информацию о маршруте (myapp://profile/42). Чтобы правильно обработать это, нужно выделить параметры и передать их навигации. Вот как это реализовать:

import { useNavigation } from '@react-navigation/native';

// Разбор URL и навигация
function handleOpenUrl(url) {
  // Например, url = myapp://profile/42
  const route = url.replace(/.*?:\/\//g, ''); // Убираем схему
  const [screen, param] = route.split('/');

  // Открываем нужный экран через React Navigation
  navigation.navigate(screen, { id: param });
}

Linking в связке с React Navigation

В большинстве современных приложений используется навигация. React Navigation имеет встроенную поддержку deep linking. Давайте рассмотрим, как реализовать интеграцию Linking с React Navigation.

Подключение Linking к навигации

В конфиг навигатора добавьте секцию linking:

import { NavigationContainer } from '@react-navigation/native';

const linking = {
  prefixes: ['myapp://', 'https://myapp.com'],
  config: {
    screens: {
      Home: 'home',
      Profile: 'profile/:id',
      Settings: 'settings',
    },
  },
};

// Пример интеграции
<NavigationContainer linking={linking}>{/* ... */}</NavigationContainer>

Здесь:

  • prefixes — список поддерживаемых схем и доменов.
  • config — сопоставление путей и экранов.

Теперь при запуске приложения по ссылке вроде myapp://profile/42 или https://myapp.com/profile/42 соответствующий экран откроется автоматически.

Пример обработки deep linking в React Navigation

Допустим, ссылка myapp://profile/12 должна открыть экран профиля с id=12:

// В linking.config
screens: {
  Profile: 'profile/:id',
}

// На экране профиля
const ProfileScreen = ({ route }) => {
  // id попадёт в route.params.id
  return <Text>Профиль пользователя #{route.params.id}</Text>;
};

Теперь переход по ссылке автоматически перенаправит пользователя на нужный экран.

Особенности работы Linking на iOS и Android

Хотя Linking работает схожим образом на обеих платформах, есть нюансы:

  • Android требует обязательно разрешать работу вашего scheme или host через intent-фильтр. Без этого система не предоставит вашему приложению сведения о ссылке.
  • iOS использует ассоциацию schemes и Universal Links через Xcode, а запуск через universal links требует сертификата и размещённого на сервере файла apple-app-site-association.
  • Universal Links могут быть перехвачены браузером, если приложение не ассоциировано с доменом.

Если вы протестировали ссылку, но приложение не открылось — проверьте настройки схем и фильтров, а также корректность схемы URL.

Работа с параметрами в ссылках

Давайте посмотрим, что происходит с параметрами. Часто deep link содержит и путь, и query string (например, myapp://profile/42?ref=newsletter).

Вот пример разбора параметров query string:

// Функция для парсинга query string
function getQueryParams(url) {
  const params = {};
  url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(str, k, v) {
    params[k] = v;
  });
  return params;
}

// Применение
const url = 'myapp://profile/42?ref=newsletter';
const queryParams = getQueryParams(url);
// queryParams.ref === 'newsletter'

Проверка поддержки scheme перед открытием

Не все схемы поддерживаются устройством. Перед открытием схемы всегда используйте canOpenURL:

const supported = await Linking.canOpenURL('whatsapp://send?text=Hello');
if (supported) {
  await Linking.openURL('whatsapp://send?text=Hello');
} else {
  alert('У вас не установлен WhatsApp');
}

Открытие других приложений через Linking

Linking позволяет открывать другие приложения, если вы знаете их схему. Примеры популярных схем:

  • WhatsApp: whatsapp://send?text=Hello
  • Telegram: tg://resolve?domain=username
  • Instagram: instagram://user?username=yourname

Не забудьте проверить поддержку через canOpenURL.

Особенности публикации deep linking

  • После изменения схемы не забудьте пересобрать приложение.
  • Для Universal/App Links требуется обновление app manifests и распространение новых версий приложения.

Заключение

В React Native Linking — мощный инструмент для взаимодействия вашего приложения с другими ресурсами и мобильными экосистемами. Благодаря Linking вы сможете открывать внешние ссылки, делать интеграцию с другими приложениями, настраивать универсальные и кастомные deep links, автоматически маршрутизировать пользователей в нужные разделы приложения. Настройка Linking требует внимательности к scheme/id, соответствию платформенным правилам, а в сложных сценариях — работы с серверной стороной и файлами ассоциации домена. Надеюсь, теперь взаимодействие вашего приложения с внешним миром станет контролируемым и предсказуемым.

Реализация Linking является важным аспектом разработки современного React Native приложения. Однако, для создания полноценного приложения необходимо освоить множество других технологий и подходов, включая работу с UI, данными и нативными функциями. Курс React Native и Expo Router поможет вам в этом. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир React Native прямо сегодня.

Частозадаваемые технические вопросы по теме Linking в React Native

  • Для Android используйте команду adb shell am start -W -a android.intent.action.VIEW -d "myapp://profile/1" чтобы имитировать открытие ссылки.
  • На iOS в симуляторе используйте команду xcrun simctl openurl booted "myapp://profile/1".
  • Также можно отправить себе ссылку через email или заметку и открыть её.

Почему Linking.openURL не открывает внешнее приложение/ссылку?

  • Убедитесь, что схема приложения поддерживается устройством (canOpenURL). Например, если открываете WhatsApp, оно должно быть установлено.
  • Проверьте правильность схемы, орфографию и наличие соответствующего intent-фильтра на Android или url scheme на iOS.
  • Применяйте асинхронную обработку ошибок и ловите исключения через try/catch.
  • Добавляйте проверку, что url — это допустимый маршрут или схема, соответствующая вашему приложению.
  • Используйте валидацию параметров и ограничивайте действия внутри приложения в зависимости от источника.

Можно ли отключить реакцию на определённые внешние ссылки?

  • Да, в конфиге deep linking указывайте только нужные схемы, а в обработчиках фильтруйте или игнорируйте неподходящие url.
  • Реализуйте логику, при которой приложение, получив нераспознанную ссылку, ничего не делает или выводит предупреждение.
  • Push-уведомления должны содержать url или схему перехода.
  • В обработчике уведомления используйте Linking.openURL() с нужным deep link'ом.
  • Отдельно проверьте, что при открытии по push обрабатывается нужный payload.

Если сталкиваетесь с ошибками — просмотрите логи, внимательно проверяйте настройки schemes, intent-фильтров и корректность урлов.

Стрелочка влевоОптимизация отображения списков в React NativeГайд по UI-китам для React NativeСтрелочка вправо

Постройте личный план изучения React-native до уровня Middle — бесплатно!

React-native — часть карты развития Mobile

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по React-native

Работа со ScrollView в React NativeРабота с видео в React NativeКак реализовать аудиоплеер на React NativeНастройка и использование input и textinput в React NativeИнтеграция видео плеера в приложение на React NativeИспользование выпадающих списков в React NativeСоздание и настройка native module на React NativeКак создать модальные окна в React NativeРабота с изображениями в React NativeОтображение списков данных в React NativeГайд по файловой системе в React NativeИнтеграция камеры в приложение на React NativeСоздание интерактивных кнопок в React Native
Как использовать векторные иконки в React Native5 популярных библиотек UI компонентов React NativeСоздание и использование tabs в React NativeРуководство по стилизации компонентов в React NativeОптимизация переходов между экранами в React NativeАдаптация safe area context на React NativeОбзор библиотек для навигации в React NativeСоздание сложных анимаций (reanimated) на React NativeИспользование библиотеки стилей Paper в React NativeРуководство по navigation в React NativeОптимизация отображения списков в React NativeКак реализовать linking на React NativeГайд по UI-китам для React NativeГде искать elements для приложения на React NativeРабота с цветами в React Native
Открыть базу знаний

Лучшие курсы по теме

изображение курса

React Native и Expo Router

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Основы JavaScript

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий