首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么一些苹果钱包生成的QR代码包含这么多额外的垃圾?

为什么一些苹果钱包生成的QR代码包含这么多额外的垃圾?
EN

Stack Overflow用户
提问于 2021-07-06 05:35:24
回答 2查看 2.8K关注 0票数 6

我正试图为智能健康卡QR代码创建一个苹果钱包密码。

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

代码语言:javascript
复制
shc:/567629095243206034602924374044603122295953265460346029254077280433602870286471674522280928613331456437653141590640220306450459085643550341424541364037063665417137241236380304375622046737407532323925433443326057360106452931531270742428395038692212766728666731266342087422573776302062041022437658685343255820002167287607585708105505622752282407670809680507692361773323356634342439664440596761410443377667202663224433674530596175400038397052612140292974753658337372662132066669047253044469405210524536242721550377673434280323045475690310233670562227414567090555653507636250537239522776211205312561442568282012726838630039087127042463716936535535602928393065580072763158437500341209546904210458383257586630101033123422114008776058732325243477645920113037325929083272452732223707055550412927584543582550667760036577724025621136525340592771740903663844771261692077697211447057562509437029626707254539002011763240720310114260256672645965627243654061066553770056003044082967606162724306592273682223412466107335331229606157521057357572327529693965670332063208596309543400076452696835713027450728663529345234666377297208583525543653527774072234735706452828641140633528387577054371703966706421520708254156041170353656054471407636552612616834377244090406554327122559623453686207006139712936404138601156656945315611255669116044703333731263580306106975715411702932060511012768634011703371553353213365032550756476005853005224547339310064671161682376335069647622323339523133724171327531702738363650063527592633763908656123314363227707566731311074

使用大多数标准的QR代码生成器,这将提供以下QR代码(正确、预期)。

在我的pass.json文件中,我有以下QR代码段:

代码语言:javascript
复制
*snip* "barcode":{"message":"shc:\/567629095243206034602924374044603122295953265460346029254077280433602870286471674522280928613331456437653141590640220306450459085643550341424541364037063665417137241236380304375622046737407532323925433443326057360106452931531270742428395038692212766728666731266342087422573776302062041022437658685343255820002167287607585708105505622752282407670809680507692361773323356634342439664440596761410443377667202663224433674530596175400038397052612140292974753658337372662132066669047253044469405210524536242721550377673434280323045475690310233670562227414567090555653507636250537239522776211205312561442568282012726838630039087127042463716936535535602928393065580072763158437500341209546904210458383257586630101033123422114008776058732325243477645920113037325929083272452732223707055550412927584543582550667760036577724025621136525340592771740903663844771261692077697211447057562509437029626707254539002011763240720310114260256672645965627243654061066553770056003044082967606162724306592273682223412466107335331229606157521057357572327529693965670332063208596309543400076452696835713027450728663529345234666377297208583525543653527774072234735706452828641140633528387577054371703966706421520708254156041170353656054471407636552612616834377244090406554327122559623453686207006139712936404138601156656945315611255669116044703333731263580306106975715411702932060511012768634011703371553353213365032550756476005853005224547339310064671161682376335069647622323339523133724171327531702738363650063527592633763908656123314363227707566731311074","format":"PKBarcodeFormatQR","messageEncoding":"iso-8859-1"} *snip*

当这个pass被添加到Apple Wallet时,我在Wallet应用程序中得到以下QR代码:

从技术上讲,这似乎是对相同的数据进行编码。然而,由于苹果钱包通行证中的QR代码如此之小,而且代码中充斥着不必要的垃圾,所以我没有多少运气能让任何QR代码阅读器从我的设备屏幕上实际读取它,就像通常如何使用Passbook通行证一样。

我没有找到任何方法来设置Passbook中的纠错级别,但是当我尝试使用不同的纠错级别来生成QR代码时,即使是最高的纠错级别也不会产生像我的Apple Wallet生成的QR代码。考虑到第二段代码中正确的2/3看起来有多重复,我的猜测是它是空填充,但我不确定。

这里发生了什么,我如何修复它,使我的传递包含来自第一个示例的QR代码,而没有所有额外的垃圾?如果不可能修复,是否有一种方法,我只是嵌入正确的QR代码的图像,但它显示的足够大,以扫描?

========

更新:仅删除shc:/头似乎是谨慎的QR代码看起来更接近预期;虽然这个头是必要的,所以这不是一个解决方案,我猜这意味着Wallet只是很难对它进行有效的编码。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-08 12:42:55

Apple Wallet中的代码看起来非常不同,因为它使用了一种低效的方法来编码所涉及的数据。

苹果钱包(PassKit)可能使用CIQRCodeGenerator核心图像过滤器来生成QR代码。过滤器根据给定的数据自动选择最合适的编码模式,在这种情况下选择二进制/字节模式。由于绝大多数智能卡数据都是用数字表示的(每位数字只携带3.3位信息),因此以二进制模式(8位/字符)对其进行编码效率很低。这就是为什么QR代码看起来更密集,但却是重复的原因。

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

其他一些QR代码生成器可以更好地处理这一问题,因为它们能够以最大的效率分割数据。实际上,框架协议被描述为 -用于shc:/的二进制模式和可选的块前缀,然后是数字模式。

不幸的是,苹果钱包内部似乎没有解决这个问题的方法,至少在iOS 14的时候是这样。核心图像过滤器的灵活性不足以用多种模式对数据进行编码,而PassKit本身仍有很多有待改进的地方。

票数 4
EN

Stack Overflow用户

发布于 2021-09-30 05:58:53

iOS 15.0+已经修复了这个问题。对于shc:/ content,它的纠错级别较低:m now。

我希望苹果能把这个移植到iOS 14或13。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68265073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档