为啥某些 Apple Wallet 生成的 QR 码包含这么多额外的垃圾?

Posted

技术标签:

【中文标题】为啥某些 Apple Wallet 生成的 QR 码包含这么多额外的垃圾?【英文标题】:Why do some Apple Wallet generated QR codes contain so much additional junk?为什么某些 Apple Wallet 生成的 QR 码包含这么多额外的垃圾? 【发布时间】:2021-09-16 18:18:00 【问题描述】:

我正在尝试为 SMART Health Card 二维码创建 Apple Wallet 通行证。

二维码的内容将类似于以下虚拟数据,并且似乎是以中等纠错级别生成的:

shc:/567629095243206034602924374044603122295953265460346029254077280433602870286471674522280928613331456437653141590640220306450459085643550341424541364037063665417137241236380304375622046737407532323925433443326057360106452931531270742428395038692212766728666731266342087422573776302062041022437658685343255820002167287607585708105505622752282407670809680507692361773323356634342439664440596761410443377667202663224433674530596175400038397052612140292974753658337372662132066669047253044469405210524536242721550377673434280323045475690310233670562227414567090555653507636250537239522776211205312561442568282012726838630039087127042463716936535535602928393065580072763158437500341209546904210458383257586630101033123422114008776058732325243477645920113037325929083272452732223707055550412927584543582550667760036577724025621136525340592771740903663844771261692077697211447057562509437029626707254539002011763240720310114260256672645965627243654061066553770056003044082967606162724306592273682223412466107335331229606157521057357572327529693965670332063208596309543400076452696835713027450728663529345234666377297208583525543653527774072234735706452828641140633528387577054371703966706421520708254156041170353656054471407636552612616834377244090406554327122559623453686207006139712936404138601156656945315611255669116044703333731263580306106975715411702932060511012768634011703371553353213365032550756476005853005224547339310064671161682376335069647622323339523133724171327531702738363650063527592633763908656123314363227707566731311074

使用大多数标准二维码生成器,这会给出以下(正确的、预期的)二维码。

在我的 pass.json 文件中,我有以下二维码片段:

*snip* "barcode":"message":"shc:\/567629095243206034602924374044603122295953265460346029254077280433602870286471674522280928613331456437653141590640220306450459085643550341424541364037063665417137241236380304375622046737407532323925433443326057360106452931531270742428395038692212766728666731266342087422573776302062041022437658685343255820002167287607585708105505622752282407670809680507692361773323356634342439664440596761410443377667202663224433674530596175400038397052612140292974753658337372662132066669047253044469405210524536242721550377673434280323045475690310233670562227414567090555653507636250537239522776211205312561442568282012726838630039087127042463716936535535602928393065580072763158437500341209546904210458383257586630101033123422114008776058732325243477645920113037325929083272452732223707055550412927584543582550667760036577724025621136525340592771740903663844771261692077697211447057562509437029626707254539002011763240720310114260256672645965627243654061066553770056003044082967606162724306592273682223412466107335331229606157521057357572327529693965670332063208596309543400076452696835713027450728663529345234666377297208583525543653527774072234735706452828641140633528387577054371703966706421520708254156041170353656054471407636552612616834377244090406554327122559623453686207006139712936404138601156656945315611255669116044703333731263580306106975715411702932060511012768634011703371553353213365032550756476005853005224547339310064671161682376335069647622323339523133724171327531702738363650063527592633763908656123314363227707566731311074","format":"PKBarcodeFormatQR","messageEncoding":"iso-8859-1" *snip*

当这张卡被添加到 Apple Wallet 时,我会在 Wallet 应用程序中获得以下二维码:

这在技术上似乎确实对相同的数据进行了编码。但是,由于 Apple Wallet 通行证中的 QR 码非常小,而且代码中包含不必要的垃圾,因此我没有太多运气让任何 QR 码阅读器从我的设备屏幕上实际读取它,就像 Passbook pass 一样通常会使用。

我没有找到任何方法在 Passbook 中设置纠错级别,但是当我尝试使用不同的纠错级别生成 QR 码进行检查时,即使是最高纠错级别也不会生成像我的 Apple Wallet 制作的一款。鉴于第二个代码的右 2/3 看起来有多么重复,我的猜测是它是空填充,但我不确定。

这里发生了什么,我该如何解决它,以便我的通行证包含第一个示例中的 QR 码,而没有所有额外的垃圾?如果无法修复,有没有办法让我只在通行证上嵌入正确 QR 码的图像,但让它显示得足够大以便扫描?

========

更新:仅删除 shc:/ 标头似乎可以生成看起来更接近预期的二维码;尽管此标头是必需的,因此这不是解决方案,但我猜这意味着 Wallet 很难有效地对其进行编码。

【问题讨论】:

您找到任何解决方案或解决方法了吗? 不。 ios 15 专门提供了对智能健康卡的支持,但如果能更好地控制一般的 QR 码仍然会很不错。 【参考方案1】:

Apple Wallet 中的代码看起来非常不同,因为它使用了一种低效的方法来对相关数据进行编码。

Apple Wallet (PassKit) 可能使用CIQRCodeGenerator Core Image 过滤器来生成二维码。过滤器根据给定的数据自动选择最合适的编码模式,在这种情况下它选择了 binary/bytes 模式。由于绝大多数 SMART 健康卡数据以数字表示(每个数字仅携带约 3.3 位信息),因此以 二进制 模式(8 位/字符)对其进行编码效率相当低。这就是为什么二维码看起来更密集但重复的原因。

当您删除 shc:/ 时,生成的 QR 码看起来更“正确”,因为过滤器随后能够以纯 numeric 模式进行编码。有趣的是,如果您将shc:/ 全部更改为大写,过滤器将以字母数字 模式进行编码,这仍然比二进制 模式更有效地处理此数据。

其他一些 QR 码生成器可以更好地处理此问题,因为它们能够对数据进行分段以获得最大效率。事实上,框架协议described as much — shc:/binary 模式和可选的块前缀,然后是 numeric 模式。

不幸的是,至少在 iOS 14 中似乎没有办法在 Apple Wallet 中解决此问题。Core Image 过滤器根本不够灵活,无法使用多种模式对数据进行编码,而且 PassKit 本身仍然会留下一个有很多不足之处。

【讨论】:

你知道有什么库可以让你选择更好的编码吗?我一直在搜索,发现的所有内容都使用CIQRCodeGenerator...【参考方案2】:

iOS 15.0+ 已修复此问题。对于 shc:/ 内容,它具有较低级别的纠错:M now。

我希望 Apple 将其移植到 iOS 14 或 13。

【讨论】:

以上是关于为啥某些 Apple Wallet 生成的 QR 码包含这么多额外的垃圾?的主要内容,如果未能解决你的问题,请参考以下文章

Apple Wallet 和 Google Wallet PCI 合规性

Apple Wallet 中的 Apple Watch 1D 条码不可见

Apple Wallet NFC 加密PublicKey

将银行卡添加到Apple Wallet

Apple Wallet 的新发行者(应用内配置)

Apple Pay 检测 Wallet 没有信用卡