跳至主要内容

Linking

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** 邮件时,**启动 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: [email protected]
tel打开电话应用,例如:tel:+123456789
sms打开短信应用,例如:sms:+123456789
https / http打开网页浏览器应用,例如:https://expo.io

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

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

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

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

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

1. 如果应用已打开,则应用处于前台并触发 Linking 'url' 事件

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

2. 如果应用尚未打开,则会打开它并将 url 作为 initialURL 传递

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


示例

打开自定义设置

发送意图(Android)

参考

方法

addEventListener()

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

通过侦听 url 事件类型并提供处理程序来向 Linking 更改添加处理程序。


canOpenURL()

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

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

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

如果无法检查 URL 是否可以打开,或者在目标 Android 11(SDK 30)上并且您没有在 AndroidManifest.xml 中指定相关的意图查询,则 Promise 在 Android 上将被拒绝。同样,在 iOS 上,如果您没有在 Info.plist 中的 LSApplicationQueriesSchemes 键中添加特定的 scheme,则 promise 将被拒绝(见下文)。

参数

名称类型描述
url
必填
string要打开的 URL。

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

此方法在 iOS 9+ 上存在限制。来自 Apple 官方文档

  • 如果您的应用链接到早期版本的 iOS 但在 iOS 9.0 或更高版本中运行,则可以最多调用此方法 50 次。达到该限制后,后续调用始终解析为 false。如果用户重新安装或升级应用,iOS 会重置限制。

从 iOS 9 开始,您的应用还需要在 Info.plist 中提供 LSApplicationQueriesSchemes 键,否则 canOpenURL() 将始终解析为 false

在目标 Android 11(SDK 30)上,您必须在 AndroidManifest.xml 中指定要处理的 scheme 的意图。可以在 此处 找到常见意图的列表。

例如,要处理 https scheme,需要在清单中添加以下内容

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

getInitialURL()

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

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

要支持 Android 上的深度链接,请参阅 https://android-docs.cn/training/app-indexing/deep-linking.html#handling-intents

当远程 JS 调试处于活动状态时,getInitialURL 可能会返回 null。禁用调试器以确保它被传递。


openSettings()

static openSettings(): Promise<void>;

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


openURL()

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 会被解析。如果用户取消打开对话框或没有为 URL 注册应用,则 promise 会被拒绝。

参数

名称类型描述
url
必填
string要打开的 URL。

如果系统不知道如何打开指定的 URL,则此方法将失败。如果您传递的是非 http(s) URL,最好先检查 canOpenURL()

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

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


sendIntent()
Android

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

使用额外信息启动 Android 意图。

参数

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