This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
链接到其他应用
编辑页面
了解如何根据另一个应用的 URL scheme 从你的应用中处理并打开一个 URL。
通过使用目标应用的 URL,可以实现从你的应用链接到其他应用。你可以使用以下两种方法从你的应用中打开此类 URL:
- 使用
expo-linkingAPI - 使用 Expo Router 的
Link组件。
使用 expo-linking API
expo-linking API 在原生链接 API 之上提供了通用抽象(例如 Web 上的 window.history),并提供了让你的应用与其他已安装应用交互的实用工具。
下面的示例使用 Linking.openURL 在操作系统的默认浏览器中打开一个 常见 URL scheme:
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 组件
如果你的项目使用 Expo Router,请使用 Link 组件来打开 URL。它在原生平台上会包装一个 <Text> 组件,在 Web 上会包装一个 <a> 元素。它也使用 expo-linking API 来处理 URL scheme。
下面的示例会在操作系统的默认浏览器中打开一个 常见 URL scheme(HTTPS):
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 来启用对邮件和电话应用的链接:
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:
{ "expo": { "plugins": [ "./my-plugin.ts" %%placeholder-start%%... %%placeholder-end%% ] } }
提示:在 Android 上,你可以使用expo-intent-launcher打开设备上的特定设置页面。请参阅expo-intent-launcherAPI 参考查看可用 intent 列表。
自定义 URL scheme
如果你知道想要打开的应用的自定义 scheme,你可以使用以下任一方法链接到它:使用
expo-linkingAPI 或 使用 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 列表。例如:
{ "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。例如:
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 的行为:
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 组件。
import { Link } from 'expo-router'; export default function Home() { return <Link href="https://expo.dev">前往 Expo</Link>; }
或者,你可以使用 @expo/html-elements 库来使用通用的 <A> 元素:
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>。