如何在服务器端获取Pass的PassUrl以打开iPhone Passbook中的凭证
如何获取Pass唤起链接(shoebox://card/)并实现网页唤起Passbook
首先得给你澄清一个关键误区:shoebox://card/[pass-id]这种格式的链接是用户把Pass添加到Passbook后,设备本地生成的唤起路径,服务器端没办法提前直接拿到这个链接,因为它和用户的设备、已安装的具体Pass实例绑定。
不过要实现“从网页打开指定Pass”的需求,有两种靠谱的方案可以走:
方案1:先关联Pass标识,再生成唤起链接
当你在服务器端创建Pass时,一定要在pass.json里给它设置一个唯一的serialNumber(这是Pass的核心唯一标识)。
当用户下载并添加Pass到Passbook后,你可以通过Pass的webServiceURL回调机制,让设备向你的服务器发送一个请求,把这个serialNumber和用户设备的信息关联起来(比如存到你的数据库里)。
之后,当你需要在网页中唤起这个Pass时,就可以拼接出shoebox://card/${serialNumber}的链接。不过要注意:
- 这个链接只有在用户已经把对应Pass添加到设备的Passbook里时才有效,否则点击后要么没反应,要么提示找不到Pass。
- 你可以在前端做个简单的容错:尝试唤起后,如果一段时间内没成功,就引导用户去下载Pass。
方案2:直接用下载链接+系统自动唤起逻辑
如果用户还没添加过Pass,你直接提供.pkpass文件的下载链接就行——在iPhone上点击这个链接时,iOS系统会自动唤起Passbook,要么提示添加Pass,要么如果已经添加过,直接打开对应的凭证。
你可以在网页里做个智能处理的按钮,示例代码如下:
function openOrAddPass() { // 替换成你的Pass唯一序列号和下载地址 const passSerial = "your-pass-unique-serial"; const shoeboxLink = `shoebox://card/${passSerial}`; const passDownloadUrl = "https://your-server.com/passes/your-pass.pkpass"; // 先尝试唤起已添加的Pass const start = Date.now(); window.location.href = shoeboxLink; // 如果500ms内没唤起成功(说明用户没添加过),跳转到下载链接 setTimeout(() => { if (Date.now() - start < 1000) { window.location.href = passDownloadUrl; } }, 500); }
额外提醒
- 你的Pass文件必须正确配置
pass.json里的必填字段:teamIdentifier、passTypeIdentifier、serialNumber一个都不能少,否则Passbook会拒绝识别这个Pass。 - 如果用第三方Pass生成工具,有些工具会封装好唤起逻辑,你可以查它们的文档,但核心还是基于Pass的唯一标识来做关联。
内容的提问来源于stack exchange,提问作者Micheal Vu
相关产品推荐
相关产品推荐

