参考文章
https://blog.csdn.net/sz_vcp2007/article/details/60762349
https://blog.csdn.net/eqera/article/details/8136880
阅读上诉两篇文章后基本可以做出来了
在下再稍稍整理完善出来(以下内容多出自摘取):
1、什么是PKPass文件?
PKPass 是Apple定义的一套针对商家消费券、优惠券、火车机票等票据格式类文件。包含:图标icon、缩略图thumbnail和logo外最重要的就是pass.json、manifest.json和signature等文件的一个压缩包
2、如何制作PKPass文件?
1)、服务器端制作是比较通用的做法
这里有一个Java写的开源库:
Java版本制作PKPass的web service
2)、本地制作,按照下面的步骤:
1、证书申请,去苹果开发者网站
申请Pass Type id,并且生成对应的证书(申请之前需要到钥匙串:从证书颁发机构请求证书,老一套操作,先创建ID再编辑ID中选择新建证书,后下载安装证书以备用)
2、资源文件准备
准备icon、logo(钱包里面的左上角logo)和strip(钱包里面的卡券缩略图)三类图片 ,可以再增加background(背景图)h.lproj/pass.strings(本地化文本)等(所有使用到的文件必须在manifest.json上写上)
3、制作pass.json
配置pass.json,这里还是强调一下passTypeIdentifier和teamIdentifier,前者就是上面在开发者中心创建的Pass Type ID(”pass.com.appname.walletname“),后者是对应的团队标识,申请苹果开发者账号时会分配一个唯一的团队标识(可以在苹果开发者中心–查看账户信息中查看”Team ID“)。其他信息根据实际情况配置。
{ "formatVersion": 1, "passTypeIdentifier": "你的passTypeId", "serialNumber": "应该是一串唯一标识字符串如54afe978584e3", "teamIdentifier": "开发者标识", "authenticationToken": "可以识别是授权标识暂不清楚如bc83dde3304d766d5b1aea631827f84c", "barcode": { "message": "这里是二维码的信息内容", "altText": "这是二维码下面的标注", "format": "PKBarcodeFormatQR", "messageEncoding": "iso-8859-1" }, "locations": [ { "longitude": -122.3748889, "latitude": 37.6189722 }, { "longitude": -122.03118, "latitude": 37.33182 } ], "organizationName": "组织名称也就是卡券颁发者", "logoText": "显示在logo旁边的文本", "description": "", "foregroundColor": "rgb(2,2,4)", "backgroundColor": "rgb(244,244,254)", "storeCard": { "headerFields": [ { "key": "date", "label": "余额", "value": "¥888.66" } ], "secondaryFields": [ { "key": "more", "label": "换成自己其它希望显示的字段", "value": "换成自己其它希望显示的字段值" } ], "backFields": [ { "key": "records", "label": "点击更多信息显示背面时显示的文本说明字段", "value": " 改字段下面的描述文本内容" }, { "key": "phone", "label": "这些key,label,value的具体值都是自定义的", "value": "另一个字段下面的描述文本内容" }, { "key": "terms", "label": "会员规则", "value": "你想说明的规则,当然可以是其它字段\n标识换行" }, { "key": "support", "label": "技术支持", "value": "写不写都可以毕竟内容完全自定义" } ] }, "labelColor": "rgb(87,88,93)" }
4、创建manifest.json文件,可以通过”openssl sha1 [文件路径]“分别计算出所有文件的哈希值:(一个文本说明所有文件的哈希值,所有用到的资源文件都要有,pass.json必须在)
{ "background.png" :"844a6063e4192f4f4f34b2cf36996b6b06a6f355", "background@2x.png" :"56c66001a5edb87c2b58180daa3e443dcac887e4", "pass.json" :"a4f8506e362888755ddf744365cc3cf615e4e6b1", "es.lproj/pass.strings" :"b698506e362888755ddf744365cc3cf615e4e6b1", "icon.png" :"105d0f906f633c378d738477fef0d51e0ccec2d2", "icon@2x.png" :"f5c3db953176da14d6d1c3c27de12e14119173da", "logo.png" :"78a778accde869cea3364bb828074d7a8f0067ce", "logo@2x.png" :"af77501cac762637bdb4545b3b758ae4b4632422", "zh.lproj/pass.strings" :"a4f8506e362888755ddf744365cc3cf615e4e6b1", "zh.lproj/background.png" :"2888755ddfa4f8506e36744365cc3cf615e4e6b1", "zh.lproj/background.png@2x": "f8506e362a4888755ddf744365cc3cf615e4e6b1" }
4、生成signature文件:
a.通过前面导入的Pass Type证书(Pass Type ID:你的PTID)导出个人信息交换(.p12)文件并指定密码(假设密码为123123),保存成”mywallet.p12“(注意是导出证书而不是导出证书下的专用秘钥)。
b.在钥匙串中找到”Apple Worldwide Developer Relations Certification Authority“证书导出增强保密邮件(.pem),保存成”AWDRCA.pem“。
c.将.p12证书转化为.pem证书mywallet.pem(需要输入导出时设置的密码123123),输入如下命令:
openssl pkcs12 -in mywallet.p12 -clcerts -nokeys -out mywallet.pem -passin pass:123123
d.从.p12导出秘钥文件mywalletkey.pem(这里设置密码为123456)
openssl pkcs12 -in mywallet.p12 -nocerts -out mywalletkey.pem -passin pass:123123 -passout pass:123456
e.根据AWDRCA.pem、mywallet.pem、mywalletkey.pem、manifest.json生成signature文件(按照提示输入mywalletkey.pem导出时设置的密码123456):
openssl smime -binary -sign -certfile AWDRCA.pem -signer mywallet.pem -inkey mywalletkey.pem -in manifest.json -out signature -outform DER
5.将icon.png、icon@2x.png、logo.png、logo@2x.png、strip.png、strip@2x.png 、pass.json、manifest.json、signature压缩成pass包(这里命名为”mywallet.pkpass“,pass.json和manifest.json以及所有用到的资源和描述文件必须都在)。
zip -r mywallet.pkpass manifest.json pass.json signature logo.png logo@2x.png icon.png icon@2x.png strip.png strip@2x.png
iOS端如何加载PKPass文件?
1、进入Apple 开发者网站,新建一个App ID,跟第2步的App ID一致,在新建的时候说明要使用到钱包功能
2、Xcode新建一个工程,Bundle Identifier中命名一个App ID
2、选择目标Target,点击“Capabilities”标签,打开Wallet开关。
4、进入目标Target,General标签,让Xcode自动为我们管理证书
5、把上面制作的PKPass文件拖到项目中
6、编码读取并显示,至于加不加入到钱包是用户决定的
#import "ViewController.h" #import <PassKit/PassKit.h> @interface ViewController ()<PKAddPassesViewControllerDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. PKAddPassButton *pkAddBtn = [[PKAddPassButton alloc] initWithAddPassButtonStyle:PKAddPassButtonStyleBlack]; pkAddBtn.titleLabel.font = [UIFont systemFontOfSize:12]; pkAddBtn.frame = CGRectMake(100, 100, 220, 40); [self.view addSubview:pkAddBtn]; [pkAddBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; } - (void)btnClick:(PKAddPassButton *)button { NSString *passPath=[[NSBundle mainBundle] pathForResource:@"mywallet" ofType:@"pkpass"]; NSData *passData = [[NSData alloc] initWithContentsOfFile:passPath]; NSError *error = nil; PKPass *pass = [[PKPass alloc] initWithData:passData error:&error]; if (error) { NSLog(@"创建Pass过程中发生错误,错误信息:%@",error.localizedDescription); }; PKAddPassesViewController *vc = [[PKAddPassesViewController alloc] initWithPass:pass]; vc.delegate = self; [self presentViewController:vc animated:true completion:nil]; } -(void)addPassesViewControllerDidFinish:(PKAddPassesViewController *)controller{ NSLog(@"add pass finished."); [self dismissViewControllerAnimated:true completion:nil]; }