iOS上的通用链接和深度链接(URL方案)

55

阅读中得知,iOS 9 推出了通用链接(Universal Links)。在苹果公司的App Search Programming Guide 的“支持通用链接”部分中,它说这与 URL 方案深度链接并不完全相同,但我对这个话题还不是很清楚:

  • 通用链接和 URL 方案之间的区别是什么?是通用链接仅适用于网站中的超链接以及邮件或消息应用吗?
  • 通用链接取代了 URL 方案吗?
  • 通用链接是什么类型的深度链接?

1
你需要多了解一下。我会尽可能简单地解释。当你定义一个URL方案时,你的应用程序会响应该方案,例如,你创建了一个名为myapp://的方案。所有以你的方案开头的链接都将直接启动你的应用程序。通用链接不包括你的方案在URL中,但它们仍然可以启动你的应用程序。 - iOSAddicted
4个回答

96

简述:

通用链接和URL Scheme之间的区别是什么?通用链接只适用于网站上的超链接、邮件或信息应用吗?

通用链接是苹果特定的基于操作系统的URL,将网站URL与应用程序特定的URI Scheme和路由绑定在一起。它并不适用于所有应用程序 - 因为应用程序必须支持此行为。有一个很好的列表可以查看目前ULs的工作方式(这里)。

通用链接也存在许多问题,在文章结尾我会进行概述。请参阅下面的长篇阅读。

通用链接是否取代了URL Scheme?

不是。它们是iOS Safari上强制替换URI Scheme和路由的技术。您必须并且应该仍然支持您的应用程序的URI Scheme和路由,因为Android和iOS Chrome仍然使用此技术,每个主要的链接供应商从归因到电子邮件都使用此技术。

通用链接是否是深层链接的一种?

是和否。通用链接本身不是通用深层链接 - 例如,它们无法通过安装过程进行路由。但当用户拥有应用程序时,他们可以进行深度链接。最好根据链接的功能来考虑所有链接,而不是将URL分类为“深层链接”和“非深层链接”。

许多链接根据用户是否拥有应用程序以及上下文(浏览器、应用程序、操作系统、操作系统版本等)展现出深度链接的行为。改变思考方式。

跟踪通用链接

在以下文档中,我概述了通用链接的各个方面。需要指出的是,continueUserActivity将报告来自通用链接的引荐URL,因此您可以使用它来归因打开。

由于UL不是普通链接,如果您有重定向,那么它将被破坏。同样,如果您关闭重定向,则您拥有的任何网站点击服务器都将无法访问。这是另一个讨论的问题,但需要注意。

下面是有关通用链接的许多有用信息。

URI方案

大多数人都熟悉URI方案。 URI是通用资源标识符(link)。可以将URI分配给移动应用程序。输入URI,例如airbnb://,将尝试在设备上定位应用程序资源Airbnb。

在通用链接或应用程序链接存在之前(即iOS 9.3 / Android 6.0之前),人们需要使用“自定义URI方案”和形式为airbnb:// d / listing / 530250 的路由来深入链接用户到移动应用程序中的特定内容(在这种情况下是列表)。但是,这既不安全,也不能处理用户未安装应用程序的情况(没有备用方案)。大多数归因合作伙伴(Appsflyer,Kochava,Button,Yozio,Branch等)的工作方式是提供处理此问题的链接。

当用户访问此URL页面时,会有一些JavaScript设置一个计时器,然后尝试使用简单的JavaScript从浏览器启动URI方案。
window.location.href(...)

如果计时器到期前未打开应用程序,则供应商可能会认为手机不包含该应用程序,因此会触发一些Javascript来打开iTunes或Android URL。该机制依赖于阻止浏览器中的Javascript。
在iOS 9.3中,苹果删除了Safari中的阻止Javascript功能(link)。最终结果是,每当您尝试在Safari中使用URI方案打开应用程序时,您将看到一个大错误消息,上面写着“无法打开页面”。这是一个可怕的用户体验,并导致了苹果新系统Apple Universal Links的执行。

Safari "Cannot Open Page" triggered by older style URI Scheme redirects. In iOS 8 and below all attribution and deeplinking tech worked by setting a timer, trying to launch the URI scheme & pathway, then if a timer expired before the app launched, redirecting the user to the App Store. The advent of iOS 9.3 killed non-blocking javascript, and hence there was no way for this method to work anymore. Chrome & Android still support this style of attribution and routing.

苹果通用链接和安卓应用链接本质上是网页URL(例如:https://www.airbnb.com/rooms/530250),旨在将用户引导至最佳的网页或应用位置。如果用户没有安装应用,它们旨在将用户带到移动网页,但如果用户已经安装了应用,则将用户带到应用中的确切内容。在移动设备上,如果用户跟随通用链接并安装了我们的应用,则可能会被引导到应用程序,否则系统将退回并将访问者放在我们的移动网站上(有一些例外情况--请参见下文)。

要使链接真正通用,需要在Web、iOS和Android上启用链接功能,并且所有应用程序共享相同的资源路径。

苹果通用链接和安卓应用链接

苹果通用链接(iOS)和安卓应用链接(Android)本质上是相同的概念,但常常混淆或与其他路由机制混淆。谈论这些概念时要明确,否则您会冒着混淆不同工作方式的技术的风险。

具体而言,苹果通用链接是苹果公司部署在iPhone操作系统(OS)上的标准,允许用户点击链接并立即传送到应用程序(如果他们已经安装了)。苹果通用链接没有重定向。它是一种具有一定技术复杂性的特殊系统设置。当用户点击链接时,会向苹果发出往返服务器调用,并且操作系统会立即打开应用程序,而不会打开浏览器或加载URL。更多关于如何工作的内容,请参见下文。

安卓应用链接是在Android上设置的等效链接系统。

通用链接从为每个域名托管“苹果应用程序网站关联文件”(AASA)开始。

需要注意的是,几乎每家公司的AASA都托管在其主域名后面加上“/apple-app-site-association”。

以下是一些示例:

https://www.jet.com/apple-app-site-association https://www.pinterest.com/apple-app-site-association

如果您点击这些URL,它将下载公司的AASA。右侧是AASA示例。一些值得注意的东西包括: 适用于可以应用通用链接的所有应用程序的AppID。在我们和许多其他AASA中,您将看到设置生产和测试版本的应用程序,以便在测试期间链接将跨所有版本工作。 AppID结构化为应用程序前缀,后跟Bundle ID。通常,每个应用程序的测试版本都有不同的前缀,但Bundle ID保持一致。
例如... {应用程序前缀}。{ Bundle ID }
路径:这些是会立即打开应用程序的路径,如果用户拥有该应用程序。应用程序将接收引荐URL并可以解析出适当的路径以深度链接用户到内容。
大多数归因供应商(如Branch或Appsflyer)在某些情况下也可以为您托管AASA(例如:Airbnb的Branch AASA托管在自定义域https://abnb.me/apple-app-site-association上)。
这些文件有效地将URL列入白名单或黑名单,以映射或不映射到应用程序中。就像公司拥有的AASA一样,对于每个域,供应商指定应用程序ID和URL路径,例如:
5LL7P8E8RA.com.airbnb.app
"/rooms/*"
"/wishlists/*"
"/invite"
"NOT /rooms/*/building-rules"

当用户安装或升级我们的应用时,iOS会获取我们应用授权清单(entitlements)中列出的所有域名的AASA文件,以确保我们的网站允许我们的应用代表其打开URL。

Universal Links存在的已知问题

在大多数情况下,通用链接工作得很好,但是这些链接很容易,而且无意中被禁用!如果发生这种情况,用户将始终被重定向到网站URL,直到他们升级应用程序或重置我们所谓的“授权文件” (link)。
如果用户点击我们的应用程序右上方的“airbnb.com”或“abnb.me”链接,操作系统将引导用户进入网站,但它也会永久地将任何未来的Universal Link指向该域名的移动网站!
这实际上破坏了Apple Universal Links对用户的功能。目前这一点无法追踪,唯一重置的方法是长按URL并单击“在“Airbnb”中打开”(不直观),或者点击前面提到的“Apple Universal Links Banner”(幻象横幅)上的“打开”按钮。

Apple Universal Links Banner

这些AASA路径还用于确定何时显示iOS系统的“通用链接横幅”,或不显示。
这是一个经常出现在对话中的热门话题,值得讨论。
当您在特定域上启用Apple通用链接时,苹果将在Safari浏览器上注入系统应用横幅。这意味着除了我们显示的任何横幅或网页插页广告之外,苹果还将强制显示一个不可自定义、不可跟踪的通用链接横幅,在Safari顶部显示给已安装该应用程序并正在查看AASA路径中URL的用户。

Apple injects a "Universal Links Banner" on your website when you setup Universal Links. There is no attribution or tracking.

我们无法控制此横幅的外观。我们只能根据AASA确定它是否应在页面上可见。我们目前也无法确定用户何时点击“打开”按钮(即无归因)。
苹果通用链接横幅属性摘要:
- 仅在用户拥有该应用程序时显示。 - 不同于苹果智能应用程序横幅。 - 仅在iOS Safari浏览器上显示。 - 除了您可以使用iTunesMetadata.plist内容(link)自定义此横幅的标题和描述文本外,不能进行自定义。 - 没有归因或跟踪。

2
这个答案太棒了。感谢您所付出的努力。 - caiosm1005
3
这些关于URL Scheme的信息仍然有效吗?我知道这是针对iOS 9的回答,但是由于这些非常有用的信息,我想知道它是否适用于iOS 13。根据2019年WWDC“通用链接的新功能”,“我们建议您在当前使用自定义URL方案的地方开始迁移到通用链接。自定义URL方案本质上是不安全的,并且可能被恶意开发人员滥用。强烈不建议新使用自定义URL方案。”(https://developer.apple.com/videos/play/wwdc2019/717/?time=107) - David Hunt
你能解释一下通用链接和智能应用横幅之间的区别吗? - ertemishakk

58

通用链接是iOS的功能,可以将网页URL请求发送给指定的应用程序,而不是在浏览器中打开它们。

URL方案是应用程序根据URL描述打开特定状态的能力,并由开发人员在代码中处理。

假设您有一个名为“酷应用”的应用程序,并注册了URL方案“coolapp”。 您的应用程序有“好玩小工具”和“好玩东西”等不同区域。 现在,您可以使用此链接打开您的应用程序:coolapp://nice-gadgets。 要使应用程序显示在“好玩小工具”部分中,您必须实现application(_:openURL:options:)方法,在其中找到所请求的URL,并使应用程序打开所请求的视图控制器。

同时,您拥有一个名为www.coolapp.com的网站。 当在iOS设备上浏览时,如果遇到指向您的网站的链接,例如www.coolapp.com/nice-gadgets,并且打开该链接,则它将在浏览器中打开。通过启用通用链接,它会通过调用带有URL参数的application(_:continueUserActivity:restorationHandler:)方法打开应用程序。从这里,您可以使用与URL方案处理相同的逻辑,以在所请求的状态下打开应用程序。

那么通用链接会取代URL方案吗?我不这么认为,但它们将以一种不错的方式互为补充。

通用链接是深层链接吗?并非如此,但它们可以启动在应用程序中使用深层链接的过程。


1
有关于在Android中类似技术的任何信息吗? - Joey.Z
1
Android应用链接 @zoujyjs - ahay

13

万能链接是否代替URL/URI协议?

在苹果公司的理想世界中,是的


万能链接是深度链接的一种类型吗?

因为苹果强制开发者使用万能链接实现深度链接,所以万能链接是苹果的一种深度链接类型。但如果你看到Facebook最新的SDK,他们实现了自己的WebView来支持iOS 9.0+的深度链接。所以对于苹果来说,万能链接比深度链接更好。


9
你是从哪里得知这个信息的:“因为从iOS 9.2开始,苹果不再支持URI方案进行深层链接”? - Kubba
6
@kubba - 我相信他从 https://blog.branch.io/how-to-setup-universal-links-to-deep-link-on-apple-ios-9 复制了那段话。 - Jimmy Ng
7
我认为苹果公司从 iOS 9.2 开始不再支持 URI schemes 的说法不正确。如果我错了,请提供苹果公司文档的链接。Branch 公司正在销售基于通用链接的服务,所以请自己判断。 - Klemens Zleptnig
5
说“URI方案不受支持”有点误导人。请参阅我上面发布的完整详细信息。 具体来说,Safari不支持非阻塞Javascript,因此您无法使用设置计时器、触发URI方案,然后在出现错误之前返回到目标URL的古老归因方法。URI方案仍然“有效”,但如果用户没有该应用程序,则无法启动它们,否则会在Safari中触发“无法打开页面”错误。例如,在iOS的Chrome浏览器上,URI方案仍然有效。 - ahay
这是一个错误的陈述,深度链接仍然可用,请撤回答案。 - Developer Sheldon

9
这是一个示例Universal Link: “http://sample-universal-link.demoapp.com
它是唯一的,当用户点击它时,它将以以下两种方式之一打开App(如果已安装)或在Safari中打开网站(如果未安装)。
这是一个示例URL Scheme: “demoapp” (demoapp://params)
它可能不是唯一的,当用户点击它时,如果App已安装,则会打开App。如果未安装,则不会有任何反应。一个或多个App可以具有相同的URL Scheme。
Universal Link和URL Scheme的实现要求非常不同,因此我非常怀疑Universal Link是否替代了URL Scheme。
Universal Link是实现深度链接的一种方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接