众所周知,电子钱包并不是CIS中最受欢迎的服务。 但是客户已经在连续的第二个项目中设置了任务“与电子钱包进行集成”。 因此,我决定写这篇文章来讨论整个服务,并展示如何将我的产品集成到其中。
什么是钱包? 它使您可以在手机中保留各种类型的卡(机票,打折卡等),从而使产品用户的生活更加轻松。 此外,可以通过推送通知来更新有关地图的信息,但这是另一篇文章的主题。 但是,如果您有可以集成到电话中的卡/票/订阅,那么有解决方案! 怎么做-阅读下面。
通常,您的服务器负责创建地图。 该应用程序以.pkpass文件的形式接收卡,并且用户可以通过该应用程序将该卡添加到电子钱包中。
地图结构
从开发人员的角度来看,地图是什么? 地图是扩展名为.pkpass的档案。 它包含显示和操作卡所需的所有数据。 存档的内容在下表中。
档案文件 | 预约时间 |
---|
background.png | 卡的背景图片。 |
footer.png | 条形码旁边的图像 |
icon.png | 通知和字母的图标 |
logo.png | 卡的标志。 显示在左上方 |
manifest.json | 所有包含文件的注册表 |
签名 | PKCS7签名 |
pass.json | 外观和地图信息 |
strip.png | 该图片位于卡的主要说明后面 |
thumbnail.png | 附加图片(请指定) |
可以使用以下类型的卡:
- 登机票:乘飞机或火车。 通常,优惠券只能使用一次;
- 优惠券:用于优惠券和特别优惠;
- 活动票:可以在一个活动和整个季节使用;
- 折扣卡:会员卡,折扣卡或礼品卡;
- 普通证:如果上述情况都不适用:例如地铁卡或健身房通行证。
示意性地考虑不同卡的外观。 图片的最佳命名如上表所示。
登机牌

优惠券

活动门票

社区卡

优惠卡

Pass.json结构
必填字段。 包含通行证类型ID,团队ID,组织名称等。
相关应用程序的键。 需要显示需要与地图“关联”的应用程序。
键入“到期日期”卡。
相关性的关键。 例如,可以使用地图的区域的坐标,或打算使用地图的事件的开始。
关键是风格。 本文开头列出了5种用于电子钱包的卡片。 他们每个人都有自己的风格。 这样的密钥必须严格地是一个。
卡外观设计的按键。 除了显而易见的内容外,它们还包含有关在地图上显示的条形码的信息。
Web服务密钥。 您可以使用Web服务与地图进行交互,例如,自动更新地图。
NFC密钥。 包含有关Apple Pay交易的其他信息。
现在更详细地介绍所有内容。
必填项
键入JSON | 资料类型 | 内容描述 |
---|
说明 | 弦乐 本地化 | 地图的简要说明。 本地化。 |
formatVersion | 整数 | 文件格式版本。 该值必须为1。 |
机构名称 | 弦乐 本地化 | 发行卡的组织的名称。 |
passTypeIdentifier | 弦乐 | 传递类型ID和开发者帐户。 |
序列号 | 弦乐 | 单卡序列号 |
teamIdentifier | 弦乐 | 开发团队的团队ID |
相关应用程序的按键
键入JSON | 资料类型 | 内容描述 |
---|
relatedStoreIdentifiers | [Int] | 可选地。 与卡关联的应用程序的ID。 始终采用与当前设备兼容的第一个。 |
appLaunchURL | 弦乐 | 打开时传递给应用程序的URL |
样式键
键入JSON | 资料类型 | 内容描述 |
---|
primaryFields | [JSON] | 有关地图的基本信息。 |
次要领域 | [JSON] | 背景信息。 |
assistantFields | [JSON] | 有关其他信息的字段。 选配 |
headerFields | [JSON] | 地图标题。 即使卡在列表中可见,也会显示。 |
assistantFields | [JSON] | 有关地图的基本信息。 |
运输类型 | 弦乐 | 票卡的运输类型。 它可以采用以下值: PKTransitTypeAir, PKTransitTypeBoat, PKTransitTypeBu`, PKTransitTypeGeneric, PKTransitTypeTrain。 |
backFields | [JSON] | 负责地图背面的字段数组 |
在这种情况下,JSON具有以下形式:
"key" : "value1", "label" : "value2", "value" : "value3"
使用值键输入的值可以是数字或字符串。 但是,不能使用currencyCode和字符串值。 至于auxiliaryFields和secondaryFields,可以有多个,您应该监视它们中使用的行的长度。
视觉设计的关键
键入JSON | 资料类型 | 内容描述 |
---|
条码 | [JSON] | 条形码信息(请参见下文)。 |
backgroundColor | 颜色为字符串 | 背景颜色(#Fa32e4) |
前景色 | 颜色为字符串 | 标签颜色与值 |
groupingIdentifier | 弦乐 | 对于活动票和交通票是可选的。 具有相同样式的卡片-passTypeIdentifier和groupingIdentifier-将被分组 |
labelColor | 颜色为字符串 | 用字段名称标记文本 |
logoText | 可本地化的字符串 | 徽标旁边显示的文字 |
条码
地图上最重要的部分。 卡片识别号被缝入其中(例如,物理卡号或票证号)。 扫描仪或任何其他工具能够以正确的编码读取代码很重要。
键入JSON | 资料类型 | 内容描述 |
---|
altText | 弦乐 | 如果未读取条形码,则会在条形码旁边显示可选文本。 |
格式 | 弦乐 | 条码格式。 可以采用以下值:PKBarcodeFormatQR, PKBarcodeFormatPDF417, PKBarcodeFormatAztec, PKBarcodeFormatCode128 |
讯息 | 弦乐 | 用条形码加密的代码或卡号。 |
messageEncoding | 弦乐 | 消息编码。 通常为iso-8859-1 |
所在位置
这些钥匙负责卡的使用位置。
键入JSON | 资料类型 | 内容描述 |
---|
高调 | 弦乐 | 如果未读取条形码,则会在条形码旁边显示可选文本。 |
纬度 | 经度 | 纬度 |
经度 | 双倍 | 纬度 |
相关文字 | 弦乐 | 用户输入卡的范围时在锁定屏幕上显示的可选文本。 |
背面
可以在反向信息部分放置其他信息:使用条款,自动更新策略,联系方式以及该卡所属应用程序的链接。 该图显示了pass.json中字段的对应关系以及地图背面的外观。 如果在值字段中有链接,电话号码等,它们将自动突出显示。

创建地图。 第二部分
这样,图片准备就绪,形成了pass.json,将其放在一起即可。 为此,请填写manifest.json(请参阅表1),在其中您需要包括所有图片和pass.json。 原来是这样的:
. . . . . . "pass.json" = 303c753abc39aa732ec74643d6db28348fe8a823; "strip.png" = 736d01f84cb73d06e8a9932e43076d68f19461ff; "strip@2x.png" = 468fa7bc93e6b55342b56fda09bdce7c829d7d46; . . . . . .
从这一点开始,无需更改任何内容,因为SHA将是不正确的;如果进行更改,则必须重新生成SHA。
接下来,您需要在开发人员的办公室中创建通行证类型ID并为其制作证书。 如果您以前创建过此过程,则应该或多或少熟悉该过程,例如,Provisioning配置文件。

接下来,转到“钥匙串”,然后从那里导出.pem的“ Apple全球开发者关系证书”(WWDR)。

从那里,我们将创建的通行证类型ID导出为.p12。 此时,管家将要求您输入证书的密码。 在这种情况下,密码是可选的。
请注意,所有其他操作都必须在一个文件夹中执行,该文件夹应已位于manifest.json,pass.json和图片中。
现在您需要生成一个签名,我们将对存档进行签名。 首先,将通行证类型ID及其密钥导出为.pem。
openssl pkcs12 -in certificate.p12 -clcerts -nokeys -out passcertificate.pem -passin pass: your_password
和
openssl pkcs12 -in certificates.p12 -nocerts -out passkey.pem -passin pass: -passout pass:new_password
现在我们准备生成签名。 让我们将其作为命令:
openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem -inkey passkey.pem -in manifest.json -out signature -outform DER -passin pass:___
因此,一切准备就绪,仅收集档案,我们使用以下命令执行此操作:
zip -r nameOfPass.pkpass manifest.json pass.json signature logo.png logo@2x.png logo@3x.png icon.png icon@2x.png icon@3x.png
我提请您注意以下事实:您要在其中包括卡的数据存档(.pkpass)的所有文件都应在此处列出。
结果,我们得到一个.pkpass文件,该文件可以在计算机上打开。 我们将看到卡的预览,其外观可能与手机上的外观有所不同。
所有这些都可以轻松一点。 Apple提供了signpass
实用程序( Apple Wallet示例 signpass
),该实用程序负责所有SHA计算( manifest.json
文件可以保留)和创建签名的工作。 要使用它,您需要构建一个项目并将signpass
文件放入具有所有必要资源的文件夹中。

通常,结构应如下所示:

接下来,执行命令:
./signpass -p wallet
钱包是所有资源都位于其中的文件夹的名称。 输出为wallet.pkpass。 可以通过将wallet.pkpass解压缩来查看其内容。
unzip wallet.pkpass
可能将pkpass的创建提交给后端,在这种情况下,有必要将.p12形式的通行证ID证书及其密码传送给WWDR开发人员。
应用整合
为了使应用程序能够向电子钱包添加卡片,您必须在应用程序ID中启用此功能,并且还必须在项目的功能中启用此功能。


这对于使用Wallet进行完整正确的工作是必要的。 否则,将无法从电子钱包读取卡,例如,将无法了解是否添加了我们的卡。 同样重要的是要注意pass.json中的团队ID必须与团队ID匹配,否则您必须手动将它们添加到权利中,这样可以解决这种情况,但是我没有进行检查。

添加卡
添加地图非常简单:
guard let passPath = Bundle.main.path(forResource: "wallet", ofType: "pkpass") else { return } let error: ErrorPointer = ErrorPointer(nilLiteral: ()) guard let passData = NSData(contentsOfFile: passPath) else { return } let pass = PKPass(data: passData as Data, error: error) let passLibrary = PKPassLibrary() passLibrary.addPasses([pass]) { (status) in print(passLibrary.containsPass(pass)) }
但是,同样,更多时候需要从您的服务器下载.pkpass文件。
值得注意的是,PassKit会产生相当可读的错误,因此您可以轻松地了解到底做错了什么。
要获取有关电子钱包中可用的卡以及与您的应用程序相关的信息,您需要转到PKPassLibrary对象。
let passLibrary = PKPassLibrary() let passes = passLibrary.passes()
因此,您可以了解是否添加了地图以及更新界面。 另外,通过PKPassLibrary可以更新和删除地图。 也可以通过Web服务来更新地图,但是在本文中我们将不考虑这种选择。
唯一性检查
由于通常在您的服务中,卡与帐户绑定,因此在应用程序中,您很有可能必须以某种方式确定卡是否属于当前用户。 我建议通过serialNumber
执行此操作。 例如,设置用户或卡号的serialNumber
ID。
测试中
苹果提供了针对不同类型的pkpass示例,您可以专注于它们。
苹果钱包样品
要查看地图的外观,可以将pkpass添加到项目中(请参阅“添加地图”)。 上面已经讨论了添加/删除过程,仅需记住,如果钱包卡是在一个开发者的帐户上创建的,而开发本身是从另一个帐户(与外包公司相关)进行的,则应用程序将看不到已经添加的卡。 在这种情况下,您可以添加卡而不会出现问题。
您可以使用任何QR码扫描仪检查条形码中的信息是否正确编码。 而且绝对有必要检查此扫描仪的工作是否正确。
结论
本文研究了创建和设计地图的过程,以及与应用程序集成的过程和可能出现的问题。 我故意没有解决与Web服务和地图更新集成的问题,我希望在下一篇文章中做到这一点。
所用材料:
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/Creating.html
https://developer.apple.com/library/archive/documentation/UserExperience/Reference/PassKit_Bundle/Chapters/TopLevel.html#//apple_ref/doc/uid/TP40012026-CH2-SW3
https://itechroof.wordpress.com/2015/11/30/apple-wallet-part-13/
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/Updating.html
特别感谢mehdzor提供的测试开发人员帐户。