我正在开发一个网络服务,使用 AWS Lambda/API gateway/NodeJS 更新 Apple Wallet 通行证。苹果钱包点击 api 以获得更新通行证,但每次我都收到以下错误:
遇到错误:收到无效的通行证数据(无法读取通行证,因为它无效。
我已经在浏览器中尝试了相同的URL来获取通行证。通票每次都在下载,每次都打开有效的通票。但是当苹果钱包点击URL时,它不起作用。我在邮递员中尝试了相同的 URL,它给了我 base64 而不是二进制数据。
我尝试使用 NodeJS 实现相同的功能并部署在 heroku 上,它与钱包一起正常工作(在邮递员中也提供二进制文件)。但我需要使用 AWS Lambda/API gateway/NodeJS。
我不确定AWS是否在提供二进制数据时更改了某些内容。
对此的任何帮助不胜感激。
我刚刚经历了这种情况,并花了几个小时试图诊断发生了什么。
对于将 AWS API Gateway 和 Lambda 用于其 PassKit Web 服务终端节点的任何人来说,API Gateway 的逻辑如何确定它是否需要从 base64 ==> 二进制转换响应,这是一个主要的"陷阱"(至少截至我的回复之日)。
如果您检查来自Apple Wallet/PassKit的请求标头,您将看到Accept
标头为*/*
。
API 网关显然会循环访问请求Accept
标头中的项目,并确定是否与您在">API 名称>设置"下定义的任何二进制媒体类型匹配。 它将使用它找到的第一个匹配项,然后如您所希望的那样,将 base64 字符串(来自 Lambda)转换为二进制。
这是疯狂的部分 - 如果您将application/vnd.apple.pkpass
定义为"请转换为二进制"媒体类型之一,则来自Apple Wallet/PassKit的请求将不起作用。 为什么? 好吧,AWS(无论出于何种原因...)还没有对*/*
进行编程以匹配任何类型的...从字面上看,它只会匹配*/*
.
因此,Accept
标头的*/*
将与application/vnd.apple.pkpass
不匹配,并且您的 base64 编码的 .pkpass 响应(来自 Lambda)将不会转换为二进制,从而导致PassKit 阻塞 + 报告错误。
TL;DR - AWS API Gateway有一些愚蠢之处。 若要成功返回 PassKit 传递数据,需要在">你的 API 名称">"设置">"二进制媒体类型">下添加*/*
(而不是application/vnd.apple.pkpass
)。