zoukankan      html  css  js  c++  java
  • 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];
    }
  • 相关阅读:
    用call/apply实现bind
    FED1 修改 this 指向(中等)
    46. 全排列(中等)
    JavaScript 用七种方式教你判断一个变量是否为数组类型(转)
    179. 最大数(中等)
    125. 验证回文串(简单)
    执行git pull命令时出错
    前端修改滚动条样式
    js实现每日定时任务
    Vue实现验证码控件
  • 原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/9287137.html
Copyright © 2011-2022 走看看