【问题标题】:Apple app site association not working over AWS CloudFront and S3Apple 应用程序站点关联不适用于 AWS CloudFront 和 S3
【发布时间】:2020-04-10 14:19:37
【问题描述】:

这是我的设置:

  • 我有一个带有自定义有效 SSL 证书(来自 ACM)的 AWS CloudFront 分配
  • CF 分发点指向 S3 存储桶
  • 我的域 example.com 是我的 CF 分发的别名的 A 记录
  • 我使用以下参数将 apple-app-site-association 和 .well-known/apple-app-site-association 上传到我的存储桶:Public Read, Content-Type=application/pkcs7-mime

我的apple-app-site-association如下:

{
   "webcredentials": {
       "apps": [    "TeamID.BundleId1",
                    "TeamID.BundleId2" ]
    }
}

当然,这些值将替换为我的团队 ID 和我的 2 个应用程序的捆绑包 ID。

当我跑步时

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

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

我有以下结果:

HTTP/2 200 
content-type: application/pkcs7-mime
content-length: 156
date: Wed, 18 Dec 2019 03:08:15 GMT
last-modified: Wed, 18 Dec 2019 03:04:14 GMT
etag: "redacted"
x-amz-server-side-encryption: AES256
accept-ranges: bytes
server: AmazonS3
x-cache: Miss from cloudfront
via: 1.1 redacted.cloudfront.net (CloudFront)
x-amz-cf-pop: redacted
x-amz-cf-id: redacted

{
   "webcredentials": {
       "apps": [    "TeamID.BundleId1",
                    "TeamID.BundleId2" ]
    }
}

这告诉我文件有效且托管正确。

在 Xcode 方面,我的目标在 Signing & Capabilities > Associated Domains 中有以下行:

webcredentials:example.com

所以我的权利文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>aps-environment</key>
    <string>development</string>
    <key>com.apple.developer.associated-domains</key>
    <array>
        <string>webcredentials:example.com</string>
    </array>
</dict>
</plist>

但是,当我转到应用上的注册屏幕时,我有以下控制台日志:

[AutoFill] 无法显示 app bundleID 的自动强密码: BundleId 由于错误:无法保存密码 对于这个应用程序。确保您已为您的 应用程序和自动填充密码在设置中启用

我正在 iOS 13 上的真实设备上进行测试,并且启用了 AutoFill。

注意:我的应用尚未上线(以防我被建议使用 Apple 爬虫,又名 App Search API 验证工具)

提前感谢您的帮助!

【问题讨论】:

    标签: ios amazon-web-services amazon-s3 amazon-cloudfront apple-app-site-associate


    【解决方案1】:

    来自docs

    注意
    如果您的应用程序在 iOS 9 或更高版本中运行并且您使用 HTTPS 来提供 apple-app-site-association 文件,您可以创建一个使用 application/json MIME 类型的纯文本文件,并且您不需要对其进行签名。如果您在 iOS 8 中支持 Handoff 和 Shared Web Credentials,您仍需要按照 Shared Web Credentials Reference 中的说明对文件进行签名。

    所以您回复中的content-type: application/pkcs7-mime 似乎有误,请尝试将其更改为application/json

    【讨论】:

    • 那行不通。我使用 application/json 的 Content-Type 标头将文件重新上传到 S3,我收到了相同的消息。我用 curl 检查了我得到了正确的 Content-Type:“content-type: application/json”。由于错误,无法显示应用 bundleID 的自动强密码:无法保存此应用的密码。确保您已为您的应用设置关联域并在设置中启用自动填充密码
    • 我刚刚为我的一个应用程序添加了一个网络凭证权利,结果 plist 中有这个:&lt;string&gt;webcredentials:example.com&lt;/string&gt; - 你的冒号后面有一个空白。尝试删除它。
    • 其实我的没有任何空间,这是我在SO上用example.com替换我的域时犯的错误
    • 您的答案未包含解决我的问题的所有步骤,但也许 mime 类型更新很重要(我没有测试在我的答案中的步骤之后返回 pkcs7-mime)。无论如何,我会给你赏金来感谢你试图帮助和奖励你努力这样做的努力。祝你明年快乐!
    【解决方案2】:

    我终于设法让它工作了。我做了 4 件不同的事情,我认为其中只有 2 件很重要,但我会将它们全部发布在这里,以防它对遇到相同问题的人有所帮助。

    1:使用我的 iPhone 开发者 ID 而不是我的团队 ID(重要)

    当我在开发环境中调试应用程序时,该应用程序使用我的 iPhone 开发人员证书而不是我团队的生产证书进行签名。所以我将我的 apple-app-site-association 文件从

    {
       "webcredentials": {
           "apps": [    "TeamID.BundleId1",
                        "TeamID.BundleId2" ]
        }
    }
    

    {
       "webcredentials": {
           "apps": [    "TeamID.BundleId1",
                        "TeamID.BundleId2",
                        "iPhoneDeveloperID.BundleId1",
                        "iPhoneDeveloperID.BundleId2" ]
        }
    }
    

    2:在测试前使 AWS CloudFront 缓存失效(重要)

    在测试时,我最终发现我有时会得到旧版本的 apple-app-site-association,这取决于我用来获取它的设备或软件应用程序。 所以我登录到 CF 控制台,选择了我的发行版,选择了 Invalidations 选项卡,并创建了一个 Invalidation with Object Path /.well-known/apple-app-site-association

    3:添加应用链接

    我不确定这是否对我的问题有任何影响,因为我只是在尝试此操作后才使缓存无效,但为了以防万一它对某人有所帮助,我决定将应用链接添加到我的应用中。我在我的 apple-app-site-association 中 webcredentials 之后添加了以下对象

    "applinks": {
            "apps": [],
            "details": [
                {
                    "appID": "iPhoneDeveloperID.BundleId1",
                    "paths": [ "*"]
                },
                {
                    "appID": "iPhoneDeveloperID.BundleId2",
                    "paths": [ "*" ]
                },
                {
                    "appID": "TeamID.BundleId1",
                    "paths": [ "*"]
                },
                {
                    "appID": "TeamID.BundleId2",
                    "paths": [ "*" ]
                }
            ]
        }
    

    确保您正在测试的应用程序位于顶部,因为其他应用程序将被丢弃(第一个通配符获胜)。这显然必须在投入生产之前进行更改。

    我在我的应用中添加了以下权利

    <string>applinks:example.com</string>
    

    4:只使用 .well-known

    再一次,我不认为这很重要,但我不必为每次测试上传两次文件,而是停止使用根目录,只上传到/.well-known/apple-app-site-association

    【讨论】:

      【解决方案3】:

      如果它可以帮助其他人,我遇到了类似的问题,即文件在正确的内容类型标题下无效。我使用以下内容重新上传了文件:

      aws s3 cp --content-type "application/pkcs7-mime" public/.well-known/apple-app-site-association s3://mywebsite/.well-known/
      

      【讨论】:

        猜你喜欢
        • 2018-08-05
        • 2021-05-14
        • 1970-01-01
        • 2020-04-24
        • 2019-07-03
        • 2014-06-10
        • 2021-08-10
        • 2017-07-04
        • 1970-01-01
        相关资源
        最近更新 更多