iOS9:Universal Links不起作用

时间:2015-09-23 23:45:40

标签: ios objective-c xcode ios9 ios-universal-links

所以我按照教程https://blog.branch.io/how-to-setup-universal-links-to-deep-link-on-apple-ios-9进行操作,并使用与提供的值完全相同的值。

Apple Association文件也在链接目录中准备好了: WEB_PAGE:PORT_NUMBER /苹果应用内站点关联

似乎一切都在这方面设置。

我已添加了权利,更新了配置文件以及所有设置。

当我在设备上运行应用程序并打开链接http://WEB_PAGE:PORT_NUMBER时,这将始终打开Safari。

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

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

但是zilch。

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

40 个答案:

答案 0 :(得分:170)

有一些可能的问题。

  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 for TLS herehere快速(不完整)说明中提取错误消息。

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

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

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

答案 1 :(得分:55)

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

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

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

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

答案 2 :(得分:29)

documentation for making the association file for Universal Links中显然存在错误。

它说:

  

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

应该说

  

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

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

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

答案 3 :(得分:23)

St.derrick的Answer提供了丰富的信息。

但要再次启用通用链接以在app中打开而不是safari,我们需要执行以下操作。

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

答案 4 :(得分:21)

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

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

答案 5 :(得分:18)

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

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

答案 6 :(得分:15)

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

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

由slutsker在this Apple Developer Forums主题中回答。

答案 7 :(得分:15)

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

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

  • 打开Notes应用,输入您希望打开该应用的链接。点按“完成”。链接将变为黄色,点击链接应该打开您的应用程序,而不是Safari。

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

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

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

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

答案 8 :(得分:10)

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

答案 9 :(得分:7)

  • 如果您将链接粘贴到浏览器网址字段中,则无法使用通用链接。

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

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

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

    < / LI>

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

第三个子弹花了我一天的时间来计算。

答案 10 :(得分:7)

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

检查出来:

Universal Links Debugging Guide

Debugging Guide preview

如果您只是想设置Universal Link,那么本指南非常有用:

iOS Deep Linking Setup Guide

希望他们有所帮助!

答案 11 :(得分:5)

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

尽管Apple没有明确说明,但apple-app-site-association文件必须通过https提供,即使已签名。用于https的证书也必须由apple信任。因此,在设置中添加到设备的证书 - &gt;一般 - &gt;配置文件将允许Safari中的https,它不允许通用链接工作。

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

调试here可能有一些有用的步骤。 &#34;测试访问apple-app-site-association&#34;部分是如何确保设备获取apple-app-site-association文件的分步指南。步骤归结为:

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

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

  3. 在xcode中,打开Window - &gt;设备,然后选择您的设备。

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

  5. 单击垃圾桶清除日志,清除之前可能相关的所有日志。

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

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

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

答案 12 :(得分:5)

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

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

Pull down in Safari, and OPEN again

这将随后记得&#34;打开应用程序。

答案 13 :(得分:4)

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

xcrun simctl openurl booted yourapp_or_http://yourlink

例如:

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

答案 14 :(得分:3)

  

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

来自App Search Programming Guide: Support Universal Links

答案 15 :(得分:3)

让我接近一天来解决这个问题。 我遇到的问题是没有在XCode中下载更新的配置文件(之后我也重新启动了XCode)。

  

(首选项&gt;帐户&gt;查看详细信息&gt;全部下载)

答案 16 :(得分:3)

我设法让它发挥作用,但是花了很长时间才挣扎。请注意,除非您签署 apple-app-site-association 文件(签名是可选的!)点击Safari中的链接打开您的应用(这让我很头疼)。

答案 17 :(得分:2)

如果您将apple-app-site-association托管在 Firebase 上,请确保将其放在/.well-known/子目录中!似乎Xcode首先查询该URL,如果成功,则不会尝试查询根目录中的apple-app-site-association。由于某些原因,firebase工程师使托管网站能够使用一个空(但格式正确)的关联文件自动响应/.well-known/apple-app-site-association,该关联文件会覆盖您的自定义文件,从而使您不知道为何什么都不起作用!

答案 18 :(得分:2)

Haven真的看到完全相同的问题/解决方案组合让它为我工作所以不妨添加我的,因为有人有同样的问题!

对于我的应用,我使用的是自定义网址方案(在APP_TARGET > Info > URL Types中设置),并将此处的网址方案设置为Firebase控制台以匹配但仍无法正常工作。

我的问题实际上是两个问题:

注意检查自动管理签名

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

将您的TeamID添加到您的网址类型

中的捆绑标识符

在我的Firebase控制台和Xcode中确保这些匹配后,我的下一个问题是我的URL方案的标识符。在此处使用您的捆绑包标识符是典型的,但Firebase实际上使用您在Firebase控制台中提供的团队ID前缀,因此我必须在Xcode的URL类型部分中将其作为标识符的前缀。

经过这两次修复并重新下载GoogleService-Info.plist文件后,我可以打开动态链接。

答案 19 :(得分:2)

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

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

在iOS 9上它工作得很好,但在iOS 10上它没有用。

问题似乎是 .well-已知路径:

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

在我看来,如果以某种方式.well-known路径无法正常工作,它会破坏通用链接。

答案 20 :(得分:2)

转到developer.apple.com并编辑您的一个分发配置文件。在编辑页面中,您可以打开弹出应用ID ,其中会显示您的应用名称列表,并在应用名称后面的()圆括号中显示您的所有真实应用ID 。某些应用可能会将您的团队ID作为前缀,但有些应用不是。确保使用您在()内的弹出菜单中看到的内容,并将其放入apple-app-site-association详细信息appID字段中。我的应用程序及其通用链接确实存在这个问题。

答案 21 :(得分:1)

对我而言,我的错误是我们的网站将www.domain.com重定向到domain.com,因此所有www.domain.com/*都会失败。希望有所帮助。

答案 22 :(得分:1)

两天后,我发现这些链接(来自分支机构)

  

applinks:xxxx.app.link

仅在归档(也是Ad-hoc)应用程序并将其安装到手机后才能工作。

答案 23 :(得分:1)

我可以使用日历应用在iOS模拟器中测试通用链接。

我刚创建了一个活动,并在活动的URL字段中添加了我想要测试的网址。然后,在查看创建的活动时,您只需点按网址链接即可打开您的应用。

答案 24 :(得分:1)

我的问题原来是apple-app-site-association文件。根据Apple的文档,只需要applinks参数。我添加了activitycontinuation参数,但它确实有效。

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

答案 25 :(得分:1)

就我而言,我需要让服务器使用内容类型 apple-app-site-association 提供 application/pkcs7-mime 文件。在 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 时,文件被下载而不是显示,但在我的情况下这不是问题。

和往常一样,使用真实设备,在更改内容时重新安装应用,也可能重启设备并可能增加应用版本号。

答案 26 :(得分:1)

经过两天的绝望,我终于解决了。这是我的解决方案:

似乎较旧的应用程序使用的前缀与较新的应用程序不同。较新的应用程序仅将Team ID用于此目的。如果应用程序前缀和团队ID不同,则似乎需要在Apple应用程序站点关联文件中指定活动继续字段:

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

我在地狱途中遇到的另一件事是删除应用程序并重新启动设备似乎是强制刷新此文件的唯一方法。

答案 27 :(得分:1)

对于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"]
  }
}

答案 28 :(得分:1)

花了一天的时间让它工作后,重新启动手机解决了问题。

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

答案 29 :(得分:0)

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

答案 30 :(得分:0)

有一种新的文件格式 - 请查看此链接: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"
        ]
    }
}

注意:在模拟器中它不起作用,但在设备上运行良好。

答案 31 :(得分:0)

在我的cas中,它没有醒来,因为我有2件物品

mycolor

当我将数组减少为仅一项时,它开始工作。

答案 32 :(得分:0)

在我的情况下,原因是无效的JSON。

它没有使用“而是”,因为我是从某篇文章中复制出来的,而文章的“专家”作者则用这样的标语标出,然后从他那里复制出它。

顺便说一句,目标站点上仍然没有信息框,例如“您可以使用该应用程序打开它”,但是如果我单击链接,例如从Notes应用程序中打开该应用程序。 < / p>

错误:

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

好:

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

答案 33 :(得分:0)

希望这对某人有帮助,因为这花了我大约两天的时间。

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

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

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

N.B。通用链接仍适用于yourdomain.comwww.yourdomain.com

答案 34 :(得分:0)

我还将在故障排除方面写上​​笔记。

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

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

    testAPI Validation Tool并没有帮助我们 它说的环境

  

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

但最终网站还可以。

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

  1. 要处理 iOS 应用程序设置,最好运行Console应用程序,并过滤以仅显示swcd进程,如本线程中所述。< / li>

在我们的案例中,问题在于我们依赖于通配符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

答案 35 :(得分:0)

对我来说,在实现了上述所有答案并测试了确实使用mpoisot的答案下载了AASA文件之后,我的问题是在Xcode中我将关联域添加为:

applinks:example.com

在我的便笺应用中,我试图使用:

Https://example.com

因为我的AASA未签名,并且我想确保自己通过HTTPS提供服务。因此,在我尝试使用的笔记应用程序中,它可以正常工作:

 example.com

它适用于我在物理设备上使用iOS 12.1.2以及Xcode的开发版本或Testflight的发行版

答案 36 :(得分:0)

在我的情况下,对AASA文件的请求位于:https://example.com/apple-app-site-association

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

踢球者是-在iOS 11上运行正常,但在iOS 9.3.5上失败。试一试。

解决方案apple-app-site-association文件不得位于iOS 9的302或301重定向后面。(公平地说,这在UL troubleshooting page上有说明。)< / p>

答案 37 :(得分:0)

在我的情况下,我的错误是将查询参数放在路径中:

private List<string> GetWords(string text)
    {
        Regex reg = new Regex("[a-zA-Z0-9]");
        string Word = "";
        char[] ca = text.ToCharArray();
        List<string> characters = new List<string>();
        for (int i = 0; i < ca.Length; i++)
        {
            char c = ca[i];
            if (c > 65535)
            {
                continue;
            }
            if (char.IsHighSurrogate(c))
            {
                i++;
                characters.Add(new string(new[] { c, ca[i] }));
            }
            else
            {
                if (reg.Match(c.ToString()).Success || c.ToString() == "/")
                {
                    Word = Word + c.ToString();
                    //characters.Add(new string(new[] { c }));
                }
                else if(c.ToString() == " ")
                {
                    if(Word.Length > 0)
                        characters.Add(Word);
                    Word = "";
                }
                else
                {
                    if(Word.Length > 0)
                        characters.Add(Word);
                    Word = "";
                }

            }

        }
        return characters;
    }

当我从路径中删除'?target = confirm&*'时,它开始起作用

答案 38 :(得分:0)

对于找到此页面的未来读者......

我有类似的情况。但是,在我的情况下,iOS10正在使用AOK,无论我做了什么(颠倒构建号码,删除/重新安装等),iOS9似乎拒绝工作。

我是从iOS10来的,需要支持iOS9。当时,此处的文档 - https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html - 明确指出该文件可能位于Web服务器的根目录(例如/apple-app-site-association)或.well-已知文件夹(例如{{ 1}})。因为我也支持Android,它也使用.well-known文件夹作为类似的文件,所以我决定把它们放在那里。

对于iOS10上的全新安装,它明确请求根文件,失败,然后请求.well已知文件,并成功。

对于iOS9,它明确要求根文件,失败,并且不做任何其他事情。

解决方案:如果您支持iOS9,请将文件放在/.well-known/apple-app-site-association

答案 39 :(得分:-1)

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

这对我有用。

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

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