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

Apple app site association not working over AWS CloudFront and S3

这是我的设置:

我的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 方面,我的目标在签名和功能 > 关联域中有以下行:

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] Cannot show Automatic Strong Passwords for app bundleID: BundleId due to error: Cannot save passwords for this app. Make sure you have set up Associated Domains for your app and AutoFill Passwords is enabled in Settings

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

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

在此先感谢您的帮助!

来自docs

Note
If your app runs in iOS 9 or later and you use HTTPS to serve the apple-app-site-association file, you can create a plain text file that uses the application/json MIME type and you don’t need to sign it. If you support Handoff and Shared Web Credentials in iOS 8, you still need to sign the file as described in Shared Web Credentials Reference.

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

我终于成功了。我做了 4 件不同的事情,我认为其中只有 2 件很重要,但我会 post 把它们全部放在这里,以防它能帮助遇到同样问题的人。

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 选项卡,并使用对象路径 /.well-known/apple-app-site-association.

创建了一个 Invalidation

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

,而不是每次测试都必须上传我的文件两次

为了帮助其他人,我遇到了类似的问题,文件内容类型不正确 header。我 re-uploaded 使用以下文件:

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