草庐IT

ios - iOS 上的通用链接与深层链接(URL 方案)

coder 2023-07-24 原文

在我阅读时,iOS 9 引入了通用链接。在 Apple 的 App Search Programming Guide 的“支持通用链接”部分,它说这与使用 URL 方案的深层链接并不完全一样,但我对这个主题并不完全清楚:

  • Universal Link 和 URL Schemes 之间的实际区别是什么?通用链接是否仅适用于网站、邮件或消息应用程序中的超链接?
  • 通用链接是否取代了 URL 方案?
  • 通用链接是一种深层链接吗?
  • 最佳答案

    TL,DR:

    通用链接和 URL 方案之间的实际区别是什么?通用链接是否仅适用于网站、邮件或消息应用程序中的超链接?

    通用链接是 Apple 特定的、基于操作系统的 URL,它将网站 URL 与应用程序特定的 URI 方案和路由相关联。它并非在所有应用程序中都可用 - 因为该应用程序必须支持该行为。有一个很好的 UL 当前工作地点/方式列表(here)。

    UL 也有很多问题,我在最后概述了这些问题。请参阅下面的长文。

    通用链接是否取代了 URL 方案?

    不。它们是 iOS Safari 上 URI Schemes 和路由的强制替代品。你必须而且应该仍然支持你的应用程序的 URI 方案和路由,因为 Android 和 iOS Chrome 仍然使用这项技术,从归因到电子邮件的每一类主要链接供应商也是如此。

    通用链接是一种深层链接吗?

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

    许多链接表现出深度链接的行为取决于用户是否拥有应用程序和上下文(浏览器、应用程序、操作系统、操作系统版本等)。改变思维框架。

    跟踪通用链接

    在下面的文档中,我概述了通用链接的所有不同方面。重要的是要指出 continueUserActivity 将报告来自通用链接的引用 URL,因此您可以使用它来属性打开。

    因为 UL 不是普通链接,如果您有重定向,那将破坏它。同样,如果您关闭重定向,那么您拥有的任何网站点击服务器都不会受到攻击。这是一个不同的讨论,但重要的是要注意。

    如果您有兴趣,我在下面的 Universal Links 上精选了许多有用的信息。

    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 Scheme:

    window.location.href(...)
    

    如果应用程序在计时器到期之前没有打开,那么供应商可以假设手机不包含该应用程序,因此,一些 javascript 会触发以打开 iTunes 或 Android URL。这种机制依赖于在浏览器中阻止 javascript。

    在 iOS 9.3 中,Apple 在 Safari ( link ) 中删除了阻止 javascript。最终结果是,每当您尝试在 Safari 中打开具有 URI 方案的应用程序时,您都会看到一条大错误消息,内容为“无法打开页面”。这是一种糟糕的用户体验,并导致强制执行 Apple 的新系统 Apple Universal Links。



    Apple 通用链接和 Android 应用程序链接本质上是 Web URL(例如 https://www.airbnb.com/rooms/530250 ),旨在将用户引导到 Web 或应用程序上的最佳位置。如果用户没有该应用程序,它们旨在将用户带到移动网络,但如果用户拥有该应用程序,则将用户带到应用程序中的确切内容。在移动设备上,如果用户点击通用链接并安装了我们的应用程序,他们可能会被定向到该应用程序,否则系统将回退并将访问者登陆我们的移动网站(少数异常(exception) - 见下文)。

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

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

    Apple Universal Links (iOS) 和 Android App Links (Android) 本质上是相同的概念,但经常互换,或与其他路由机制混淆。当你谈论这些概念时,明确是很重要的,否则你可能会混淆或混淆不同运作方式的不同技术。

    具体来说,Apple Universal Links 是 Apple 的一项标准,它部署在 iPhone 操作系统 (OS) 上,它允许用户点击链接并在拥有链接时立即将其传送到应用程序。 Apple 通用链接没有重定向。它是一种特殊的系统设置,具有一定程度的技术复杂性。当用户点击链接时,会向 Apple 进行往返服务器调用,操作系统会立即打开应用程序,而无需打开浏览器或加载 URL。更多关于它的工作原理如下。

    Android App Links 是在 Android 上设置的等效链接系统。

    通用链接首先为您的每个域托管一个“Apple 应用程序站点关联文件”(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 示例位于右侧。 AASA 中包含的一些值得注意的内容:
    可以应用通用链接的所有应用程序的 AppID。在我们和许多其他 AASA 中,您将看到该应用程序的生产和测试版本的设置,以便链接将适用于所有版本的测试。
    AppID 的结构为 App Prefix,后跟 Bundle ID。通常应用程序的每个测试版本都有不同的前缀,但 Bundle ID 保持一致。

    例子...
    {App Prefix}.{ Bundle ID }

    路径:如果用户拥有它,这些路径将立即打开应用程序。该应用程序将收到引用 URL,并可以解析出正确的路径,将用户深层链接到之后的内容。

    大多数归因供应商,如 Branch 或 Appsflyer,在某些情况下也可以为您托管 AASA(例如:Branch 的 AASA for Airbnb 托管在自定义域 https://abnb.me/apple-app-site-association 上)。

    这些文件有效地将要映射或不映射到应用程序中的 URL 列入白名单和黑名单。就像公司拥有的 AASA 一样,对于每个域,供应商指定应用 ID 和 URL 路径,例如:
    5LL7P8E8RA.com.airbnb.app
    "/rooms/*"
    "/wishlists/*"
    "/invite"
    "NOT /rooms/*/building-rules"
    

    当用户安装或升级我们的应用程序时,iOS 会获取我们应用程序权限中列出的所有域的 AASA 文件,以确保我们的网站允许我们的应用程序代表他们打开 URL。

    通用链接的已知问题

    通用链接在大多数情况下都很好用,但是这些很容易并且无意中被禁用!如果发生这种情况,用户将始终被重定向到网站 URL,直到他们升级他们的应用程序或重置我们所谓的“权利文件”(link)。

    如果用户点击我们应用程序右上角的“airbnb.com”或“abnb.me”链接,操作系统会将用户定向到该网站,但它也会将任何 future 的通用链接永久定向到移动设备与该域的链接的网站!

    这有效地破坏了用户的 Apple 通用链接的功能。这现在无法跟踪,唯一的重置方法是长按 URL 并单击“在“Airbnb”中打开(不直观)或点击 Apple Universal Links Banner(Phantom Banner)上的“打开”按钮这在本文档前面已经描述过。

    Apple 通用链接横幅

    这些 AASA 路径还用于确定何时显示或不显示 iOS 系统的“通用链接横幅”。

    这是一个特别热门的话题,经常出现在谈话中,值得讨论。

    当您在特定域上启用 Apple 通用链接时,Apple 将在 Safari 浏览器上注入(inject)系统应用横幅。这意味着除了我们显示的任何横幅或网页插页式广告外,Apple 还将强制使用不可自定义、不可跟踪的通用链接横幅,该横幅显示在 Safari 顶部,供拥有该应用程序并在 Safari 中查看 URL 的用户使用谁的路径在 AASA 中。



    我们无法控制此横幅的外观。我们只能根据 AASA 确定它是否应该在页面上可见。我们目前也无法确定用户是否或何时点击“打开”按钮(即无归属。

    Apple Universal Links Banner 属性总结:
  • 仅当用户拥有该应用程序时才显示。
  • 与 Apple Smart App Banner
  • 不同
  • 仅显示在 iOS Safari 浏览器上。
  • 不可自定义,除非您可以使用 iTunesMetadata.plist 内容 ( link ) 自定义此横幅中的标题和描述文本。
  • 无归属或跟踪。
  • 关于ios - iOS 上的通用链接与深层链接(URL 方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522618/

    有关ios - iOS 上的通用链接与深层链接(URL 方案)的更多相关文章

    1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

      在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

    2. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

      从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

    3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

      我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

    4. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

      我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

    5. ruby-on-rails - openshift 上的 rails 控制台 - 2

      我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

    6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

      我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

    7. ruby - 如何验证 IO.copy_stream 是否成功 - 2

      这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

    8. ruby-on-rails - Ruby url 到 html 链接转换 - 2

      我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

    9. Ruby 文件 IO 定界符? - 2

      我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

    10. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

      我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

    随机推荐