Linking
参考文档
仅适用于原生代码项目 以下部分仅适用于公开了本机代码的项目。如果您使用的是托管的expo-cli工作流程,请参阅Expo文档中有关链接的指南以获取适当的替代方法。
Linking提供了一个通用的接口来与引入和传出的App链接进行交互。
每个链接(URL)都有一个URL方案,某些网站以https://或http://开头,而http是URL方案。我们简称为“方案”。
除https之外,您可能还熟悉mailto方案。当您打开带有mailto方案的链接时,您的操作系统将打开一个已安装的邮件应用程序。同样,也有拨打电话和发送SMS的方案。在下面阅读有关内置URL方案的更多信息。
像使用mailto方案一样,可以通过使用自定义url方案链接到其他应用程序。例如,当您从Slack收到Magic Link电子邮件时,Launch Slack按钮是一个带有href的锚标记,其外观类似于:slack:// secret / magic-login / other-secret。与Slack一样,您可以告诉操作系统您要处理自定义方案。当Slack应用程序打开时,它会收到用于打开它的URL。这通常称为深层链接。阅读有关如何深入链接到您的应用程序的更多信息。
自定义URL方案不是在移动设备上打开应用程序的唯一方法。您不想在电子邮件的链接中使用自定义URL方案,因为这样链接将在桌面上断开。相反,您希望使用常规的https链接,例如https://www.myapp.io/records/1234546。在移动设备上,您希望该链接打开您的应用。 Android将其称为“深层链接”(Universal Links-iOS)。
内置URL方案 如简介中所述,每个平台上都有一些用于核心功能的URL方案。以下是非详尽列表,但涵盖了最常用的方案。
查看 Props
继承了所有View Props.
SCHEME | 描述 | IOS | Android |
---|---|---|---|
mailto | Open mail app, eg: mailto: support@expo.io | 支持 | 支持 |
tel | Open phone app, eg: tel:+123456789 | 支持 | 支持 |
sms | Open SMS app, eg: sms:+123456789 | 支持 | 支持 |
Open SMS app, eg: sms:+123456789 | Open web browser app, eg: https://expo.io | 支持 | 支持 |
方法
constructor()
constructor();
addEventListener()
addEventListener(type, handler);
添加一个监听 Linking 变化的事件。type 参数应填url,并提供一个处理函数。
removeEventListener()
removeEventListener(type, handler);
删除一个事件处理函数。type 参数应填url。
openURL()
openURL(url);
尝试使用设备上已经安装的应用打开指定的url。
你还可以使用其他类型的 URL,比如一个地理位置(形如"geo:37.484847,-122.148386"或是一个通讯录名片,只要是可以通过已安装的应用打开的即可。
本方法会返回一个Promise对象。如果用户在弹出的对话框中点击了确认或是 url 自动打开了,则 promise 成功完成。如果用户在弹出的对话框中点击取消或是没有对应应用可以处理此类型的 url,则 promise 会失败。
参数:
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
url | string | 是 | 要打开的url |
如果系统不知道如何处理给定的 URL,则此方法会调用失败。如果你传入的 URL 不是一个 http 链接,则最好先通过{@code canOpenURL}方法检查一下。
对于 web 链接来说,协议头("http://", "https://")不能省略!
此方法在模拟器中的行为可能有所不同,例如 由于无法访问Dialer应用程序,因此无法在iOS模拟器中处理“ tel:”链接。
canOpenURL()
canOpenURL(url);
判断设备上是否有已经安装的应用可以处理指定的 URL。
本方法会返回一个Promise对象。当确定传入的 URL 可以被处理时,promise 就会返回,值的第一个参数是表示是否可以打开 URL。
如果无法检查是否可以打开URL,则Promise将在Android上拒绝;如果未在Info.plist的LSApplicationQueriesSchemes键中添加特定方案,则Promise将在iOS上拒绝(请参见下面的内容)。
参数:
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
url | string | 是 | 要打开的url |
对于 iOS 9 来说,你需要在Info.plist中添加LSApplicationQueriesSchemes字段,否则canOpenURL可能一直返回 false。
此方法在iOS 9+上具有局限性。 从Apple官方文档中:
如果您的应用程序与早期版本的iOS链接,但在iOS 9.0或更高版本中运行,则您最多可以调用此方法50次。 达到该限制后,后续调用将始终返回false。 如果用户重新安装或升级应用程序,iOS会重置限制。
openSettings()
openSettings();
打开“设置”应用程序,并显示该应用程序的自定义设置(如果有)。
getInitialURL()
getInitialURL();
如果应用是被一个链接调起的,则会返回相应的链接地址。否则它会返回null。
如果要在 Android 上支持深度链接,请参阅http://developer.android.com/training/app-indexing/deep-linking.html#handling-intents
sendIntent()
sendIntent(action: string, extras?: Array<{key: string, value: string | number | boolean}>)
@platform android仅限Android。 启动带有附加功能的Android Intent(可选)
Example
示例
import React, { useCallback } from "react";
import { Alert, Button, Linking, StyleSheet, View } from "react-native";
const supportedURL = "https://google.com";
const unsupportedURL = "slack://open?team=123456";
const OpenURLButton = ({ url, children }) => {
const handlePress = useCallback(async () => {
// Checking if the link is supported for links with custom URL scheme.
const supported = await Linking.canOpenURL(url);
if (supported) {
// Opening the link with some app, if the URL scheme is "http" the web link should be opened
// by some browser in the mobile
await Linking.openURL(url);
} else {
Alert.alert(`Don't know how to open this URL: ${url}`);
}
}, [url]);
return <Button title={children} onPress={handlePress} />;
};
const App = () => {
return (
<View style={styles.container}>
<OpenURLButton url={supportedURL}>Open Supported URL</OpenURLButton>
<OpenURLButton url={unsupportedURL}>Open Unsupported URL</OpenURLButton>
</View>
);
};
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: "center", alignItems: "center" },
});
export default App;