5

这是我的设置:

  • 我有一个带有自定义和有效 SSL 证书的 AWS CloudFront 分配(来自 ACM)
  • 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>

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

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

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

注意:我的应用还没有上线(如果我被建议使用 Apple 爬虫又名 App Search API 验证工具)

提前感谢您的帮助!

4

3 回答 3

2

文档

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

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

于 2019-12-23T22:36:04.600 回答
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:添加应用链接

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

"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

于 2019-12-29T23:52:11.393 回答
1

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

aws s3 cp --content-type "application/pkcs7-mime" public/.well-known/apple-app-site-association s3://mywebsite/.well-known/
于 2021-01-12T20:47:06.657 回答