十四、Expo 的链接与深层链接

链接

介绍

每个好的网站都以前缀为前缀https://,https这就是所谓的URL方案。不安全的网站以URL 为前缀http://,http是URL方案。我们简称为计划。

要从一个网站导航到另一个网站,您可以<a>在网络上使用锚标记()。您也可以使用window.history和等的JavaScript API window.location。

除此之外https,您可能也熟悉该mailto方式。当您打开带有该mailto方式的链接时,您的操作系统将打开已安装的邮件应用程序。如果您安装了多个邮件应用程序,那么您的操作系统可能会提示您选择一个。同样,有拨打电话和发送短信的方案。阅读下面有关内置URL方案的更多信息。

https并http通过浏览器来处理,但它可以通过使用不同的URL方案链接到其他应用程序。例如,当您从Slack收到“Magic Link”电子邮件时,“Launch Slack”按钮是一个带有href的锚标签,类似于:slack://secret/magic-login/other-secret。与Slack一样,您可以告诉操作系统您要处理自定义方案。阅读有关配置方案的更多信息。当Slack应用程序打开时,它会收到用于打开它的URL,然后可以对通过URL提供的数据进行操作 - 在这种情况下,是一个将用户登录到特定服务器的秘密字符串。这通常被称为深度链接。详细了解如何在您的应用中处理深层链接

 深层链接不是唯一可用的链接工具。常规HTTPS链接通常需要在移动设备上打开您的应用程序。例如,如果您要发送有关记录更改的通知电子邮件,则不希望在电子邮件中的链接中使用自定义URL方案,因为这样会在桌面上断开链接。相反,您希望使用常规HTTPS链接,例如https://www.myapp.io/records/123,在移动设备上,您希望该链接打开您的应用。iOS将此概念称为“通用链接”,Android将其称为“深层链接”; Expo在两个平台上都支持这些链接(有一些配置)。Expo还支持与Branch的延迟深度链接。

从您的应用链接到其他应用

内置URL方案

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


mailto打开邮件应用程序,例如: mailto: support@expo.io✅✅

tel打开手机应用,例如: tel:+123456789✅✅

sms打开短信应用,例如: sms:+123456789✅✅

https / http打开网络浏览器应用,例如: https://expo.io✅✅

从您的应用中打开链接

React Native中没有锚标记,所以我们不能写<a href="https://expo.io">,而是我们必须使用Linking.openURL。

import{Linking}from'react-native';

Linking.openURL('https://expo.io');

通常,如果没有用户请求,您就不会打开URL - 这是一个简单Anchor组件的示例,它会在按下时打开URL。

import{Linking,Text}from'react-native';exportdefaultclassAnchorextendsReact.Component{_handlePress=()=>{Linking.openURL(this.props.href);this.props.onPress&&this.props.onPress();};render(){return(<Text{...this.props}onPress={this._handlePress}>{this.props.children}</Text>);}}// <Anchor href="https://google.com">Go to Google</Anchor>// <Anchor href="mailto://support@expo.io">Email support</Anchor>

使用Expo.WebBrowser而不是Linking打开Web链接

以下示例说明了打开Web链接与Expo.WebBrowser.openBrowserAsyncReact Native 之间的区别Linking.openURL。通常WebBrowser是一个更好的选择,因为它是您的应用程序中的模式,用户可以轻松地关闭它并返回到您的应用程序。

打开其他应用的链接

如果您知道另一个应用程序的自定义方案,您可以链接到它。有些服务提供深层链接的文档,例如Lyft深层链接文档描述了如何直接链接到特定的拾取位置和目的地:

lyft://ridetype?id=lyft&pickup[latitude]=37.764728&pickup[longitude]=-122.422999&destination[latitude]=37.7763592&destination[longitude]=-122.4242038

用户可能没有安装Lyft应用程序,在这种情况下,您可能想要打开App / Play商店,或让他们知道他们需要先安装它。对于这些情况,我们建议使用库react-native-app-link

在iOS上,Linking.canOpenURL需要其他配置来查询其他应用的链接方案。您可以使用ios.infoPlist密钥app.json来指定应用程序需要查询的方案列表。例如:

"infoPlist": {"LSApplicationQueriesSchemes": ["lyft"]}

如果未指定此列表,Linking.canOpenURL则false无论设备是否安装了应用程序,都可能会返回。请注意,此配置只能在独立应用程序中进行测试,因为它需要在Expo Client中进行测试时不会应用的本机更改。

链接到您的应用

在Expo CLI中

在继续之前,值得花点时间学习如何在Expo客户端中链接到您的应用程序。Expo客户端使用该exp://方案,但如果我们exp://之后没有任何地址链接,它将打开应用程序到主屏幕。

在开发过程中,您的应用会像网址一样生活exp://wg-qka.community.app.exp.direct:80。当它被部署时,它将在一个URL上exp://exp.host/@community/with-webbrowser-redirect。如果您创建一个包含类似链接的网站<a href="exp://expo.io/@community/with-webbrowser-redirect">Open my project</a>,然后在您的设备上打开该网站并单击该链接,它将在Expo客户端中打开您的应用。您也可以使用其他应用程序链接到它Linking.openURL。

在一个独立的应用程序中

要链接到独立应用,您需要为应用指定方案。您可以app.json通过在scheme密钥下添加字符串来注册您的方案:

{"expo": {"scheme": "myapp"}}

构建独立应用程序并将其安装到设备后,您就可以通过链接打开它myapp://。

如果您的应用程序被弹出,请注意,与其他部分一样app.json,scheme在应用程序已经弹出后更改密钥将无法获得所需的效果。如果您想要在弹出的应用中更改深层链接方案,请参阅本指南

Expo.Linking 

为了省去根据您所处的环境和硬编码网址插入一堆条件的麻烦,我们在Linking模块的扩展中提供了一些辅助方法。当您想要提供一个需要重定向回应用程序的网址的服务时,您可以调用Expo.Linking.makeUrl()它,它将解析为以下内容:

在Expo客户中发布的应用:exp://exp.host/@community/with-webbrowser-redirect

独立发布的应用程序:myapp://

发展:exp://wg-qka.community.app.exp.direct:80

您还可以通过传递可选参数来更改返回的URL Expo.Linking.makeUrl()。您的应用将使用这些来接收数据,我们将在下一节中讨论这些数据。

处理链接到您的应用程序

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

1.如果应用程序已经打开,应用程序将被预先启用并触发链接事件

你可以用这些事件处理Linking.addEventListener('url', callback)。

2.如果应用程序尚未打开,则会打开该应用程序并将URL作为initialURL传入

您可以使用Linking.getInitialURL- 它返回一个Promise解析为url的事件(如果有的话)。

请参阅以下示例以查看这些示例。

通过URL将数据传递到您的应用

要将某些数据传递到您的应用中,您可以将其作为路径或查询字符串附加到您的网址上。Expo.Linking.makeUrl(path, queryParams)将自动为您构建一个工作URL。你可以像这样使用它:

letredirectUrl=Expo.Linking.makeUrl('path/into/app',{hello:'world',goodbye:'now'});

这将返回类似于myapp://path/into/app?hello=world&goodbye=now独立应用程序的东西。

使用深层链接打开应用程序时,您可以解析链接Expo.Linking.parse()以获取传入的路径和查询参数。

处理用来打开/前景您的应用程序的URL,它会是这个样子:

_handleUrl=url=>{this.setState({url});let{path,queryParams}=Expo.Linking.parse(url);alert(`Linked to app with path: ${path} and data: ${JSON.stringify(queryParams)}`);};

如果您打开了类似的URL myapp://path/into/app?hello=world&goodbye=now,则会发出警报Linked to app with path: path/into/app and data: {hello: 'world', goodbye: 'now'}。

示例:从WebBrowser链接回您的应用程序

示例项目examples / with-webbrowser-redirect演示了如何处理WebBrowser查询字符串中的重定向和从中获取数据。在世博会上试一试

示例:使用链接进行身份验证

链接到您的应用程序的常见用例是在打开WebBrowser后重定向回应用程序。例如,您可以打开登录屏幕的Web浏览器会话,当用户成功登录后,您可以使用该方案将您的网站重定向回您的应用程序,并将身份验证令牌和其他数据附加到URL。

注意:如果尝试使用Linking.openURL打开Web浏览器进行身份验证,那么Apple可能会因为用户体验不佳或令人困惑而拒绝您的应用。WebBrowser.openBrowserAsync以模态打开浏览器窗口,看起来感觉很好并且获得Apple批准。

要查看使用WebBrowserFacebook进行身份验证的完整示例,请参阅examples / with-facebook-auth。目前Facebook身份验证要求您部署一个小型网络服务器以重定向回您的应用程序(如示例中所述),因为Facebook不允许您重定向到自定义方案,Expo正在制定一个解决方案,以使您更容易。在世博会上试一试

WebBrowser可以在expo / auth0-example中找到用于身份验证的另一个示例

通用/深层链接(没有自定义方案)

常规HTTPS链接(没有自定义URL方案)通常需要在移动设备上直接打开您的应用。这允许您发送通知电子邮件,其中包含在桌面上的Web浏览器中按预期工作的链接,同时在移动设备上打开应用程序中的内容。iOS将此概念称为“通用链接”,而Android将其称为“深层链接”(但在本节中,我们专门讨论不使用自定义URL方案的深层链接)。

iOS上的通用链接

要在iOS上实施通用链接,您必须先设置您拥有自己域名的验证。这是通过从您的网络服务器提供Apple App Site Association(AASA)文件来完成的。AASA必须由/apple-app-site-association或/.well-known/apple-app-site-association(没有延期)提供。AASA包含JSON,用于指定您的Apple应用程序ID以及您的域中应由移动应用程序处理的路径列表。例如,如果您希望https://www.myapp.io/records/123移动应用程序打开该格式的链接,则您的AASA将具有以下内容:

{"applinks": {"apps": [],"details": [{"appID": "LKWJEF.io.myapp.example","paths": ["/records/*"]}]}}

这告诉iOS https://www.myapp.io/records/*应该由您的移动应用程序直接打开任何指向(与记录ID的通配符匹配)的链接。有关AASA格式的更多详细信息,请参阅Apple的文档。Branch提供了一个AASA验证器,可以帮助您确认您的AASA已正确部署并具有有效格式。

请注意,iOS会在您首次安装应用程序时以及从App Store安装更新时下载您的AASA,但不会再频繁刷新。如果您希望更改AASA中的生产应用程序路径,则需要通过App Store发布完整更新,以便所有用户的应用程序重新获取AASA并识别新路径。

部署AASA后,您还必须配置应用以使用关联的域。首先,您需要将associatedDomains 配置添加到您的app.json。其次,您需要在Apple开发人员门户上编辑您的App ID并启用“Associated Domains”应用程序服务。将服务添加到App ID后,您还需要重新生成配置文件。

此时,打开移动设备上的链接现在应该打开您的应用程序!如果没有,请重新检查前面的步骤以确保您的AASA有效,路径在AASA中指定,并且您已在Apple开发人员门户中正确配置了您的App ID。一旦您的应用程序打开,请转到处理链接到您的应用程序部分,以获取有关如何处理入站链接的详细信息,并向用户显示他们请求的内容。

Android上的深层链接

在Android上实现深层链接(没有自定义URL方案)比在iOS上更简单。您只需添加intentFilters到Android的部分你的app.json。以下基本配置将使您的应用程序在标准Android对话框中显示为处理任何记录链接的选项myapp.io:

"intentFilters": [{"action": "VIEW","data": [{"scheme": "https","host": "*.myapp.io""pathPrefix": "/records"},],"category": ["BROWSABLE","DEFAULT"]}]

您的域的链接可能需要始终打开您的应用程序(不向用户显示可以选择浏览器或其他处理程序的对话框)。您可以使用Android应用链接实现此功能,Android应用链接使用与iOS上的Universal Links类似的验证流程。首先,您必须在/.well-known/assetlinks.json指定应用ID时发布JSON文件,以及应由您的应用打开哪些链接。有关格式化此文件的详细信息,请参阅Android的文档。第二,添加"autoVerify": true到你的意图过滤器app.json; 这告诉Android检查您assetlinks.json的服务器并将您的应用程序注册为指定路径的自动处理程序:

"intentFilters": [{"action": "VIEW","autoVerify": true,"data": [{"scheme": "https","host": "*.myapp.io""pathPrefix": "/records"},],"category": ["BROWSABLE","DEFAULT"]}]

何时使用深层链接

这是设置深入链接到您的应用的最简单方法,因为它需要最少量的配置。

主要问题是,如果用户没有安装您的应用程序并且使用其自定义方案跟随指向您应用程序的链接,则他们的操作系统将指示该页面无法打开但不提供更多信息。这不是一次很棒的经历。无法在浏览器中解决此问题。

此外,许多消息传递应用程序不会使用自定义方案自动链接URL - 例如,exp://exp.host/@community/native-component-list可能只是在浏览器中显示为纯文本而不是链接(exp://exp.host/@community/native-component-list) 。

一个例子是Gmail从大多数应用程序的链接中删除href属性,使用的技巧是链接到常规https url而不是应用程序的自定义方案,这将打开用户的Web浏览器。浏览器通常不会剥离href属性,因此您可以在线托管文件,将用户重定向到应用程序的自定义方案。

因此,您可以链接到https://example.com/redirect-to-app.html而不是链接到example:// path / into / app,并且redirect-to-app.html将包含以下代码:

<script>window.location.replace("example://path/into/app");</script>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 利用代理排错 MacOS代理配置(Sierra) 如果发生了错误,您可以在系统网络设置中切到自动代理设置,使用自动...
    ladybug阅读 12,128评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 常见问题 除了下面的问题,请参阅Hashnode的Expo论坛或AMA博览会,了解更多常见问题和答案。 需要多少钱...
    万能的JS阅读 5,084评论 1 0
  • 通过一个例子了解Java中子父类各方法执行顺序: public class Sequence { public s...
    剧透下阅读 217评论 0 0
  • 痛风属于慢性病,发做起来很难忍受! 痛风症状是手指,脚趾,膝,肘等关节疼痛肿胀,甚至变形️ 艾灸是慢功夫,要调理身...
    馨漪_a926阅读 578评论 0 0