跳到主要内容

链接

Linking 为您提供了一个通用接口,用于处理传入和传出的应用链接。

每个链接 (URL) 都有一个 URL Scheme,有些网站以 https://http:// 为前缀,这里的 http 就是 URL Scheme。我们简称为 scheme。

除了 https,您可能还熟悉 mailto scheme。当您打开带有 mailto scheme 的链接时,您的操作系统将打开已安装的邮件应用程序。同样,也有用于拨打电话和发送短信的 scheme。请在下方阅读更多关于 内置 URL scheme 的信息。

就像使用 mailto scheme 一样,也可以使用自定义 url scheme 链接到其他应用程序。例如,当您收到来自 Slack 的 Magic Link 电子邮件时,Launch Slack 按钮是一个锚标签,其 href 看起来像这样:slack://secret/magic-login/other-secret。与 Slack 一样,您可以告诉操作系统您想要处理自定义 scheme。当 Slack 应用打开时,它会收到用于打开它的 URL。这通常称为深度链接。阅读更多关于如何 获取深度链接 到您的应用的信息。

自定义 URL scheme 不是在移动设备上打开应用程序的唯一方式。例如,如果您想通过电子邮件发送一个在移动设备上打开的链接,使用自定义 URL scheme 并不理想,因为用户可能在桌面上打开电子邮件,那里链接将无法工作。相反,您应该使用标准的 https 链接,例如 https://www.myapp.io/records/1234546。在移动设备上,这些链接可以配置为打开您的应用。在 Android 上,此功能称为 深度链接,而在 iOS 上,它被称为 通用链接

内置 URL Scheme

正如引言中提到的,每个平台上都存在一些用于核心功能的 URL scheme。以下是一个非详尽的列表,但涵盖了最常用的 scheme。

Scheme描述iOSAndroid
mailto打开邮件应用,例如:mailto: hello@world.dev
tel打开电话应用,例如:tel:+123456789
sms打开短信应用,例如:sms:+123456789
https / http打开网页浏览器应用,例如:https://expo.dev

启用深度链接

如果您想在应用中启用深度链接,请阅读以下指南:

信息

有关如何在 Android 上添加深度链接支持的说明,请参阅 为应用内容启用深度链接 - 为您的深度链接添加 Intent 过滤器

如果您希望在现有的 MainActivity 实例中接收 intent,您可以在 AndroidManifest.xml 中将 MainActivity 的 launchMode 设置为 singleTask。有关更多信息,请参阅 <activity> 文档。

xml
<activity
android:name=".MainActivity"
android:launchMode="singleTask">

处理深度链接

有两种方法可以处理打开您应用的 URL。

1. 如果应用已经打开,应用会被置于前台并触发 Linking 'url' 事件

您可以使用 Linking.addEventListener('url', callback) 处理这些事件 - 它会使用链接的 URL 调用 callback({url})

2. 如果应用尚未打开,它会被打开并且 url 会作为 initialURL 传入

您可以使用 Linking.getInitialURL() 处理这些事件 - 它返回一个 Promise,如果有的话,该 Promise 会解析为 URL。


示例

打开链接和深度链接(通用链接)

打开自定义设置

获取深度链接

发送 Intents (Android)

参考

方法

addEventListener()

tsx
static addEventListener(
type: 'url',
handler: (event: {url: string}) => void,
): EmitterSubscription;

通过监听 url 事件类型并提供处理程序,为 Linking 变更添加一个处理程序。


canOpenURL()

tsx
static canOpenURL(url: string): Promise<boolean>;

确定已安装的应用是否可以处理给定的 URL。

该方法返回一个 Promise 对象。当确定给定的 URL 是否可以被处理时,promise 会被 resolve,第一个参数表示是否可以打开。

如果在 Android 上无法检查 URL 是否可以打开,或者当目标为 Android 11 (SDK 30) 时未在 AndroidManifest.xml 中指定相关的 intent queries,Promise 将会 reject。类似地,在 iOS 上,如果未在 Info.plist 内的 LSApplicationQueriesSchemes 键中添加特定的 scheme,promise 将会 reject(见下文)。

参数:

名称类型描述
url
必需
string要打开的 URL。
备注

对于 Web URL,必须相应地设置协议("http://", "https://")!

注意

此方法在 iOS 9+ 上有限制。根据 Apple 官方文档

  • 如果你的应用链接的是较早版本的 iOS 但在 iOS 9.0 或更高版本上运行,你最多可以调用此方法 50 次。达到该限制后,后续调用始终 resolve 为 false。如果用户重新安装或升级应用,iOS 会重置限制。
  • 自 iOS 9 起,你的应用还需要在 Info.plist 中提供 LSApplicationQueriesSchemes 键,否则 canOpenURL() 将始终 resolve 为 false
信息

当目标为 Android 11 (SDK 30) 时,你必须在 AndroidManifest.xml 中指定想要处理的 scheme 的 intents。常见 intents 列表可以在 这里 找到。

例如,要处理 https schemes,需要将以下内容添加到你的 manifest 中:

<manifest ...>
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https"/>
</intent>
</queries>
</manifest>

getInitialURL()

tsx
static getInitialURL(): Promise<string | null>;

如果应用启动是由应用链接触发的,它将提供链接 url,否则将提供 null

提示

getInitialURL 在启用 Remote JS Debugging 时可能返回 null。禁用调试器以确保它能正常传递。


openSettings()

tsx
static openSettings(): Promise<void>;

打开设置应用并显示应用的自定义设置(如果有的话)。


openURL()

tsx
static openURL(url: string): Promise<any>;

尝试使用任何已安装的应用打开给定的 url

你可以使用其他 URL,例如位置(例如 Android 上的 "geo:37.484847,-122.148386" 或 iOS 上的 "https://maps.apple.com/?ll=37.484847,-122.148386")、联系人,或任何已安装应用可以打开的其他 URL。

该方法返回一个 Promise 对象。如果用户确认打开对话框或 url 自动打开,promise 会被 resolve。如果用户取消打开对话框或没有为该 url 注册的应用,promise 会被 reject。

参数:

名称类型描述
url
必需
string要打开的 URL。
备注

如果系统不知道如何打开指定的 URL,此方法将失败。如果你传入的是非 http(s) URL,最好先检查 canOpenURL()。对于 Web URL,必须相应地设置协议("http://", "https://")!

注意

此方法在模拟器中的行为可能不同,例如 "tel:" 链接无法在 iOS 模拟器中处理,因为无法访问拨号器应用。


sendIntent()
Android

tsx
static sendIntent(
action: string,
extras?: Array<{key: string; value: string | number | boolean}>,
): Promise<void>;

启动带有 extras 的 Android intent。

参数:

名称类型
action
必需
string
extrasArray<{key: string, value: string | number | boolean}>