IOS 通用链接没有在应用程序中打开

因此,我完全遵循了本教程,并使用了与所提供的值相同的值: Https://blog.branch.io/how-to-setup-universal-links-to-deep-link-on-apple-ios-9

苹果协会的文件也在链接目录中:
WEB_PAGE:PORT_NUMBER/apple-app-site-association

这边好像都安排好了。

我已经添加了应享权利,更新了供应配置文件,一切都准备好了。

当我在我的设备上运行应用程序,并打开链接 http://WEB_PAGE:PORT_NUMBER,这总是打开 Safari。

我甚至在下面的方法中有断点:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler

但是什么都没有。

有人完善过这个吗? 有什么我不知道的吗?

138053 次浏览

有几个可能的问题。

  1. 尝试将您的域粘贴到这个链接验证器,并确保没有问题: https://limitless-sierra-4673.herokuapp.com/(感谢 ShortStuffSushi ——参见 回购)

  2. 如果您没有在权限中指定的域上正确设置 TLS,iOS 将在系统日志中记录错误消息。它隐藏在操作系统日志里,不是应用程序日志。错误消息将类似于 Sep 21 14:27:01 Derricks-iPhone swcd[2044] <Notice>: 2015-09-21 02:27:01.878907 PM [SWC] ### Rejecting URL 'https://examplecustomdomain.com/apple-app-site-association' for auth method 'NSURLAuthenticationMethodServerTrust': -6754/0xFFFFE59E kAuthenticationErr。从 给你提取的错误消息,关于使用 CloudFlare for TLS 给你的快速(不完整)指令。

  3. 在我个人的测试中,在 Safari 中点击/输入链接从来没有直接打开过应用程序。从其他应用程序(iMessage、 Mail、 Slack 等)点击 已经就可以了。其他人报告说,点击谷歌搜索结果中的链接可以直接打开应用程序。

  4. 请注意,如果通用链接成功打开您的应用程序,然后您通过点击到 Safari (通过点击您的网站在应用程序中的导航栏的右上角) ,然后 当你访问该 URL 时,iOS 会停止打开应用程序。然后在 Safari 中,你可以下拉显示在页面顶部的“打开”横幅。请注意,单击 site = > disabling UL 看起来像是 路径特定,基于您在 apple-app-site-association 文件中指定的路径。因此,如果你有单独的路线,yoursite.com/a/*yoursite.com/b/*,如果你点击 yoursite.com/a/*,它打开你的应用程序直接,你然后有选项在右上角的应用程序点击通过到 yoursite.com/a/*。如果你这样做,随后的访问 yoursite.com/a/*将打开浏览器,而不是应用程序。但是,yoursite.com/b/*应该不受影响,仍然直接打开您的应用程序。

如果你发现问题所在,请告诉我。我个人非常好奇通用链接是如何工作的,以及存在哪些边界情况。祝你好运。

我意识到对我来说问题在于链接到根目录 a (例如。http://example.com/)没有打开我的应用程序,但如果我添加了一个路径(例如。成功了。将 "/"添加到路径列表解决了这个问题:

{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAM_ID.BundleIdentifier",
"paths": [ "*", "/" ]
}
]
}
}

正如 Slutsker 在 这个苹果开发者论坛上的回答。

可能出现的问题有很多。有两点给我带来了麻烦:

  • 在 Xcode 中,当您添加关联域权限时,每个条目都需要从 applinks:开始,然后是您的域名。例如 applinks:www.apple.com

  • 尽管 Xcode 为我创建了一个权利文件,但它没有包含在我的构建中: 我必须手动单击该框。

是的,在这样做之后,就不需要对 apple-app-site-association文件进行签名了: 它只是纯文本,只要通过 HTTPS 提供,就可以正常工作。(不过,如果你支持 iOS8,你仍然需要签署它。)

St.Derrick 的 回答我很有用。

但是,要使通用链接再次打开应用程序,而不是狩猎,我们需要做以下事情。

  • 长按通用链接在邮件或 iMessage,然后你会看到选项是否打开在 Safari 或应用程序。

我设法让它工作,但它花了相当多的时间和斗争。请注意,除非你签署 apple-app-site-association 文件(签名是可选的!)在 Safari 中点击一个链接将 没有打开你的应用程序(这让我很头疼)。

检查是否正确实现了 UniversalLink 的快速步骤。

  • 点击并保持你希望启动应用程序的链接。你应该在关联菜单中看到一个“打开[你的应用程序名称]”。

  • 打开笔记应用程序,键入你期望打开应用程序的链接。搞定。该链接将变成黄色,点击该链接应该打开你的应用程序,而不是 Safari。

  • 如果链接 http://yourDomain.com没有启动应用程序,请尝试 http://yourDomain.com/yourFolder/

  • 在 Safari 中,如果上下文菜单在 Safari 中显示“ Open In [ your app name ]”,但点击链接会在 Safari 中打开链接,而不是启动应用程序,

    试着下拉 Safari 页面,当点击链接时打开,就像你“拉来刷新”一样。应该出现一个横幅,可以打开您的应用程序。点击横幅打开应用程序,按下主页按钮关闭应用程序,返回 Safari,并尝试通过点击链接启动应用程序。这一次,应用程序应该被启动,因为点击横幅应该已经保存了在应用程序中打开链接的首选项。

    B.如果该应用程序仍然没有得到启动后的第一步,尝试邮寄链接到一个网络邮件,如 gmail 和打开网络邮件网站在 safari 和尝试点击链接。如果这个工作,您可能已经尝试启动应用程序从相同的域作为链接。在我看来 从同一个域启动应用程序大多失败。当链接进入用户所在的同一域时,Safari 可能不会检查目标 URL 是否是通用链接。因此,尝试从另一个域启动应用程序。

要在服务器端验证 apple-app-site-association,可以 使用苹果的官方验证程序。

Https://search.developer.apple.com/appsearch-validation-tool/

显然,在 制作通用链接关联文件的文档中有一个错误。

上面写着:

AppID 键的值是应用程序的团队 ID 和捆绑包 ID

应该是

AppID 键的值是应用程序的 Prefix 和 bundle ID

对于大多数应用程序来说,团队 ID 和应用程序前缀似乎是相同的,但是如果你的应用程序在商店里已经存在了很多年,这些值可能会有所不同。

要找到这个值,打开 https://developer.apple.com上的成员中心,查看“证书、标识符和配置文件”,单击“标识符”,然后在“标识符”下的表中单击“应用程序 ID”。找到您的应用程序,并使用前缀值和 Bundle ID 为关联文件创建 AppID。

我花了将近一天的时间才想明白。 我遇到的问题是没有下载 XCode 中更新的供应配置文件(在此之后我还重新启动了 XCode)。

(参考资料 > 帐户 > 检视详情 > 下载全部)

你可以在模拟器中测试通用链接

来自 应用程序搜索编程指南: 支持通用链接

进入 developer.apple.com ,编辑你的发行配置文件。在编辑页面中,你可以打开一个 弹出应用程序 ID,它将显示你的应用程序名称列表,并在应用程序名称后面的()圆括号中显示它的 显示你所有的应用程序 ID。有些应用程序可能有你的团队 ID 作为前缀,但有些做 没有。确保使用()中弹出菜单中的内容,并将其放入 apple-app-site-association Details appID 字段中。我对一个应用程序和它的通用链接就有这个问题。

对我来说,问题是 apple-app-site-association文件。根据 Apple 的文档,只需要 appinks 参数。我添加了 activitycontinuation参数,它工作了。

{
"activitycontinuation": {
"apps": [
"9JA89QQLNQ.com.apple.wwdc"
]
},
"applinks": {
"apps": [],
"details": [{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
}]
}
}

如果这里的人们正在寻找其他的解决方案,我们将整个一步一步的调试通用链接放在一起,因为我们已经看到了很多问题出现,造成了很多头疼的问题。

看看这个:

通用链接调试指南

Debugging Guide preview

如果你只是想新建一个 Universal Links,这个指南非常有帮助:

深度链接设置指南

希望他们能帮上忙!

在集成通用链接之后,增加项目版本或构建数量也非常重要。即使你删除/重新安装,iOS 也不会提取链接,除非你改变版本。

只是觉得我应该加一些我发现的东西以防将来有更多的人遇到和我一样的问题。这些主要与身份验证错误有关。

即使苹果没有明确地声明它,apple-app-site-association文件也必须通过 https 提供,即使已签名。用于 https 的证书也必须受到 Apple 的信任。因此,虽然在设置-> 常规-> 配置文件中添加的证书将允许 Safari 中的 https,但它不允许通用链接工作。

在设备日志中,在设备和服务器之间发生身份验证错误时,会打印一个类似于 "TrustResultValue" : 4的值。TrustResultValue为5意味着证书属于错误的域名(Eg.test.com 来自 www.test.com)。TrustResultValue为4意味着证书在此使用中不受信任。

调试 给你可能有一些有用的步骤。“测试对苹果应用程序站点关联的访问”部分是如何确保设备获得 apple-app-site-association文件的分步指南。这些步骤归结为:

  1. 卸载应用程序。这是必要的,因为文件是在安装时下载的。

  2. 停止服务器正确地为 apple-app-site-association提供服务。

  3. 在 xcode 中,打开 Window-> Device,然后选择设备。

  4. 通过单击窗口底部的三角形打开设备日志。

  5. 通过单击垃圾桶清除日志以清除可能相关的任何以前的日志。

  6. 通过点击播放按钮使用 xcode 重新安装应用程序。

  7. 应用程序启动后,如果设备正确请求文件,那么设备日志应该包含一个错误,可以通过搜索“ apple-app-site-association”找到。

如果正确地提供了 apple-app-site-association文件(省略了步骤2) ,那么应该没有错误。如果这是问题所在,则可能显示身份验证错误。

对我来说,我的错误是我们的网站把 www.domain.com 重定向到 domain.com,所以所有的 www.domain.com/* 都会因此而失败。希望能帮上忙。

最常见的原因是当用户点击右上角,从而告诉 iOS 在未来不要打开应用程序(在这种情况下是 Uber)。

要修复,下拉显示智能横幅,点击 OPEN:

Pull down in Safari, and OPEN again

这将随后“记住”打开应用程序。

我们已经将 苹果-应用程序-网站-协会文件添加到这个位置:

https://example.com/apple-app-site-association

在 iOS9上运行良好,但是在 iOS10上就不行了。

问题似乎出在 。众所周知的路径上:

https://example.com/.well-known/apple-app-site-association

由于 https://example.com/.well-known/apple-app-site-association路径重定向到 https://example.com

<Notice>: Allowing redirect 'https://example.com/.well-known/apple-app-site-association' -> 'https://example.com/'
<Notice>: ### Rejecting AASA file size 154466 for URL https://example.com/.well-known/apple-app-site-association

在我看来,如果以某种方式。众所周知的路径不正确工作,它打破了普遍的联系。

  • 如果将该链接粘贴到浏览器 URL 字段中,则通用链接将无法工作。

  • 通用链接 工作与用户驱动的 <a href="...">元素单击 跨领域。例如: 如果在 google.com 上有一个通用链接指向 bnc.lt,它将打开应用程序。

  • 通用链接将 不是工作与用户驱动的 <a href="...">元素单击 在同一个域名上。例如: 如果在 google.com 上有一个通用链接指向另一个通用链接,它将不会打开应用程序。

  • 通用链接不能通过 Javascript (在 window.onload 或通过。Click ()调用 <a>元素,除非它是用户操作的一部分。

来源: https://dev.branch.io/getting-started/universal-app-links/support/ios/#appsbrowsers-that-support-universal-links

第三颗子弹花了我一天的时间。

为了帮助调试这个问题,在安装应用程序时,在设备的控制台输出中搜索“ swcd”,看看注册通用链接是否有效或失败。

  1. 使用实际的设备,而不是模拟器。
  2. 从你的设备上删除应用程序。
  3. 将设备连接到您的计算机,并以 xcode 查看设备的控制台输出。(窗口-> 设备-> [您的设备]-> 打开控制台)。把窗户打开。
  4. 安装你的应用程序,让它启动。
  5. 将控制台输出过滤到“ swcd”。如果它是成功的,你会看到类似下面的截图。如果失败了,你会看到别的东西。如果您没有看到任何东西,那么您就搞错了一些基本的东西,比如添加了关联域权限。

Applink added successfully

还没有真正看到完全相同的问题/解决方案组合,让它为我工作,所以不妨加入我的,如果有人有同样的问题!

对于我的应用程序,我使用了一个自定义的 URL 方案(设置在 APP_TARGET > Info > URL Types中) ,并将 URL 方案从这里设置到 Firebase 控制台来匹配,但仍然没有工作。

我的问题实际上有两个:

注意是否检查自动管理签名

如果你像我一样检查 Xcode 的“自动管理签名”设置,因为我只是想做一个快速的演示应用程序,你会希望确保使用的 TeamID 与 Firebase 控制台中的相匹配。我最初访问了我的 Apple Developer 帐户,并从我的会员页面复制了团队 ID,但后来发现 Xcode 使用的实际 ID 是不同的。(你可以在 APP_TARGET > General > Signing > Signing Certificate.中找到这个,对我来说它看起来像 iPhone Developer: My Name (TEAM_ID))。

在 URL type 中将 TeamID 前缀为 Bundle 标识符

当我在 Firebase 控制台和 Xcode 中确保这些匹配之后,我的下一个问题是 URL 方案的标识符。在这里使用捆绑包标识符是很典型的,但是 Firebase 实际上是以你在 Firebase 控制台中提供的 Team ID 作为前缀的,所以我不得不在 Xcode 的 URL 类型部分也给它作为前缀。

经过这两个修复和重新下载的 GoogleService-Info.plist文件,我没有问题打开我的动态链接。

对于找到这个页面的未来读者..。

我也遇到过类似的情况。然而,在我的情况下,iOS10是 AOK 工作,并且无论我做什么(突破构建号,删除/重新安装等) ,iOS9似乎拒绝工作。

我是从 iOS10开始的,需要支持 iOS9。当时,这里的文档 -https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html-清楚地说明文件可以放置在 Web 服务器的根目录(例如 /apple-app-site-association)或。已知文件夹(例如 /.well-known/apple-app-site-association)。因为我也支持 Android,它也使用。一个类似的文件夹,我决定把两者放在那里。

对于 iOS10上的新安装,它清楚地请求根文件,失败,然后请求. well-known 文件,并成功。

对于 iOS9,它明确地请求了根文件,但是失败了,并且没有做任何其他事情。

解决方案: 如果你支持 iOS9,把文件放在 /apple-app-site-association

两天后我才发现,这种联系(从分公司)

Appinks: xxxx.app.link

只有在存档(即特别)的应用程序和安装到电话后工作。

通过使用日历应用程序,我能够在 iOS 模拟器中测试通用链接。

我只是创建了一个事件,并添加了我想要在事件的 URL字段中测试的 URL。然后,在查看创建的事件时,只需点击 URL 链接,应用程序就会打开。

对于任何需要轻松测试打开(通用)链接的人,您也可以使用以下命令从终端打开模拟器中的链接:

xcrun simctl openurl booted yourapp_or_http://yourlink

例如:

xcrun simctl openurl booted https://www.google.com

在我的例子中,我的错误是在路径中放置查询参数:

{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAM_ID.BundleIdentifier",
"paths": [ "/auth-ui/hub?target=confirm&*" ]
}
]
}
}

当我从路径中删除’? target = 確 & *’时,它就开始工作了

在我的例子中,对 AASA 文件的请求位于: https://example.com/apple-app-site-association

被重定向到: https://www.example.com/apple-app-site-association

关键是 这在 iOS11上运行良好,但在 iOS9.3.5上就失败了。

解决方案: apple-app-site-association文件必须不在 iOS9的302或301重定向之后。(公平地说,这一点在 UL 故障排除页面上有记载。)

经过两天的绝望,我想我终于解决了这个问题。我的解决办法是:

似乎旧的应用程序使用不同的应用程序前缀比新的应用程序。较新的应用程序仅为此目的使用团队 ID。如果应用程序前缀和团队 ID 不相同,那么似乎需要在苹果应用程序站点关联文件中指定活动延续字段:

{
"activitycontinuation": {
"apps": [
"YOUR_APP_PREFIX.de.company.app"
]
},
"applinks": {
"apps": [],
"details": [
{
"appID": "YOUR_APP_PREFIX.de.company.app",
"paths": ["/*"]
}
]
}
}

我在地狱般的旅程中经历的另一件事是,删除应用程序并重新启动设备似乎是强制刷新该文件的唯一方法。

对于我来说,在实现了上面的所有答案并测试了 AASA 文件确实被下载和 mpoiot 的答案之后,我的问题是在 Xcode 中我添加了相关的域作为:

applinks:example.com

在我的笔记应用程序中,我试图使用:

Https://example.com

因为我的 AASA 没有签名,我想确保我是通过 HTTPS 服务它。因此,当我在笔记应用程序中尝试使用:

example.com

它适用于我的物理设备,使用 iOS 12.1.2,其中包括从 Xcode 构建的开发版本或从 TestFlight 构建的发行版本

我还会把我的笔记放在故障排除上。

基本上我们有2个部分,这应该链接在一起: 1)网页站点和 2) iOS应用程序。

  1. 对于 站点只有一个问题: apple-app-site-association文件的 MIME 类型不是 application/json

    而且 API 验证工具test也没有帮助 它所说的环境

没有具有域权限的应用程序错误 用于验证深度链接双重身份验证的授权数据来自当前发布的应用程序版本。这些数据可能需要48小时才能更新。

但最终网站还是没问题的。

我们检查了网络日志,看到 GET 请求到 apple-app-site-association文件,并决定切换到 iOS 应用程序。

  1. 对于处理 IOS应用程序的设置,最好有 Console应用程序运行,只显示 swcd进程的过滤,正如在这个线程中已经提到的。

在我们的例子中,问题是我们依赖于通配符 URL,形式为: applinks:*.prod_site_name.com,认为 * 将覆盖所有预先准备的测试环境,如 https://test_env.num4.prod_site_name.com,但是这不起作用。控制台显示:

启动域名请求“ * .prod _ site _ name.com”,URL“ https://prod_site_name.com/.well-known/apple-app-site-association

因此,在我们的例子中,修复是为应用程序的测试目标提供特定于测试的应用程序,比如: applinks:test_env.num4.prod_site_name.com

希望这能帮到别人,因为我花了两天才弄明白。

我们必须在 .entitlements文件中将 www.添加到 associated-domains

        <string>applinks:www.yourdomain.com</string>
<string>activitycontinuation:www.yourdomain.com</string>

因为如果我们使用 yourdomain.com而不是 www.yourdomain.com,我们的服务器做了一个重定向-> 304,然后没有包括 apple-app-site-association filecontent-type: application/json

注意,yourdomain.comwww.yourdomain.com的通用链接仍然有效

如果您将 apple-app-site-association托管在 火力点上,请确保将它放在 /.well-known/子目录中!似乎 Xcode 首先查询那个 URL,如果成功,它不会尝试查询根目录中的 apple-app-site-association。出于某种原因,防火工程师使托管网站自动回应 /.well-known/apple-app-site-association与一个空(但正确形式)的关联文件,覆盖您的自定义一个,让您不知道为什么没有工作!

我没看到有人为 Flask 提供解决方案。

这招对我很管用。

编辑: 经过两次否决,我想澄清一下,几个月后我仍然使用这个精确的解决方案。它确实可以工作,但还有其他原因可能无法立即适用于您的应用程序。这包括你将不得不删除应用程序和重新启动你的手机几次甚至。最终,它们联系在一起。我不知道为什么这么难,但这个解决方案确实有效。所以继续尝试,如果你有任何问题,请随时发表评论,这样我可以尽力帮助。

如果您正在使用 Flask,请将“ apple-app-site-association”放到静态文件夹中,然后将其添加到 application.py 文件中。

@application.route('/apple-app-site-association', methods=['GET'])
def apple_app_site_association():
return application.send_static_file('apple-app-site-association')

我花了一天时间试着让它工作,重启手机解决了这个问题。

卸载/重新安装应用程序也不起作用。

对于 ios13,有一个新的格式-检查这里 https://developer.apple.com/documentation/safariservices/supporting_associated_domains_in_your_app?language=objc

我把我的文件更新成这样:

 {
"applinks": {
"apps": [],
"details": [
{
"appIDs": ["1234.app.company.appname"],
"appID": "1234.app.company.appname",
"components": [
{
"/": "/login"
}
],
"paths": [ "/login" ]
}
]
},
"webcredentials": {
"apps": ["1234.app.company.appname"]
}
}

在我的案例中,原因是一个无效的 JSON。

它没有使用“但是”,因为我抄袭了一些文章,文章的“专家”作者把它与这样的迹象,我抄袭了他。

顺便说一句,目标站点上仍然没有信息框,比如“你可以用应用程序打开它”,但是如果我点击链接,例如从 Notes 应用程序打开应用程序。

错:

{
“applinks”: {
“apps”: [],
“details”: [
{
“appID”: “T5TQ36Q2SQ.com.reddit.production”,
“paths”: [“*”],
}
]
}
}

好:

{
"applinks": {
"apps": [],
"details": [
{
"appID": "T5TQ36Q2SQ.com.reddit.production",
"paths": ["*"],
}
]
}
}

在我的箱子里没有工作,因为我有两个项目

<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:urlOne</string>
<string>applinks:urlTwo</string>
</array>
</dict>
</plist>

当我减少数组到只有一个项目它开始工作。

在我的例子中,我需要让服务器使用内容类型 application/pkcs7-mime来服务 apple-app-site-association文件。在 nginx 中,我使用了这种方法:

location ~ /.well-known/apple-app-site-association {
default_type application/pkcs7-mime;
}

正如其他人建议的那样,我还必须确保:

请注意,我从来没有看到在控制台应用程序的“成功”消息显示在屏幕截图由另一个用户。在控制台中,我不断得到 Entry [...] needs its JSON updated because the app PI changed,但这不是一个问题。

还要注意的是,当尝试在浏览器中打开 apple-app-site-association时,文件会被下载而不是显示,但在我的例子中这不是一个问题。

和往常一样,使用一个真正的设备,重新安装应用程序时,你改变的东西,也可能重新启动设备,也许增加应用程序的版本号。

有一个新的格式文件-检查这个链接: https://developer.apple.com/documentation/safariservices/supporting_associated_domains_in_your_app?language=objc

我这样更新了我的文件:

"applinks": {
"apps": [],
"details": [
{
"appID": "APP_ID_PREFIX.BUNDLE_ID",
"paths": [
"*"
]
}
]
},
"webcredentials": {
"apps": [
"APP_ID_PREFIX.BUNDLE_ID"
]
}
}

注意: 在模拟器中它不工作,但是在设备上工作得很好。

有时我发现关联文件一切正常,但是 iOS 决定在 Safari 中总是打开通用链接。为了测试应用程序是否识别应用程序链接,我将 URL 添加到 Notes 或 Calendar 条目,然后长按它,以显示上下文菜单。如果它说“打开在{您的应用程序}”,然后链接是工作,但 iOS 是决定打开它在 Safari。点击“打开{您的应用程序}”将告诉 iOS 打开有效的通用链接通过您的应用程序从那时起。

我知道已经有很多答案,但是你需要确保,除了开发者控制台(苹果的网站) ,你还需要通过 xCode 向应用程序添加关联域的功能。我以前从来没有做过这个过程,并且没有太多关于它的文档(包括 React Natural 的文档)。

(以下过程的屏幕录制)。 Https://imgur.com/a/xsizjii

一件简单的事情需要检查:

打开 Xcode & 转到歌唱和能力部分-

  1. 取消选中自动管理歌唱

  2. 创建开发证书(如果没有使用相同的团队 ID 创建)

  3. 创建开发供应配置文件

注意: 团队 ID 必须与您在苹果应用程序站点关联文件(aasa 文件)中提到的相同

简单卸载以前的应用程序,再次运行项目,然后打开 Safari 浏览器模拟器或设备-> 它将工作... !

它帮助我找到解决方案,因为我运行我的项目使用自动管理歌唱(复选框是勾选)

enter image description here