无法使用iOS的React Native打开前台的深层链接

时间:2019-01-08 15:43:31

标签: ios firebase react-native deep-linking

我们在为iOS和Android构建的React本机应用程序中使用Firebase深度链接。

示例深层链接:https://monedacacao.page.link/RifKomEk3bhNM9CW9?d=1

预期的行为:

  1. 用户扫描在QRScannerScreen中包含深层链接的QR码
  2. onSuccess (e)被触发,并使用Linking.openUr()
  3. 打开链接
  4. ReduxNavigationFirebase.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)

0 个答案:

没有答案