iOS钱包卡券开发(往钱包里面加自己的卡券)

参考文章

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": "你想说明的规则,当然可以是其它字段
标识换行"
            },
            {
                "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];
}
原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/9287137.html