iOS通用链接无法打开应用程序

148

我完全按照这个教程的步骤进行操作,并使用与提供的值相同的数值: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

但是毫无收获。

有人掌握了这个技巧吗?我是不是漏掉了什么?


2
在此处结帐以确保您不会漏掉任何步骤 https://dev59.com/d1sV5IYBdhLWcg3w8imr#35609668 - Vineet Choudhary
46个回答

219

有几个可能的问题。

  1. 尝试将您的域名粘贴到此链接验证器中,并确保没有问题:https://limitless-sierra-4673.herokuapp.com/(由ShortStuffSushi提供--请参见repo

  2. iOS如果在您的entitlements中指定的域名上没有正确设置TLS,系统日志会记录一个错误消息。它被埋在操作系统日志中,而不是应用程序日志中。错误消息看起来像这样: 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支持TLS的快速(不完整)说明此处

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

请注意,如果通用链接成功打开您的应用程序,然后您通过在应用程序中导航栏右上角点击您的站点而进入 Safari (),则 iOS 在访问该URL时停止打开应用程序。然后,在 Safari 中,您可以向下拉动以显示页面顶部带有“打开”的横幅。请注意,点击转到站点=>禁用通用链接似乎是特定于路径的,基于您在apple-app-site-association文件中指定的路径。因此,如果您有单独的路由,例如yoursite.com/a/*和yoursite.com/b/*,如果您点击yoursite.com/a/*并直接打开您的应用程序,则在应用程序的右上角有一个选项可供您点击转到yoursite.com/a/*。如果您这样做,随后访问yoursite.com/a/*将在浏览器中打开,而不是在应用程序中打开。但是,yoursite.com/b/*应该不受影响,并仍然直接打开您的应用程序。如果您发现问题,请告诉我。我个人非常好奇通用链接如何工作以及存在哪些边缘情况。

1
同样的事情,好奇怪。有时直接打开应用程序,有时打开webView。我希望他们能让文档更清晰明了。这个功能的操作是不稳定的。 - Legolas
5
关于第1点,如果您通过https提供apple-app-site-association文件,则不再需要对其进行签名。 - Jeremy Hicks
24
重新启动您的iOS设备可能也有帮助。我三次检查了所有设置和配置,确信一切都正确,但它仍然无法工作。然后我尝试了另一个设备,它完美地运行。然后我从原始设备中删除了该应用程序,重启了设备并重新安装了应用程序,然后它就可以正常工作了... - mathz
5
如果有人意外点击了应用程序右上角的网站链接,该如何返回应用程序而不是进入Safari浏览器呢? - iEngineer
5
我在任何地方都没有看到“在应用中打开”横幅。经过长时间搜索,找到了解决方法:在“笔记”应用中键入您站点的任何链接(这是通用链接)。现在点击“完成”。一旦它变成一个链接,长按它并选择“在应用名称这里打开”! - kishorer747
显示剩余30条评论

92

有很多方式可能出问题。有两个点让我头痛:

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

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

是的,在这样做之后,不需要对apple-app-site-association文件进行签名:它只是纯文本,并且只要通过HTTPS传送,它就可以工作。(但如果你要支持iOS 8,仍然需要对其进行签名。)


4
最终我不得不从测试设备中完全删除该应用程序,然后重新构建和运行它,才最终使其成功。 - Phil Andrews
19
你救了我的一天,这正是我的问题。 虽然XCode已经为我创建了一个授权文件,但它没有包含在我的构建中:我不得不手动勾选那个框。 - cham
18
将授权文件包含在构建中对我也解决了问题。值得注意的是,在Xcode 8中,文件检查器中的目标成员复选框实际上是禁用的。我不得不转到构建设置并将授权文件添加到"复制资源"阶段。 - Charles A.
6
@cham: 你们能详细解释一下"虽然XCode为我创建了一个entitlements文件,但它没有包含在我的构建中:我必须手动点击那个框。"吗? 虽然XCode为我创建了entitlements文件,但它没有自动包含在我的构建中,所以我必须手动勾选相应的框才能将其包含进去。 - Thang Pham
14
@AwaisFayyaz 前往“Build Phases” > “Copy Bundle Resources”。点击加号,然后添加您的授权文件。 - s.zainulabideen
显示剩余9条评论

78
为了帮助调试这个问题,请在安装您的应用程序时搜索设备控制台输出中的 "swcd",以查看注册通用链接是否成功或失败。
  1. 请使用实际设备,而非模拟器。
  2. 从设备中删除该应用程序。
  3. 将设备连接到电脑上,并在 Xcode 中查看设备的控制台输出(窗口 -> 设备 -> [您的设备] -> 打开控制台)。保持此窗口打开。
  4. 安装你的应用并让它启动。
  5. 将控制台输出过滤为 "swcd"。如果成功,则会看到以下截图。如果失败,则会看到其他内容。如果什么也没看到,则可能是某些基本操作错误,例如添加关联的域权益。

Applink added successfully


3
非常好的提示!我之前将https://添加到applinks:权限中,并指定了我想要监听的完整路径,这都是错误的。我之前指定的是https://example.com/path/*,而我应该只指定mydomain.com和example.com上的AASA文件,然后AASA文件会根据我的应用程序bundle id指定路径。 - Numan Tariq
3
我能给你转账作为奖励吗?我花了两天时间,按照每一个步骤设置这个通用链接,但没有任何帮助,直到我尝试了你的方法。我很不幸将我的关联文件托管在Firebase的根目录下,结果苹果首先查询“.well-known/”子目录,而Firebase似乎会用他们自己的正确的关联文件来回应,而这个文件并没有链接到任何应用程序。看来我该如何找出这个问题呢,苹果? - nalexn
2
默认情况下它应该这么啰嗦吗?因为我没有得到如此详细的日志.. 这是否意味着操作不成功? - Nicholas Allio
3
没有进行SWCD过滤,我仍然看到很多不相关的行。 - luky
你是怎么知道 swcd 是什么的?出于好奇。 - Evgeny Karkan
显示剩余2条评论

41

显然,在制作Universal Links的关联文件的文档中存在错误

文档中说:

appID键的值是应用程序的团队ID和bundle ID

实际上应该改为:

appID键的值是应用程序的前缀和bundle ID

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

要查找此值,请在https://developer.apple.com上打开Member Center,并查看“Certificates, Identifiers & Profiles”,单击“Identifiers”,然后在“Identifiers”下的表格中选择“App IDs”。找到您的应用程序,使用那里的前缀值和Bundle ID来创建关联文件的AppID。


2
+1,这对我帮助很大。花了半天时间弄清楚为什么它不起作用,这似乎是我的情况。 - Ivo
你救了我的一天,我的应用程序很久以前就存在了,而且应用程序前缀与团队ID不同。 - Ti3t
这是唯一对我有效的方法。谢谢! - dhin
这对我来说是个解决方案。非常好的建议。 - vincenth
这个解决方案的问题在于,如果你正在本地测试,就不能使用它。 - Mr. Robot

30

4
2023年起不再工作。503错误。 - Carla Camargo
1
您可以使用branch.io验证器:https://branch.io/resources/aasa-validator/ - gigeos

30

St.derrick的回答很有信息量。

但是,为了再次启用万能链接以在应用程序中打开而不是在Safari中打开,我们需要执行以下操作:

  • 长按邮件或iMessage中的通用链接,然后您将看到选项,可以选择在Safari中打开还是在应用程序中打开。

5
没有“应用程序”选项,只有复制、打开、添加到阅读列表等选项。 - iEngineer
1
我差点因为调试这个问题而疯掉,但是这就是解决方法。也许如果没有正确设置,邮件应用程序会在 Safari 中打开链接,它总是在 Safari 中打开?我不知道,但我曾经长按 -> 在“我的应用”中打开...现在链接可以正确地打开了! - Herbert Poul
1
非常感谢您提供的解决方案。我在这个问题上卡了将近一天的时间,你救了我的一天。 - andrew

24

集成通用链接后,增加项目版本或构建编号非常重要。即使您删除/重新安装应用程序,iOS也不会捕获链接,除非您对版本号进行更新。


2
这个!捆绑版本完全是导致我的测试失败的原因,因为我会按照以上所有建议进行操作,但我的链接仍然会将Safari启动为iOS正在使用先前版本的apple-app-site-association的缓存结果,该版本具有错误的appId前缀。 - zai chang
1
Kyle,我想我爱你!这个答案救了我的一天,谢谢! - neiker
1
这对我来说是秘密武器!谢谢你,谢谢你,谢谢你! - nurider
哇,这真是在瓦砾中的钻石!谢谢你!! - Starwave
经过多次试验拯救了这一天。谢谢! - firattamur

20

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

xcrun simctl openurl booted yourapp_or_http://yourlink

例如:

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


3
我还没有让它工作,它总是只打开Safari。但当我在实际设备上运行时,它们确实可以工作。如果有任何想法,将不胜感激,因为没有模拟器进行调试/开发会更加痛苦。 - chib
对我有用。在Safari页面顶部应该显示一个“使用<你的应用程序>打开”横幅。如果没有,请下拉刷新,它就会出现。 - Jay Sidri

20

我意识到对我来说问题在于指向根目录的链接(例如http://example.com/)不能打开我的应用,但如果我添加一个路径(例如http://example.com/mypath),它就可以正常工作了。将"/"添加到路径列表中即可解决问题:

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

正如 slutsker 在 这个 苹果开发者论坛的帖子中所回答的。


对我来说非常有帮助。谢谢! - Huy Nguyen

17

检查您是否已正确实现通用链接的快速步骤。

  • 点击并长按预期启动应用程序的链接。您应该在上下文菜单中看到“在 [你的应用程序名称] 中打开”。

  • 打开笔记应用程序,键入您希望打开应用程序的链接。点击“完成”。链接将变成黄色,点击链接应该会打开您的应用程序,而不是 Safari。

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

  • 在 Safari 中,如果上下文菜单显示“在 [你的应用程序名称] 中打开”,但点击链接却在 Safari 中打开链接而不是启动应用程序,则:

    a. 尝试向下拉打开链接时打开的 Safari 页面,就像 'pull to refresh' 的方式一样。一个横幅应该出现,可以打开您的应用程序。点击横幅以打开应用程序,按 home 按钮关闭应用程序,回到 Safari 并再次尝试通过点击链接启动应用程序。这次应用程序应该会启动,因为点击横幅应该已经保存了在应用程序中打开链接的偏好。

    b. 如果在第 a 步之后仍然无法启动应用程序,请尝试将链接发送到诸如 Gmail 等网络邮件中,并在 Safari 中打开该网站然后尝试点击链接。如果这样能够启动应用程序,则您可能一直在尝试从与链接相同的域中启动应用程序。从我看来,大多数情况下从相同域启动应用程序会失败。也许 Safari 不会在用户所在的相同域内检查目标 URL 是否为通用链接。因此,请尝试从另一个域启动应用程序。


3
就是这样,已经花了几个小时来处理这个问题,从同一域名启动应用程序大多数情况下都会失败。谢谢 :) - maledr53

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