В этом руководстве мы настроим наше приложение для обработки внешних URI. Предположим, мы хотим, чтобы URI типа myapp://character/cool_rick
открывал наше приложение и ссылался прямо на экран персонажа с именем «cool_rick
».
Начнем с создания нового проекта.
react-native init deep_linking
Теперь нам нужно установить react-navigation
react-navigation-stack
,react-native-gesture-handler
в наш проектс помощью npm или yarn.
yarn add react-navigation yarn add react-navigation-stack yarn add react-native-gesture-handler or with npm npm install react-navigation npm install react-navigation-stack npm install react-native-gesture-handler
React Native 0.60 и выше
В более новых версиях React Native связывание выполняется автоматически.
Чтобы выполнить связывание на iOS, убедитесь, что у вас установлен Cocoapods. Затем запустите:
cd ios pod install cd ..
Теперь мы запускаем наше приложение
IOS
react-native run-ios
Андроид
react-native run-android
Теперь, когда наше приложение запущено, мы создаем маршрутизатор и два представления: домашнее представление и представление персонажа.
deep_linking ├── app │ ├── character │ │ └── index.js │ ├── index.js │ ├── router │ │ └── index.js │ └─- index.js │...
в app/router/index.js
мы создаем навигацию следующим образом:
В app/index.js
создаем представление, в котором будем видеть символы, которые получим из characters.json
Если все хорошо, у нас должно получиться что-то подобное.
Теперь мы переходим к app/character/index.js
и создаем представление, в котором мы собираемся показывать каждый символ.
При этом наше приложение должно работать следующим образом
Что мы делали до сих пор.
мы создали новый проект.
мы устанавливаем некоторые пакеты, такие как react-navigation, для настройки нашего маршрутизатора.
мы создали 2 представления, в которых показывали список персонажей и детали каждого персонажа.
Теперь, когда у нас есть работающее приложение и все, что необходимо, нужно настроить наше приложение в IOS и Android, чтобы включить прямые ссылки.
Настройка iOS
In deep_linking/ios/deep_linking/AppDelegate.m
:
// Add the header at the top of the file: #import <React/RCTLinkingManager.h> // Add this above the `@end`: - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { return [RCTLinkingManager application:app openURL:url options:options]; }
В deep_linking/ios/deep_linking/Info.plist
. мы вставляем следующий код
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>deeplinking</string> </array> </dict> </array>
С этим мы можем протестировать наше приложение, открыв нашу ссылку
react-native start --reset-cache react-native run-ios
мы тестируем URI на симуляторе, выполняя следующее:
xcrun simctl openurl booted deeplinking://character/?id=1
Настройка Android
В deep_linking/android/app/src/main/AndroidManifest.xml
мы добавляем фильтр намерений под последним фильтром намерений внутри тега ‹activity›:
<intent-filter android:label="filter_react_native"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="deeplinking" /> </intent-filter>
мы тестируем URI на симуляторе, выполняя следующее:
adb shell am start -W -a android.intent.action.VIEW -d "deeplinking://character/?id=1" com.deep_linking
Окончательный код для этого примера можно найти здесь.