Otwórz adres URL w domyślnej przeglądarce internetowej

90

Jestem nowy w React-Native i chcę otworzyć adres URL w domyślnej przeglądarce, takiej jak Chrome na Androida i iPhone'a .

Otwieramy adres URL przez intencję w systemie Android, tak samo jak funkcjonalność, którą chcę osiągnąć.

Szukałem wiele razy, ale da mi to wynik Deepklinking .

Mohit Suthar
źródło

Odpowiedzi:

211

Powinieneś użyć Linking.

Przykład z dokumentów:

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>
    );
  }
}

Oto przykład, który możesz wypróbować na 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',
  },
});
RRikesh
źródło
@RajKumarN, jak by to działało, jeśli masz aplikację, która przechwytuje artykuły z wiadomościami i chcesz otwierać hiperłącza do artykułów z wiadomościami w osobnej przeglądarce?
Daniel
Sprawdź to, facebook.github.io/react-native/docs/… . To może być pomocne @Daniel
Raj Kumar N
@RajKumarN Jak możemy otworzyć zewnętrzny adres URL wewnątrz aplikacji bez przekierowywania do przeglądarki?
LazyCoder
9

Prostszy sposób, który eliminuje sprawdzanie, czy aplikacja może otworzyć adres URL.

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

Nazywanie go przyciskiem.

<Button title="Open in Browser" onPress={this.loadInBrowser} />
SPRZĘGŁO
źródło
1
Jak obsługiwać wartości null? powiedzmy, że otrzymuję adres URL z zaplecza, ale zwrócił on wartość null zamiast ciągu, aplikacja ulega awarii.
ASN
2
@ASN Dokonujesz tego sprawdzenia przed przekazaniem tego adresu URL do openURLmetody. Na przykład: If (this.state.url) Linking.openURL(this.state.url). Możesz także użyć klauzuli catch, jeśli nie chcesz sprawdzać wcześniej.
CLUTCHER
1
Tak właśnie sobie z tym poradziłem. Dziękuję :)
ASN
Cześć! Tylko pytanie, co sugerujesz zrobić dla Androida, jeśli aplikacja jest domyślnie wybrana do otwierania i muszę otworzyć ten sam link, ale w przeglądarce?
Andriy Khlopyk
proste, krótkie, przydatne rozwiązanie, czy możesz skomentować to pokazuje pusty ekran, gdy wracam ręcznie z przeglądarki do aplikacji.
ganeshdeshmukh
1

W React 16.8+, używając komponentów funkcjonalnych, zrobiłbyś to

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>
  )
}
wp-overwatch.com
źródło