Ouvrir l'URL dans le navigateur Web par défaut


90

Je suis nouveau dans React-Native et je souhaite ouvrir l' URL dans le navigateur par défaut comme Chrome sous Android et iPhone .

Nous ouvrons l'URL via l'intention dans Android comme la fonctionnalité que je souhaite atteindre.

J'ai cherché plusieurs fois mais cela me donnera le résultat de Deepklinking .

Réponses:


212

Vous devriez utiliser Linking.

Exemple tiré de la documentation:

class OpenURLButton extends React.Component {
  static propTypes = { url: React.PropTypes.string };
  handleClick = () => {
    Linking.canOpenURL(this.props.url).then(supported => {
      if (supported) {
        Linking.openURL(this.props.url);
      } else {
        console.log("Don't know how to open URI: " + this.props.url);
      }
    });
  };
  render() {
    return (
      <TouchableOpacity onPress={this.handleClick}>
        {" "}
        <View style={styles.button}>
          {" "}<Text style={styles.text}>Open {this.props.url}</Text>{" "}
        </View>
        {" "}
      </TouchableOpacity>
    );
  }
}

Voici un exemple que vous pouvez essayer sur Expo Snack :

import React, { Component } from 'react';
import { View, StyleSheet, Button, Linking } from 'react-native';
import { Constants } from 'expo';

export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
       <Button title="Click me" onPress={ ()=>{ Linking.openURL('https://google.com')}} />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
  },
});

@RajKumarN, comment cela fonctionnerait-il si vous avez une application qui saisit des articles de presse et que vous souhaitez ouvrir les hyperliens des articles de presse dans un navigateur séparé?
Daniel

Vérifiez ceci, facebook.github.io/react-native/docs/… . Cela peut être utile @Daniel
Raj Kumar N

@RajKumarN Comment pouvons-nous ouvrir l'URL externe à l'intérieur de l'application sans rediriger vers le navigateur?
LazyCoder

9

Un moyen plus simple qui évite de vérifier si l'application peut ouvrir l'URL.

  loadInBrowser = () => {
    Linking.openURL(this.state.url).catch(err => console.error("Couldn't load page", err));
  };

L'appel avec un bouton.

<Button title="Open in Browser" onPress={this.loadInBrowser} />

1
Comment gérer les valeurs nulles? disons que je reçois une URL du backend mais qu'elle a renvoyé null au lieu d'une chaîne, l'application plante.
ASN le

2
@ASN Vous effectuez cette vérification avant de transmettre cette URL à la openURLméthode. Par exemple: If (this.state.url) Linking.openURL(this.state.url). Vous pouvez également utiliser la clause catch si vous ne souhaitez pas vérifier avant.
CLUTCHER

1
Ouais c'est comme ça que j'ai géré ça. Merci :)
ASN

Salut! Juste une question, que suggérez-vous de faire pour Android si l'application est sélectionnée pour s'ouvrir par défaut et que j'ai besoin d'ouvrir le même lien mais dans le navigateur?
Andriy Khlopyk le

solution simple, courte et utile, pouvez-vous en commenter un écran vide lorsque je reviens manuellement du navigateur à l'application.
ganeshdeshmukh le

1

Dans React 16.8+, en utilisant des composants fonctionnels, vous feriez

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

const ExternalLinkBtn = (props) => {
  return <Button
            title={props.title}
            onPress={() => {
                Linking.openURL(props.url)
                .catch(err => {
                    console.error("Failed opening page because: ", err)
                    alert('Failed to open page')
                })}}
          />
}

export default function exampleUse() {
  return (
    <View>
      <ExternalLinkBtn title="Example Link" url="https://example.com" />
    </View>
  )
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.