Не удается открыть глубокую ссылку на переднем плане с React Native для iOS - PullRequest
0 голосов
/ 08 января 2019

Мы используем глубокие ссылки Firebase в собственном приложении, созданном для iOS и Android.

Пример deeplink: https://monedacacao.page.link/RifKomEk3bhNM9CW9?d=1

Ожидаемое поведение:

  1. Пользователь сканирует QR-код, содержащий глубокую ссылку в QRScannerScreen
  2. onSuccess (e) срабатывает и ссылка открывается с помощью Linking.openUr()
  3. 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)
...