链接到其他应用

编辑页面

了解如何根据另一个应用的 URL scheme 从你的应用中处理并打开一个 URL。


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

通过使用目标应用的 URL,可以实现从你的应用链接到其他应用。你可以使用以下两种方法从你的应用中打开此类 URL:

使用 expo-linking API

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

下面的示例使用 Linking.openURL 在操作系统的默认浏览器中打开一个 常见 URL scheme

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="打开一个 URL" onPress={() => Linking.openURL('https://expo.dev/')} /> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, });

如果你的项目使用 Expo Router,请使用 Link 组件来打开 URL。它在原生平台上会包装一个 <Text> 组件,在 Web 上会包装一个 <a> 元素。它也使用 expo-linking API 来处理 URL scheme。

下面的示例会在操作系统的默认浏览器中打开一个 常见 URL scheme(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">打开一个 URL</Link> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, });

常见 URL schemes

内置的 URL scheme 可在所有平台上提供对核心功能的访问。以下是常用 scheme 列表:

Scheme描述示例
https / http打开网页浏览器应用。https://expo.dev
mailto打开邮件应用。mailto:support@expo.dev
tel打开电话应用。tel:+123456789
sms打开短信应用。sms:+123456789
指定 Android intent 以处理常见 URL scheme

对于 Android 11(API level 30)及以上,你必须在 AndroidManifest.xml 文件中指定应用将处理的 intent。你可以通过创建一个 config plugin来实现这一点。

下面的 config plugin 示例通过定义 intent 来启用对邮件和电话应用的链接:

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;

创建 config plugin 后,在 plugins 属性下导入自定义 config plugin

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

自定义 URL scheme

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

某些服务会提供如何使用其应用自定义 URL scheme 的文档。例如,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=查看团队成员名单&partner_deeplink=partner%3A%2F%2Fteam%2F9383

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

为 iOS 指定自定义 scheme

在 iOS 上,使用 Linking.canOpenURL 查询其他应用的链接 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
使用 Expo Go 进行测试?

对于需要稳定 URL 的应用(例如,身份验证提供方重定向),请使用带有自定义 scheme 的开发构建,而不是使用 Expo Go。有关如何创建和测试自定义 scheme 的更多详细信息,请参阅将链接指向你的应用

应用内浏览器

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

在应用内浏览器中打开 URL 的示例

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

WebBrowser 与 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="使用系统浏览器打开 URL" onPress={() => Linking.openURL('https://expo.dev')} style={styles.button} /> <Button title="使用应用内浏览器打开 URL" onPress={() => WebBrowser.openBrowserAsync('https://expo.dev')} style={styles.button} /> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, button: { marginVertical: 10, }, });

Web 上的额外链接功能

要在 Web 上提供额外的链接功能,例如右键复制或悬停预览,你可以使用 expo-router 库中的 Link 组件。

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

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

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

<A> 组件在 Web 上会渲染为 <a>,在原生平台上会渲染为一个使用 expo-linking API 的可交互 <Text>