Мы используем глубокие ссылки Firebase в собственном приложении, созданном для iOS и Android.
Пример deeplink: https://monedacacao.page.link/RifKomEk3bhNM9CW9?d=1
Ожидаемое поведение:
- Пользователь сканирует QR-код, содержащий глубокую ссылку в
QRScannerScreen
onSuccess (e)
срабатывает и ссылка открывается с помощью Linking.openUr()
- In
ReduxNavigation
Firebase.links().onLink()
запускается и перенаправляет пользователя на SendDestinataryScreen
Фактическое поведение
В Android это работает как задумано, но на iOS Linking.openURL(e.data)
открывает браузер с резервной ссылкой Firebase вместо запуска действия Firebase.links.onLin()
.
Если ссылка нажата снаружи приложения, она ведет себя так, как задумано. Так что эта проблема возникает только при открытии ссылки изнутри приложения.
QRScannerScreen.js
...
onSuccess (e) {
Linking
.openURL(e.data)
.catch(err => console.error('An error occured', err))
}
...
ReduxNavigation.js
import React from 'react'
import { BackHandler, Platform } from 'react-native'
import { addNavigationHelpers, NavigationActions } from 'react-navigation'
import { createReduxBoundAddListener } from 'react-navigation-redux-helpers'
import { connect } from 'react-redux'
import firebase from 'react-native-firebase'
import AppNavigation from './AppNavigation'
class ReduxNavigation extends React.Component {
constructor (props) {
super(props)
// handle deeplinking
firebase.links().onLink((url) => {
console.log('URL', url)
if (this.props.token) {
this.props.dispatch(NavigationActions.push({
routeName: 'SendDestinataryScreen',
params: { link: url }
}))
} else {
this.props.dispatch(NavigationActions.push({
routeName: 'LoginScreen'
}))
}
})
}
componentDidMount () {
if (Platform.OS === 'ios') return
BackHandler.addEventListener('hardwareBackPress', () => {
const { dispatch, nav } = this.props
// change to whatever is your first screen, otherwise unpredictable results may occur
if (nav.routes.length === 1 && (nav.routes[0].routeName === 'LaunchScreen')) {
return false
}
// if (shouldCloseApp(nav)) return false
dispatch({ type: 'Navigation/BACK' })
return true
})
}
componentWillUnmount () {
if (Platform.OS === 'ios') return
BackHandler.removeEventListener('hardwareBackPress')
}
render () {
return <AppNavigation navigation={addNavigationHelpers({ dispatch: this.props.dispatch, state: this.props.nav, addListener: createReduxBoundAddListener('root') })} />
}
}
const mapStateToProps = state => ({ nav: state.nav, token: state.authentication.token })
export default connect(mapStateToProps)(ReduxNavigation)