iOS9:Universal Links不起作用

Leg*_*las 97 xcode objective-c ios ios9 ios-universal-links

所以我也跟着教程https://blog.branch.io/how-to-setup-universal-links-to-deep-link-on-apple-ios-9,准确地使用相同的值提供的一个.

Apple协会文件也已准备好在链接目录中: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
Run Code Online (Sandbox Code Playgroud)

但齐尔奇.

有没有人完善这个?有什么我错过了吗?

st.*_*ick 176

有一些可能的问题.

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

  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的快速TLS(不完全)的说明这里.

  3. 在我的个人测试中,点击/输入Safari中的链接从未直接打开过应用程序.从其他应用程序(iMessage,Mail,Slack等)单击已经有效.其他人报告说,点击Google搜索结果中的链接已直接打开了该应用.

  4. 请注意,如果通用链接成功打开您的应用,然后您点击进入Safari(通过点击应用中导航栏右上角的网站),则iOS会在您访问该网址时停止打开该应用.然后在Safari中,您可以向下拉以在"打开"页面顶部显示横幅.我浪费了很多时间在这上面.请注意,根据您在apple-app-site-assocation文件中指定的路径,单击进入站点=>禁用UL似乎特定于路径.因此,如果您有单独的路线,yoursite.com/a/*并且yoursite.com/b/*,如果您单击yoursite.com/a/*并直接打开您的应用程序,则可以在应用程序的右上角选择单击以进入yoursite.com/a/*.如果你这样做,后续访问yoursite.com/a/*将在浏览器中打开,而不是应用程序 但是,yoursite.com/b/*应该不受影响,仍然可以直接打开您的应用.

如果你发现问题是什么,请告诉我.我个人非常好奇Universal Links如何工作以及存在哪些边缘情况.祝好运.

  • 重新启动iOS设备也可能有所帮助.我检查了所有设置和配置,我完全确定一切都是正确的,但它仍然无法正常工作.然后我尝试使用其他设备,它完美无缺.然后我从原始设备中删除了应用程序,重新启动了设备并重新安装了应用程序,然后它才刚刚起作用...... (7认同)
  • 关于1),如果您通过https提供服务,则不再需要签署您的apple-app-site-association文件. (4认同)
  • 如果有人不小心按下应用程序右上角的网站链接,如何回到应用程序而不是safari? (4认同)
  • 我没有在任何地方获得Open in App横幅广告.经过长时间的搜索,这是一个解决方案:在Notes应用程序中键入您网站的任何链接(这是一个通用链接).现在点击完成.一旦它成为链接,长按它并选择"在AppNAME-HERE中打开"! (2认同)

小智 61

有很多方法可能会出错.两点给我带来麻烦:

  • 在Xcode中,当您添加Associated Domains权利时,每个条目都需要以applinks:您的域名开头,然后是您的域名.例如applinks:www.apple.com.

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

是的,在这之后,没有必要签署apple-app-site-association文件:它只是纯文本,只要它通过HTTPS提供,它就可以工作.(不过,如果你支持iOS 8,你仍然需要签名.)

  • 你节省了我的一天,这是我的问题,虽然XCode为我创建了一个权利文件,它没有包含在我的构建中:我必须手动点击该框. (13认同)
  • 在构建中包含权利文件也为我解决了问题.值得注意的是,在Xcode 8中,文件检查器中的目标成员资格复选框实际上已被禁用.我不得不转到构建设置并将权利文件添加到"复制资源"阶段. (10认同)
  • 我还必须从测试设备中完全删除应用程序,然后在最终工作之前再次构建和运行. (4认同)
  • @AwaisFayyaz转到构建阶段>复制捆绑资源.单击加号,然后添加您的授权文件. (4认同)
  • 正如 @cham 询问“虽然 XCode 为我创建了一个权利文件,但它没有包含在我的构建中:我必须手动单击该框。” 必须单击**哪个**框。在哪里? (3认同)
  • @cham:你们可以详细说明"虽然XCode为我创建了一个权利文件,但它不包含在我的版本中:我必须手动点击该框." (2认同)

小智 33

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

在哪里说:

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

应该说

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

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

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

  • +1,这对我帮助很大.花半天时间弄清楚它为什么不起作用,这对我来说似乎就是这样 (2认同)

Pra*_*een 24

St.derrick的答案提供了丰富的信息.

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

  • 长按Mail或iMessage中的Universal链接,您将看到是否在Safari或App中打开的选项.

  • 没有`app`选项,只能复制、打开、添加到阅读列表等 (3认同)

mpo*_*sot 23

为帮助调试此问题,请在安装应用程序时在设备的控制台输出中搜索"swcd",以查看注册通用链接是否有效.

  1. 使用实际设备,而不是模拟器.
  2. 从您的设备中删除该应用.
  3. 将设备连接到计算机,然后在xcode中查看设备的控制台输出.(窗口 - >设备 - > [您的设备] - >查看设备日志).保持此窗口打开.
  4. 安装您的应用并让它启动.
  5. 将控制台输出过滤为"swcd".如果它成功了,你会看到类似下面的截图.如果它失败了你会看到别的东西.如果你没有看到任何东西,那么你搞砸了一些基本的东西,比如添加Associated Domains权利.

Applink已成功添加

  • 没有 swcd 过滤,我仍然看到很多不相关的行 (3认同)
  • 很棒的提示!我将 https:// 添加到 applinks: entitlement 并指定了我想听的完整路径,这两个都是错误的。我指定了 https://example.com/path/* ,我应该只在其中指定我的 domain.com 和 example.com 上的 AASA 文件,然后根据我的应用程序包 ID 指定路径 (2认同)
  • 我可以给您现金奖金吗?我花了2天的时间来完成这个怪异的通用链接设置的每一步,直到尝试了您的方法之前,没有任何帮助。我真不幸将我的关联文件托管在我的域的firebase的根文件夹中,结果是Apple首先查询.well-known /子目录,而firebase似乎用自己的(!)正确的关联文件对其进行响应没有关联的应用。天哪,苹果,我该怎么发现呢? (2认同)
  • 默认情况下应该这么冗长吗?因为我没有得到如此详细的日志..这是否意味着操作不成功? (2认同)

Dev*_*evy 21

apple-app-site-association在服务器端验证,您可以使用Apple的官方验证器.

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

  • 自 2023 年起不再工作。50​​3 错误 (4认同)

tid*_*eck 17

我意识到对我来说问题是链接到根目录a(例如.http://example.com/)没有打开我的应用程序,但如果我添加了一个路径(例如.http://example.com/mypath)它工作.添加"/"到路径列表中的是:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TEAM_ID.BundleIdentifier",
                "paths": [ "*", "/" ]
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

正如在回答slutsker 这个苹果开发者论坛线程.


Nik*_*hew 15

快速检查您是否已正确实施Universal Link的步骤.

  • 点按并按住您希望启动该应用的链接.您应该在上下文菜单中看到"在[您的应用名称]中打开".

  • 打开Notes应用程序,键入您希望打开应用程序的链接.点按"完成".链接将变为黄色,点击链接应打开您的应用程序,而不是Safari.

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

  • 在Safari中,如果上下文菜单在Safari中显示"在[您的应用名称]中打开",但点击该链接会在safari中打开链接而不是启动该应用,

    一个.尝试拉下点击链接时打开的Safari页面,就像你"刷新"一样.应该会出现一个可以打开您的应用的横幅.点击横幅打开应用程序,按主页按钮关闭应用程序,返回safari并再次点击链接尝试启动应用程序.这一次,应用程序应该启动,因为点击横幅应该保存首选项以打开应用程序中的链接.

    湾 如果在步骤a.之后仍无法启动应用程序,请尝试将链接发送到gmail等网络邮件,然后在Safari中打开webmail网站并尝试单击该链接.如果这样做,您可能一直在尝试从与链接相同的域中启动应用程序.从我所看到的,从同一个域启动应用程序大多失败.当链接进入用户所在的同一域时,可能safari不会关心目标URL是否为通用链接.因此,尝试从其他域启动该应用程序.

  • 就是这样,一直在处理这个问题几个小时,从同一域启动应用程序大多失败。谢谢 :) (3认同)

Kyl*_*ott 11

在集成通用链接后增加项目版本或内部版本号也非常重要.即使您删除/重新安装,iOS也不会获取链接,除非您碰到版本.

  • 这个!捆绑版本完全是导致我的测试失败的原因,因为我会通过上述所有建议并且我的链接仍然会启动 Safari,因为 iOS 正在使用来自先前版本的“apple-app-site-association”的缓存结果有错误的 appId 前缀 (2认同)

gui*_*ido 8

  • 如果将链接粘贴到浏览器URL字段中,则Universal Links将无法使用.

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

  • Universal Links 无法使用用户驱动的<a href="...">元素单击同一域.示例:如果google.com上的通用链接指向google.com上的其他通用链接,则无法打开该应用.

  • 无法通过Javascript(在window.onload中或通过<a>元素上的.click()调用)触发Universal Links ,除非它是用户操作的一部分.

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

第三个子弹花了我一天的时间来弄明白.

  • 第三个子弹,在这里相同:浪费了很多时间来弄清楚。Apple 甚至对此有一个很好的非常愚蠢的解释:“iOS 尊重用户最可能的意图并在 Safari 中打开链接”见自己 [此处](https://developer.apple.com/library/content/documentation/General/概念/AppSearch/UniversalLinks.html)。 (2认同)

Chr*_*ern 7

这里的人们正在寻找其他解决方案,我们整理了整个调试Universal Links的步骤,因为我们已经看到很多问题突然出现,引起了很多麻烦.

看看这个:

通用链接调试指南

调试指南预览

如果您只是想设置新的环球链接,本指南非常有帮助:

iOS深层链接设置指南

希望他们有所帮助!

  • 链接不再有效。图像是现在唯一有用的东西。 (2认同)

And*_*kov 6

我们已将apple-app-site-association文件添加到此位置:

https://example.com/apple-app-site-association
Run Code Online (Sandbox Code Playgroud)

在 iOS 9 上它运行良好,但在 iOS 10 上它不起作用。

看来问题出在.well-known路径上:

https://example.com/.well-known/apple-app-site-association
Run Code Online (Sandbox Code Playgroud)

由于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
Run Code Online (Sandbox Code Playgroud)

在我看来,如果不知何故 .well-known 路径不能正常工作,它会破坏通用链接。


Ani*_*ita 6

对于 ios13,有一种新格式 - 请在此处查看https://developer.apple.com/documentation/safariservices/supporting_linked_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"]
  }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ott 6

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


小智 5

只是想我会添加一些我发现的东西,以防更多人在将来遇到与我相同的问题.这些主要与身份验证错误有关.

尽管apple没有明确说明,但apple-app-site-association即使签名,该文件也必须通过https提供.用于https的证书也必须由apple信任.因此,虽然在设置 - >常规 - >配置文件中添加到设备的证书将允许Safari中的https,但它不允许通用链接工作.

在设备日志中,如果设备和服务器之间出现身份验证错误,则会打印一个值"TrustResultValue" : 4.A中TrustResultValue的5表示证书适用于错误的域(例如,test.com从www.test.com提供).A TrustResultValue为4表示此用途不信任证书.

有可能是调试一些有用的步骤这里."测试访问apple-app-site-association"部分是如何确保设备获取apple-app-site-association文件的分步指南.步骤归结为:

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

  2. 停止服务器正常服务apple-app-site-association.

  3. 在xcode中,打开Window - > Devices,然后选择您的设备.

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

  5. 通过单击垃圾桶清除日志以清除可能相关的所有先前日志.

  6. 单击播放按钮,使用xcode重新安装应用程序.

  7. 应用程序启动后,如果设备正确请求文件,则设备日志应包含可通过搜索"apple-app-site-association"找到的错误.

如果apple-app-site-association文件正确提供(第2步被省略),那么应该没有错误.如果这是问题,则可以显示验证错误.


sam*_*ize 5

最常见的原因是当用户点击右上角时,告诉iOS将来不要打开应用程序(在本例中为Uber).

要修复,请下拉以显示智能横幅并点按"打开":

在Safari中拉下来,再次打开

这将随后"记住"打开应用程序.


mor*_*nab 5

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

xcrun simctl openurl booted yourapp_or_http://yourlink

例如:

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

  • 我还没有成功,它总是打开 Safari。不过,当我在实际设备上运行时,它们确实可以工作。任何想法都会受到赞赏,因为如果没有模拟器,调试/开发会更加痛苦。 (3认同)

tan*_*ton 5

经过一天的努力后,重新启动手机解决了问题。

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


use*_*952 5

我发现了 2 个有用的工具,您可以使用它们来调试通用链接的问题:

\n
    \n
  1. 在手机上打开Settings应用程序,选择Developer菜单 -> 启用Association Domain Development并选择Diagnostics。插入您已添加到权利文件中的 URL,它将被验证:\n在此输入图像描述

    \n
  2. \n
  3. 第二个在Apple 的 TN3155:调试通用链接一文中提到。我建议您阅读全文,尤其是主机并验证您的 AASA章节。

    \n
  4. \n
\n

swcutil用于验证您的 AASA 文件的提及:

\n
\n

您可以通过以下方式在终端中使用这些命令:

\n

运行sudo swcutil dl -d <domain>以检查 AASA JSON 是否可以成功下载。

\n

运行sudo swcutil verify -d <domain> -j <path-to-JSON> [-u <URL>]\n以检查下载的 .json AASA 文件的内容。验证\n您的域与 -d 匹配,并且您的 URL 路径模式与 \nJSON 与 -u 匹配。如果两者都成功,您将收到一条确认消息。

\n

对于包含 applinks:example.com 和上面显示的 AASA 的应用程序,\n这是使用 swcutil verify 的示例,其中 \xe2\x80\x9cs\xe2\x80\x9d 是服务,\n\xe2\x80\x9ca\ xe2\x80\x9d 是应用程序 ID,\xe2\x80\x9cd\xe2\x80\x9d 是域:

\n
% sudo swcutil verify -d example.com -j ./example.json -u https://example.com/test\n{ s = applinks, a = ABCD123.com.example.app, d = example.com }:\nPattern "https://example.com/test" matched.\n
Run Code Online (Sandbox Code Playgroud)\n

由于模式 /test 包含在 AASA 中,因此 JSON 已成功匹配模式并已得到验证。对于路径 /path/1,\n由于它被设置为在 AASA 中排除,您将看到一条消息\n确认排除:

\n
Pattern "https://example.com/path/1" blocked match.\n
Run Code Online (Sandbox Code Playgroud)\n
\n