苹果钱包 这是什么以及如何将您的卡集成到其中

众所周知,电子钱包并不是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提供的测试开发人员帐户。

Source: https://habr.com/ru/post/zh-CN428437/


All Articles