Apple 应用程序站点关联不适用于 AWS CloudFront 和 S3

APE*_*APE 5 amazon-s3 amazon-web-services ios amazon-cloudfront apple-app-site-associate

这是我的设置:

  • 我有一个带有自定义和有效 SSL 证书的 AWS CloudFront 分配(来自 ACM)
  • CF 分布指向一个 S3 存储桶
  • 我的域 example.com 是一个 A 记录,别名为我的 CF 分配
  • 我使用以下参数将 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" ]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

当我跑

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

或者

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

我有以下结果:

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" ]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

webcredentials:example.com
Run Code Online (Sandbox Code Playgroud)

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

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

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

[自动填充] 无法为应用程序 bundleID 显示自动强密码:由于错误 BundleId:无法保存此应用程序的密码。确保你已经为你的应用设置了关联域,并且在设置中启用了自动填充密码

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

注意:我的应用程序还没有上线(以防我被建议使用 Apple crawler aka App Search API Validation Tool)

在此先感谢您的帮助!

APE*_*APE 2

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

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

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

{
   "webcredentials": {
       "apps": [    "TeamID.BundleId1",
                    "TeamID.BundleId2" ]
    }
}
Run Code Online (Sandbox Code Playgroud)

{
   "webcredentials": {
       "apps": [    "TeamID.BundleId1",
                    "TeamID.BundleId2",
                    "iPhoneDeveloperID.BundleId1",
                    "iPhoneDeveloperID.BundleId2" ]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

3:添加应用链接

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

"applinks": {
        "apps": [],
        "details": [
            {
                "appID": "iPhoneDeveloperID.BundleId1",
                "paths": [ "*"]
            },
            {
                "appID": "iPhoneDeveloperID.BundleId2",
                "paths": [ "*" ]
            },
            {
                "appID": "TeamID.BundleId1",
                "paths": [ "*"]
            },
            {
                "appID": "TeamID.BundleId2",
                "paths": [ "*" ]
            }
        ]
    }
Run Code Online (Sandbox Code Playgroud)

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

我向我的应用程序添加了以下权利

<string>applinks:example.com</string>
Run Code Online (Sandbox Code Playgroud)

4:仅使用.wellknown

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