链接到其他应用

编辑

了解如何根据其他应用的 URL scheme,在你的应用中处理并打开一个 URL。


通过使用目标应用的 URL,可以实现从你的应用跳转到其他应用。你可以使用两种方法在你的应用中打开这些 URL:

使用 expo-linking API

expo-linking API 提供对原生 linking API(例如 Web 上的 window.history)的通用抽象,并为你的应用与其他已安装应用交互提供实用工具。

下面的示例使用 通用 URL 方案在操作系统的默认浏览器中打开,并使用 Linking.openURL

index.tsx
import { Button, View, StyleSheet } from 'react-native'; import * as Linking from 'expo-linking'; export default function Home() { return ( <View style={styles.container}> <Button title="Open a URL" onPress={() => Linking.openURL('https://expo.dev/')} /> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, });

使用 Expo Router 的 Link 组件

如果你的项目使用 Expo Router,请使用 Link 组件来打开 URL。它在本地平台上包装一个 <Text> 组件,在网页上则是一个 <a> 元素。它还使用 expo-linking API 来处理 URL 方案。

下面的示例在操作系统的默认浏览器中打开一个 常见的 URL 方案 (HTTPS):

index.tsx
import { Button, View, StyleSheet } from 'react-native'; import { Link } from 'expo-router'; export default function Home() { return ( <View style={styles.container}> <Link href="https://expo.dev">Open a URL</Link> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, });

常用的 URL 方案

在所有平台上都内置了提供核心功能访问的 URL 方案。以下是常用的一些方案列表:

方案描述示例
https / http打开网页浏览器应用。https://expo.dev
mailto打开邮件应用。mailto:support@expo.dev
tel打开电话应用。tel:+123456789
sms打开短信应用。sms:+123456789
Specify Android intents to handle common URL schemes

对于 Android 11(API 30)及更高版本,您必须在 AndroidManifest.xml 文件中指定应用将要处理的 intents。您可以通过 创建一个配置插件 来实现。

以下的配置插件示例通过定义 intents 来实现链接到邮件和电话应用。

my-plugin.ts
import { withAndroidManifest, ConfigPlugin } from 'expo/config-plugins'; const withAndroidQueries: ConfigPlugin = config => { return withAndroidManifest(config, config => { config.modResults.manifest.queries = [ { intent: [ { action: [{ $: { 'android:name': 'android.intent.action.SENDTO' } }], data: [{ $: { 'android:scheme': 'mailto' } }], }, { action: [{ $: { 'android:name': 'android.intent.action.DIAL' } }], }, ], }, ]; return config; }); }; module.exports = withAndroidQueries;

在创建配置插件之后,在 导入自定义配置插件 ,并将其放在 plugins 属性下:

app.json
{ "expo": { "plugins": [ "./my-plugin.ts" %%placeholder-start%%... %%placeholder-end%% ] } }
提示:在 Android 上,你可以使用 expo-intent-launcher 打开设备上的特定设置屏幕。请参阅 expo-intent-launcher API reference 以查看可用 intents 的列表。

Custom URL schemes

如果你知道要打开的应用的自定义 scheme,可以通过以下任一方法链接到它: 使用 expo-linking API使用 Expo Router 的 Link

一些服务提供有关如何使用其应用自定义 URL 方案的文档。例如,Uber 的深度链接文档 描述了如何直接链接到特定的取车地点和目的地:

uber://?client_id=<CLIENT_ID>&action=setPickup&pickup[latitude]=37.775818&pickup[longitude]=-122.418028&pickup[nickname]=UberHQ&pickup[formatted_address]=1455%20Market%20St%2C%20San%20Francisco%2C%20CA%2094103&dropoff[latitude]=37.802374&dropoff[longitude]=-122.405818&dropoff[nickname]=Coit%20Tower&dropoff[formatted_address]=1%20Telegraph%20Hill%20Blvd%2C%20San%20Francisco%2C%20CA%2094133&product_id=a1111c8c-c720-46c3-8534-2fcdd730040d&link_text=View%20team%20roster&partner_deeplink=partner%3A%2F%2Fteam%2F9383

在上面的示例中,如果用户的设备上没有安装 Uber 应用,你的应用可以引导他们前往 Google Play 商店或 Apple App Store 进行安装。我们建议使用 react-native-app-link 库来处理这些场景。

Specify custom schemes for iOS

在 iOS 上,使用 Linking.canOpenURL 来查询其他应用的 linking scheme 需要在 InfoPlist 中进行额外配置。你可以在应用配置中使用 ios.infoPlist 属性来指定允许查询的 scheme 列表。例如:

app.json
{ "expo": { "ios": { "infoPlist": { "LSApplicationQueriesSchemes": ["uber"] } } } }

如果你没有指定这份列表,Linking.canOpenURL 可能在设备已安装目标应用时返回 false

提示 :要在 iOS 设备上测试上述配置,请 使用开发构建 。不能使用 Expo Go 进行测试。

创建 URL

你可以使用 Linking.createURL 来创建一个可用于打开或重定向回你的应用的 URL。此方法解析为以下内容:

  • 生产与开发版本myapp://,其中 myapp 是在应用配置中定义的 自定义 scheme
  • 在 Expo Go 中开发exp://127.0.0.1:8081

使用 Linking.createURL 可以帮助你避免硬编码 URL。通过向该方法传递可选参数,可以修改返回的 URL。

要将数据传递给应用程序,可以将数据作为路径或查询字符串追加到 URL。Linking.createURL 将自动构建一个可工作的 URL。例如:

Example
const redirectUrl = Linking.createURL('path/into/app', { queryParams: { hello: 'world' }, });

这将根据环境解析为以下内容:

  • 生产和开发构建myapp://path/into/app?hello=world
  • 在 Expo Go 中开发exp://127.0.0.1:8081/--/path/into/app?hello=world
Using Expo Go for testing?

对于需要稳定 URL 的应用(例如认证提供商重定向),请使用自定义方案的开发构建,而不是使用 Expo Go。有关如何创建和测试自定义方案的更多详细信息,请参见 Linking into your app

应用内浏览器

expo-linking API 允许你使用操作系统默认的网页浏览器应用打开一个 URL。你可以使用 expo-web-browser 库在应用内浏览器中打开 URL。例如,应用内浏览器对于安全的 认证 很有用。

Example of opening a URL in an in-app browser

下面的示例通过 expo-web-browser 模拟在应用内浏览器中打开 URL 的行为,并使用 expo-linking 打开默认或首选网页浏览器:

WebBrowser compared to Linking
import { Button, View, StyleSheet } from 'react-native'; import * as Linking from 'expo-linking'; import * as WebBrowser from 'expo-web-browser'; export default function Home() { return ( <View style={styles.container}> <Button title="Open URL with the system browser" onPress={() => Linking.openURL('https://expo.dev')} style={styles.button} /> <Button title="Open URL with an in-app browser" onPress={() => WebBrowser.openBrowserAsync('https://expo.dev')} style={styles.button} /> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, button: { marginVertical: 10, }, });

在网页上提供更多链接功能

要在网页上提供更多链接功能,例如右键复制或悬停预览,您可以使用来自 expo-router 库的 Link 组件。

index.tsx
import { Link } from 'expo-router'; export default function Home() { return <Link href="https://expo.dev">Go to Expo</Link>; }

或者,你也可以使用 @expo/html-elements 库来使用一个通用的 <A> 元素:

index.tsx
import { A } from '@expo/html-elements'; export default function Home() { return <A href="https://expo.dev">Go to Expo</A>; }

<A> 组件在网页上渲染一个 <a>,在原生平台上则使用 expo-linking API 的交互式 <Text>