iOS 通用链接无法在应用内打开

iOS Universal Links are not opening in-app

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

Apple Association 文件也在 link 目录中准备好了:
WEB_PAGE:PORT_NUMBER/apple-app-site-association

一切似乎都在这边布置好了

我已经添加了权利,更新了配置文件,一切都已设置好。

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

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

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

但是一筹莫展。

有人完善过这个吗?有什么我想念的吗?

有几个可能的问题。

  1. 尝试将您的域粘贴到此 link 验证器中并确保没有问题:https://limitless-sierra-4673.herokuapp.com/ (credit to ShortStuffSushi -- see repo)

  2. 如果您没有在权利中指定的域上正确设置 TLS,
  3. iOS 会在系统日志中记录一条错误消息。它隐藏在 OS 日志中,而不是应用程序日志中。错误消息将类似于 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。从 here, quick (incomplete) instructions on using CloudFlare for TLS here.

  4. 中提取的错误消息
  5. 在我的个人测试中,clicking/typing 在 link 中的 Safari 中从未直接打开过该应用程序。从其他应用程序(iMessage、Mail、Slack 等)点击 有效。其他人报告说,点击 Google 搜索结果中的 link 会直接打开该应用程序。

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

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

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

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

正如 slutsker 在 this Apple 开发者论坛帖子中的回答。

有很多方法可能会出错。有两点困扰我:

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

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

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

St.derrick 的 内容丰富。

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

  • 在邮件或 iMessage 中长按通用 link,然后您将看到是否在 safari 或 App 中打开的选项。

我设法让它工作了,但它花了很多时间和努力。请注意,除非您签署 apple-app-site-association 文件(签署是可选的!)在 Safari 中点击 link 将 打开你的应用程序(这让我很头疼)。

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

  • 点击并按住您希望启动应用程序的 link。您应该在上下文菜单中看到 "Open in [your app name]"。

  • 打开 Notes 应用程序,键入您希望打开该应用程序的 link。点击完成。 link 将变为黄色,点击 link 应该会打开您的应用,而不是 Safari。

  • 如果linkhttp://yourDomain.com is not launching the app, try http://yourDomain.com/yourFolder/

  • 在 Safari 中,如果上下文菜单在 Safari 中显示 "Open in [your app name]",但点击 link 会在 Safari 本身中打开 link 而不是启动应用程序,

    一个。尝试在单击 link 时打开的 safari 页面下拉,就像您 'pull to refresh' 一样。应该会出现一个可以打开您的应用程序的横幅。点击横幅打开应用程序,按主页按钮关闭应用程序,返回 safari 并再次点击 link 尝试启动应用程序。这一次,应用程序应该会启动,因为点击横幅应该会保存在应用程序中打开 link 的首选项。

    b。如果应用程序在步骤 a. 后仍未启动,请尝试将 link 邮寄到网络邮件(例如 gmail),然后在 safari 中打开网络邮件站点并尝试单击 link。如果这有效,您可能一直在尝试从与 link 相同的域启动应用程序。据我所知,从同一域启动应用程序大多失败。当 link 与用户所在的域相同时,safari 可能不会关心检查目标 url 是否是通用 link。所以尝试从另一个域启动应用程序。

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

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

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

上面写着:

The value of the appID key is the app’s team ID and the bundle ID

应该是

The value of the appID key is the app’s Prefix and the bundle ID

对于大多数应用来说,Team ID 和应用前缀似乎是相同的,但如果您的应用已在商店上架多年,这些值可能会有所不同。

要查找此值,请在 https://developer.apple.com 上打开会员中心并查看 "Certificates, Identifiers & Profiles",单击 "Identifiers",然后在 table 下的 "App IDs" "Identifiers"。找到您的应用,并使用那里的前缀值和 Bundle ID 为关联文件创建您的 AppID。

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

(Preferences > Accounts > View Details > Download All)

You can test universal links in simulator

来自App Search Programming Guide: Support Universal Links

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

我的问题原来是 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/*" ]
      }]
  }
}

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

查看:

Universal Links Debugging Guide

如果您只是想重新设置通用链接,本指南非常有用:

iOS Deep Linking Setup Guide

希望对您有所帮助!

在集成通用链接后增加项目版本或内部版本号也非常重要。即使你 delete/reinstall,iOS 也不会获取链接,除非你升级版本。

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

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

在设备日志中,如果设备和服务器之间的身份验证错误,将打印一个值,如 "TrustResultValue" : 4TrustResultValue 为 5 表示证书用于错误的域(例如,test.com 来自 www.test.com)。 TrustResultValue 为 4 表示此用途不信任该证书。

可能有一些有用的调试步骤 here。 "Testing access to apple-app-site-association" 部分是有关如何确保设备正在获取 apple-app-site-association 文件的分步指南。步骤归结为:

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

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

  3. 在 xcode 中,打开 Window -> 设备,然后 select 您的设备。

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

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

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

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

    找到该错误

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

对我来说,我的错误是我们的站点正在将 www.domain.com 重定向到 domain.com,因此所有 www.domain.com/* 都将因此失败。希望对您有所帮助。

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

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

这将随后 "remember" 打开应用程序。

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

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

在 iOS 9 上它工作正常,但在 iOS 10 上它没有工作。

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

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

因为https://example.com/.well-known/apple-app-site-association path redirected to 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 路径无法正常工作,它会破坏通用链接。

    如果您将 link 粘贴到浏览器 URL 字段中,
  • 通用 Links 将不起作用。

  • 通用 Links work 具有用户驱动的 <a href="..."> 元素点击 跨域.示例:如果 google.com 上有通用 Link 指向 bnc.lt,它将打开应用程序。

  • 通用 Links 将 无法工作 对于用户驱动的 <a href="..."> 元素点击 在同一个域。示例:如果 google.com 上有一个 Universal Link 指向 google.com 上的另一个 Universal Link,它不会打开应用程序。

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

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

第三颗子弹花了我大约一天的时间才弄明白。

为了帮助调试此问题,请在安装应用程序时在设备的控制台输出中搜索 "swcd",以查看注册通用 link 是否成功。

  1. 使用实际设备,而不是模拟器。
  2. 从您的设备中删除该应用程序。
  3. 将设备连接到您的计算机,并在 xcode 中查看设备的控制台输出。 (window -> 设备 -> [您的设备] -> 打开控制台)。保持此 window 打开。
  4. 安装您的应用并让它启动。
  5. 将控制台输出过滤为 "swcd"。如果成功,您将看到类似以下屏幕截图的内容。如果它失败了,你会看到别的东西。如果您没有看到任何东西,那么您搞砸了一些基本的事情,例如添加关联域权利。

还没有真正看到完全相同的 issue/solution 组合,让它为我工作所以不妨添加我的,以防有人遇到同样的问题!

对于我的应用程序,我正在使用自定义 URL 方案(在 APP_TARGET > Info > URL Types 中设置)并将此处的 URL 方案设置到 Firebase 控制台中以匹配但仍然不匹配在职的。

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

注意勾选自动管理签名

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

在 URL 类型

中将您的 TeamID 作为捆绑包标识符的前缀

在我确保这些在我的 Firebase 控制台和 Xcode 中匹配后,我的下一个问题是我的 URL 方案的标识符。通常在这里使用您的包标识符,但 Firebase 实际上用您在 Firebase 控制台中提供的团队 ID 作为前缀,所以我不得不将它作为前缀添加到 Xcode 中 URL 类型部分的标识符中出色地。

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

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

我也遇到过类似的情况。然而,在我的情况下,iOS10 工作正常,无论我做什么(增加内部版本号、delete/reinstall 等),iOS9 似乎拒绝工作。

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

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

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

解决方法:如果支持iOS9,将文件放在/apple-app-site-association.

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

applinks:xxxx.app.link

仅在存档(也是临时)应用程序并将其安装到 phone 后才能工作。

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

我刚刚创建了一个事件并在事件的 URL 字段中添加了我想测试的 URL。然后,在查看创建的事件时,您只需点击 URL link 即可打开您的应用程序。

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

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=confirm&*”时,它开始工作

就我而言,对 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.)

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

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

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

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

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

applinks:example.com

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

Https://example.com

因为我的 AASA 没有签名,我想确保我通过 HTTPS 提供服务。所以当我在我的笔记应用程序中尝试使用时它起作用了:

example.com

它适用于我在物理设备上使用 iOS 12.1.2 以及来自 Xcode 的开发构建或来自 Testflight

的分发构建

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

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

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

    另外 API Validation Tool 也没有帮助我们,因为 test 它说的环境

Error no apps with domain entitlements The entitlement data used to verify deep link dual authentication is from the current released version of your app. This data may take 48 hours to update.

不过最后网站没问题。

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

  1. 为了处理 iOS 应用程序设置,最好有 Console 应用程序 运行,过滤仅显示 swcd 过程,正如该线程中已经提到的那样。

在我们的案例中,问题在于我们依赖通配符 URL,形式为:applinks:*.prod_site_name.com,认为 * 将涵盖所有前置测试环境,如 https://test_env.num4.prod_site_name.com,但是这是行不通的。控制台显示:

Started request for domain '*.prod_site_name.com', URL 'https://prod_site_name.com/.well-known/apple-app-site-association'

所以我们的解决方法是为应用程序的测试目标提供 test-specific 应用程序链接,例如:applinks:test_env.num4.prod_site_name.com

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

我们必须将 www. 添加到 .entitlements 文件中的 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

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

如果您在 Firebase 上托管 apple-app-site-association,请确保将其放在 /.well-known/ 子目录中!看起来 Xcode 先查询 URL ,如果成功,它不会尝试查询根目录中的 apple-app-site-association 。出于某种原因,firebase 工程师让托管网站自动响应 /.well-known/apple-app-site-association,使用一个空的(但格式正确的)关联文件覆盖您的自定义文件,让您不知道为什么没有任何效果!

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

这对我有用。

编辑:经过两次否决后,我想澄清一下,几个月后我仍然使用这个确切的解决方案。它确实有效,但还有其他原因可能无法立即对您的应用程序起作用。这包括您将不得不删除应用程序并重新启动 phone 甚至多次。最终,它链接。我不确定为什么这么难,但这个解决方案确实有效。所以请继续尝试,如果您有任何问题,请随时发表评论,以便我尽力提供帮助。

如果您使用的是 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')

在花了一天时间尝试让它工作后,重新启动我的 phone 解决了问题。

Uninstalling/Reinstalling 该应用程序也无法运行。

对于 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。

没有用“但是”,因为我是从某篇文章里抄来的,那篇文章的“专家”作者把它打上了那样的符号,我是从他那里抄来的。

顺便说一句,目标站点上仍然没有信息框,例如“您可以使用该应用程序打开它”,但是如果我单击 link 例如来自 Notes 应用程序的应用程序已打开。

错误:

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

好:

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

在我的 cas 中它不工作,因为我有 2 个项目

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

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

在我的例子中,我需要让服务器使用内容类型 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 时,文件会被下载而不是显示,但这对我来说不是问题。

和往常一样,使用真实设备,每当您更改内容时重新安装应用程序,可能还会重新启动设备并可能增加应用程序版本号。

有一种新的文件格式 - 检查这个 link: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 中打开通用 link。为了测试该应用程序是否识别应用程序 link,我将 URL 添加到便笺或日历条目,然后长按它以显示上下文菜单。如果显示“在 {YOUR APP} 中打开”,则 link 正在运行,但 iOS 决定在 Safari 中打开它。点击“在 {YOUR APP} 中打开”将告诉 iOS 从那时起通过您的应用程序打开有效的通用 links。