关于添加passbook是什么意思 扫描条码

转自txx's blog前言这篇文章是我们在新发布的礼物说的iOS端开发过程中遇到的一些关于条形码的问题总结而来。本文记录的问题是:当AVFoundation使用多译码器扫描的时候。二维码是秒杀,但是条形码却经常扫不上。如果去掉二维码的话,条形码扫描又秒杀的问题。为什么我们没有选用ZXing而是用AVfoundation呢,是因为我说服了老板,iOS7开发,而不再去兼容iOS5/6。所以我们终于可以抛弃效率低下的ZXing,而选择AVFoundation。为什么说ZXing效率低下,我们这里可以说上几句。ZXingZXing 是 Google Code上的一个开源的条形码扫描库,是用java设计的,连Google Glass 都在使用的。但有人为了追求更高效率以及可移植性,出现了c++ port. Github上的Objectivc-C port,其实就是用OC代码封装了一下而已,而且已经停止维护。ZXing扫描,是拿到摄像头的每一帧,然后对其根据如下公式做灰度化f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))&&之后做全局直方图二值化的方法,最后按照ISO/IEC 18004 规范进行解析。这样效率非常低,在instrument下面可以看到CPU占用远远高于 AVFoundation。而且全局直方图二值化导致精准度并不高。这个库还会带来一大堆C++的东西,在纯iOS7的工程下,不推荐使用。AVFoundation 扫码的简单使用这里说一下,我们礼物说是和passbook一样,同时可以扫描二维码和条形码,真是因为这个特性,导致了我写这篇总结。 先粘一下扫码实现部份,如下。-&(BOOL)startReading&{&&&&&_isReading&=&YES;&&&&&NSError&*&&&&&AVCaptureDevice&*captureDevice&=&[AVCaptureDevice&defaultDeviceWithMediaType:AVMediaTypeVideo];&&&&&&AVCaptureDeviceInput&*input&=&[AVCaptureDeviceInput&deviceInputWithDevice:captureDevice&error:&error];&&&&&&if&(!input)&{&&&&&&&&&NSLog(@&%@&,&[error&localizedDescription]);&&&&&&&&&return&NO;&&&&&}&&&&&&_captureSession&=&[[AVCaptureSession&alloc]&init];&&&&&//&Set&the&input&device&on&the&capture&session.&&&&&[_captureSession&addInput:input];&&&&&&AVCaptureMetadataOutput&*captureMetadataOutput&=&[[AVCaptureMetadataOutput&alloc]&init];&&&&&[_captureSession&addOutput:captureMetadataOutput];&&&&&&//&Create&a&new&serial&dispatch&queue.&&&&&dispatch_queue_t&dispatchQ&&&&&dispatchQueue&=&dispatch_queue_create(&myQueue&,&NULL);&&&&&[captureMetadataOutput&setMetadataObjectsDelegate:self&queue:dispatchQueue];&&&&&&if&(self.qrcodeFlag)&&&&&&&&&[captureMetadataOutput&setMetadataObjectTypes:[NSArray&arrayWithObject:AVMetadataObjectTypeQRCode]];&&&&&else&&&&&&&&&[captureMetadataOutput&setMetadataObjectTypes:[NSArray&arrayWithObjects:AVMetadataObjectTypeEAN13Code,&AVMetadataObjectTypeEAN8Code,&AVMetadataObjectTypeCode128Code,&AVMetadataObjectTypeQRCode,&nil]];&&&&&&_videoPreviewLayer&=&[[AVCaptureVideoPreviewLayer&alloc]&initWithSession:_captureSession];&&&&&[_videoPreviewLayer&setVideoGravity:AVLayerVideoGravityResizeAspectFill];&&&&&[_videoPreviewLayer&setFrame:self.view.layer.bounds];&&&&&[self.view.layer&addSublayer:_videoPreviewLayer];&&&&&&[_captureSession&startRunning];&&&&&&return&YES;&}&&&-(void)stopReading{&&&&&[_captureSession&stopRunning];&&&&&_captureSession&=&&&&&&[_videoPreviewLayer&removeFromSuperlayer];&}&&-(void)captureOutput:(AVCaptureOutput&*)captureOutput&didOutputMetadataObjects:(NSArray&*)metadataObjects&&&&&&&fromConnection:(AVCaptureConnection&*)connection&{&&&&&if&(!_isReading)&return;&&&&&&if&(metadataObjects&!=&nil&&&&[metadataObjects&count]&&&0)&{&&&&&&&&&AVMetadataMachineReadableCodeObject&*metadataObj&=&[metadataObjects&objectAtIndex:0];&&&&&&&&&&Do&Something....&&&&&}&}&&这个代码也不需要加什么注释,挺简单易懂的。阐述问题我们上面说过了:当AVFoundation使用多译码器扫描的时候。二维码是秒杀,但是条形码却经常扫不上。如果去掉二维码的话,条形码扫描又秒杀的问题。但有趣的事情是,如果我写了个demo,用上述代码的话。却又可以秒杀扫描。这个问题困扰了我一下午,仔细对比了项目中的每一行代码和我demo中的全部。除了demo没有画一个提示框在屏幕上以外,其他地方全都一模一样。那么为什么导致项目中扫描效率如此之慢呢?猜想1: UI以及后台线程占用大量CPU时间结果在 instrument下,不攻自破,cpu占用,内存占用非常非常低。猜想2:系统架构问题因为添加了QRCode才导致扫描变慢的,那么就应该是和算法效率有关。多引入了一个每一帧都要工作的译码器,导致条形码扫描效率下降。我的Demo是arm64 v7s v7 系统全支持,而项目是ArmV7。这个想法挺异想天开的。觉得可能是Arm64的指令集效率比armv7快得多导致的。我还去问巧哥,armv7和arm64在密集运算的时候效率差多少,会不会比较明显。但重新配置了一下,还是错误的。插曲我发现把屏幕横过来扫描效率比竖过来高多了。于是怀疑是不是 Capture 的方向问题。猜想3: 摄像头方向问题导致解碼效率低这个猜想,我没有去证实,因为太麻烦了。要给Session 添加一个新的output 来输出每一帧,而且还是个CMBuffer,还要手动转码。不过后面证实这个也是错的。猜想4:摄像头参数问题当初看AVCam 写拍照模块的时候,记得摄像头有很多参数,ZXing 也有一个文件位叫做精确解碼,牺牲效率换精确度。于是就在想会不会苹果家的也要设置参数。于是就坏怀这个问题去看文档去了,结果歪打正着的发现了正确原因。 这是记录在苹果的FAQ中的,并没在AVFoundation 的 Reference 中。具体编号为:Technical Note TN2325正确原因就是描述问题里面说到的,demo和工程里面的唯一区别,多了个surfaceLayer。如下图:为了正确解释这个有趣的问题,我们要解释一下条形码扫描原理。上面有提过二维码是通过全局直方图二值化后,按照ISO标准解碼,实际上是,按照1:1:3:1:1去寻找那三个寻像图形,就是标志性的大方块。然后圈出二维码大小再去解碼的。也就是说,再没设定边界的情况下全屏都可以。而条形码完全不同,他是在Detect Center那个点,画一个无限延伸的米字型,然后去判断每一条在线能否解析出条形码所需要的0101010序列。而iOS默认的Center是 Layer 的 Center。我们再回过头来看工程中的 SurfaceLayer,其实他提示给用户的那个框,已经远离了Center。所以我们竖着扫描的时候,那条水平的扫描线是没有贯穿条形码的,所以扫不上他。于是乎要根据设备,iPhone4 iPhone5 通过AVCaptureDeviceFormat和AVCaptureSessionPreset 重新设置一下AVCaptureMetadataOutput rectOfInterest,结果问题就解决了。为什么去掉二维码就没事了呢?还在那篇FAQ中,有那么一个表格。可见,当我们没有二维码的时候,他会有个additional存在。用更加优秀且稍微耗时的算法去优化扫描精准度。总结1.当我们遇到问题的时候,不光要记得看 苹果的 guide 和 reference,还要记得看以下 sample code,tech note, FAQ。2.说不好有意外收获 为什么条形码扫描仪上往往会有一条红线,这并不是为了拟物化,而是告诉用户一定要用这条线对准条形码,否则会有扫不上的可能性。3.正如福尔摩斯所说:抛开所有不可能的,剩下的,不管多么令人匪夷所思,那都是事实。两套代码仅有UI不一样,效果不同,其实就是UI引导用户错误的使用了扫描仪。本类阅读排行
本类推荐阅读
本类好评文章1689人阅读
Passbook实用教程
原文地址:
转载请注明出处
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢!
一、Passbook是什么
Passbook是苹果在IOS6推出的新功能,可以将航空公司的登机牌、电影票礼品卡等各种券整归到一处,有了它,我们出门的时候就不用带上一堆的票据了。去纸质化是未来信息传播的一大发展趋势,所以Passbook的推出可谓很有前瞻性。刚好项目里面用到了,就用心看看,将经验和大家分享。
其实关于Passbook,网上已经有很多不错的教程了,比如raywenderlich上的这两篇:
讲的非常详细,而本文着重介绍有些值得注意的点,或文章中没写的内容。
1、可以设置时间和位置参数
当为Passbook设置了时间和位置参数,指定的时间到了或者用户抵达指定的位置,Passbook可以自动提醒用户有可用的Passbook
已经添加的Passbook,当有更新,比如登机牌上的起飞时间晚点了,Passbook拥有对已添加Passbook的更新机制。其中更新的方式有两种:
自动更新用户手动下拉更新
见下图所示:
3、系统要求
使用 iOS 6 或更高版本的 iPhone 或 iPod touch
4、Passbook可以不依赖app
Passbook可以没有客户端,因为我们手工就可以制作一个Passbook,并且可以添加到Passbook列表中,当然前提是我们要有对应的证书。
5、有三种添加方式
邮件web浏览器客户端
三、类型划分
1、五种类型
目前共支持五种类型,四个具体类型,一个通用类型:
boardingPass(登机牌)coupon(优惠券)storeCard (购物券)eventTicket(活动门票)generic(通用)
对应的样式如下(图片来自):
不同类型的Passbook的外形和界面布局都有所不同:
在外形上:
boardingPass:靠近顶部的位置左右两边各有一个缺口,两个缺口有一条直线连接
coupon:有锯齿状的边框
eventTicket:顶部有一个凹槽
不同风格的Passbook在是否有圆角上也有区别
不同的类型在界面元素布局上也不尽相同
如何生成不同风格的Passbook会在下面的组成文件和文件格式部分详述。
四、内部结构
本节内容来自
Passbook文件的后缀名为.pkpass,其本质上上是一个.zip文件,如果将它重新命名为zip并且解压,就能得到下面的文件:
pass.json&– 关于这个 pass 的信息区域的描述,包括他们的内容, 和元信息,这是一个Passbook的核心部分。
manifest.json&– 这个文件描述了这个 pass 中的文件列表, 和每个文件的 SHA1 校验和。
signature&– manifest.json 一个分离的的 DER 签名, 通过苹果提供的证书生成的。
background.png&– 显示在 pass 正面的图片。
background@2x.png&– 视网膜屏尺寸的显示在 pass 正面的图片。
logo.png&– 在 pass 的头部区域显示的 logo。 苹果推荐的是一个纯色单色的 logo。 图片的尺寸由你决定, 但是高度不能大于 50px 以便适合头部的高度。
logo@2x.png&– 视网膜屏幕的 logo 图片
icon.png&– pass 的一个小图标, 当 pass 作为 email 附件的时候会被用到。 在写这篇教程的时候, 还没有关于这个图片尺寸的文档,但看起来像是
29×29 像素(大尺寸的图标会被缩放,所以他们的显示效果也不错)。
icon@2x.png&– 视网膜版本的图标
strip.png&和&strip@2x.png&–
用作主条目的背景;仅用于优惠劵和购物券
Passbook的主要文件是&pass.json&这个
JSON 文件。 在它里面你声明了这个
Passbook 正面和反面的所有信息; 我们还需要提供需要显示的图片(优惠券仅仅需要指定background.png和它的视网膜版本);最终,还需要一个清单文件manifest.json,它包含了所有这些文件的 SHA1 校验和;另外还的有一个分开的签名文件signature,
签名文件用于验证这个
Passbook 在创建之后没有被修改过。
五、pass.json文件
1、至少包含的字段
作为一个Passbook最核心的部分,它决定显示的内容和位置布局。如下例所示,所有Passbook都必须包含的字段有以下几个:{
&formatVersion& : 1,
&passTypeIdentifier& : &.lashou.passbook&,
&serialNumber& : &gT6zrHkaW&,
&teamIdentifier& : &4SK4K45JGW&,
&organizationName& : &Skyport Airways&,
&description& : &SFO to JFK&,
formatVersion&– 文件格式的版本,需要注意的是,必须用数字,而不是用字符串,否则会无效。
passTypeIdentifier&– 这是 Pass 的标识。 这个和 iOS 中的 bundle identifier 差不多。 稍后会更多的介绍关于这个标识的内容。
serialNumber&– 这个是 pass 的序列号。 你可以用任何方式生成它 – 它可以是数组, 例如 “00193”(注意,它仍然被写成字符串值), 或者是字母和数字的组合,像是你在登机牌上面看到的序列号(例如
“XS83A”)。需要注意的是同一个passTypeIdentifier下面不能包含相同的serialNumber,否则会被认为是统一个Passbook,导致安装时发生覆盖。
teamIdentifier&– 这是苹果分配和每个 iOS 开发者的一个唯一的十个字符的标识。 如果你创建过你自己的 iOS 应用,你应该已经熟悉它了。 你可以登陆到
iOS Member Center 并点击你的组织名来找到你的 team identifier。你可以在 “Company/Organization ID” 标签后面找到它。&
organizationName&– 你的组织名称。
description&– 关于 pass 一个简短的介绍。
2、用于控制显示效果的字段
另外还可以通过下面的键值对调整Passbook的显示效果:&logoText& : &Free Hugs LLC&,
&foregroundColor& : &rgb(255, 255, 255)&,
&backgroundColor& : &rgb(135, 129, 189)&,
&labelColor& : &rgb(45, 54, 129)&
logoText&– 这是显示在 pass 头部并且紧挨着 logo 图片的文本。
foregroundColor&– 文本的颜色。
backgroundColor&– pass 的背景颜色。 Passbook 将会根据背景色的色值来创建一个漂亮的渐变效果, 这样来给 pass 的正面一个良好的视觉外观,
苹果推荐使用鲜艳的颜色。
labelColor&– 根据你的背景颜色,pass 上面的标签将会被渲染为一个和背景色反差比较大的颜色。如果你需要的话, 你可以为这些标签指定你自己的颜色。
下图更形象的展示了上述字段的作用效果:
条形码是Passbook的一大特点,在扫一扫随处可见的今天,增加条形码功能无疑很明智。为Passbook增加条形码的json结构如下:&barcode& : {
&message& : &All you need is love&,
&format& : &PKBarcodeFormatPDF417&,
&messageEncoding& : &iso-8859-1&
message&– 这是条形码包含的数据。 它可以是唯一的编码, 持有者的客户ID, 或者其他任何东西。 在 Free Hug 的例子中, 它仅仅是一个文本消息,用来让持有者得到一个免费的拥抱。
format&– 条形码的格式名称。 用来生成 2D 条形码。
messageEncoding&– 用来解码消息的文本编码名称。 如果你使用非拉丁语言, 你将要用 UTF8 或者其他形式适合你的文本编码(如果你私用标准的英语和数字,
它的默认值是 “iso-8859-1”)。
关于条形码,有两点说明:
①我们只需要将我们在条形码中包含的信息放在message字段中,Passbook会自动为我们生成一张二维码图片,不可谓不神奇。
②目前Passbook条形码只支持三种较新的格式:PKBarcodeFormatQR,PKBarcodeFormatPDF417和PKBarcodeFormatAztec。即上面的format字段可以选取上述三个值中的一个作为自己得编码格式。
4、如何决定不同的Passbook风格
前面讲过Passbook共有五种不同的类型,如何区别实现它们呢?我们需要写这样的一个json结构,以boardingPass类型为例:&boardingPass& : {
&transitType& : &PKTransitTypeAir&,
&headerFields& : [
&label& : &GATE&,
&key& : &gate&,
&value& : &23&,
&changeMessage& : &Gate changed to %@.&
&primaryFields& : [
&key& : &depart&,
&label& : &SAN FRANCISCO&,
&value& : &SFO&
&key& : &arrive&,
&label& : &NEW YORK&,
&value& : &JFK&
&secondaryFields& : [
&key& : &passenger&,
&label& : &PASSENGER&,
&value& : &John Appleseed&
&auxiliaryFields& : [
&key& : &expires&,
&label& : &EXPIRES&,
&value& : &2 weeks&
&key& : &datefdasf&,
&label& : &DATE&,
&key& : &expires&,
&label& : &EXPIRES&,
&value& : &2 weeks&
&key& : &datefdasf&,
&label& : &DATE&,
&backFields& : [
&key& : &terms&,
&label& : &TERMS&,
&value& : &Extension of Validity\nIf after having commenced your journey.&
当然不同类型的Passbook会以对应的不同的key包含headerFields、primaryFields、secondaryFields、auxiliaryFields、backFields等字段。
各个字段对应的位置如下图所示:
顶部抬头(图中区域1,对应headerFields).
顶部条包含了一个容易辨认的 Logo 和一个公司名称。 头部区域用户会在 Passbook 的列表中看到。 它包含了你要给用户提供的最关键的信息, 这样他们就可以辨认出他们需要的 pass 了。
主体区域(图中区域2,对应primaryFields).
这部分包含了 pass 的内容。 每个 pass 在这个区域都有不同的风格, 它通常在 pass 打开时显示最主要的信息。 像是 “打折 20%”, “一杯免费咖啡”, “余额 $120″ 或是其他这类的信息非常有用。
附加信息(图中区域3和4,分别对应auxiliaryFields和secondaryFields).
第三个部分用作附加信息 – 仍然是很重要的资料(例子中的促销的有效性和开始时间), 但绝对不像关于 pass 是什么东西这样的信息那么重要。
条形码(图中区域5,对应barcode).
条形码包含了编码后的信息, 可以通过条形码扫描器很容易的将这些信息转移到其他系统中。在上面的例子中, 条形码包含了一个加密代码。 档被扫描器节解码后, 它会给这个 pass 的所有者一个免费的拥抱(立即发送)。
上面的json文件中有这样的结构:
&key& : &depart&,
&label& : &SAN FRANCISCO&,
&value& : &SFO&
}这些字段的意义如下:
字段的名称,不会显示到界面中,而且我试过key重复也没问题。
label&– 字段的副区域文本,会显示在主文本区域的上边。
value&– 字段的主区域文本,会显示在副区域文本的下面。
至此,Passbook包含的全部文件都讲完了。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:133973次
积分:1856
积分:1856
排名:第9172名
原创:44篇
评论:50条
曾就职于高阳科技、拉手网,目前工作在高德地图;专注于IOS应用开发,业余时间学习Java和Android。
个人博客:
新浪微博:
我的“IOS开发教程”微信公共账号:
欢迎大家关注!
(1)(2)(1)(4)(1)(3)(6)(2)(3)(6)(3)(1)(2)(9)(3)酷讯网提供的其它机票、酒店、火车票和度假信息
酷讯机票搜索为您提供实时数据,汇集了各大国内航空公司的报价。预定机票享受100%保障,支付成功后即出票。为方便您的预定,请使用、、
国航特价机票
您好!欢迎来到
您在国航网找最实惠的,而且找到更多的国航相关信息,国航官网为您提供最新机票优惠信息以及公司联系方式,如果您想节约旅途费用快速找到您想要的国航特价机票信息点击这里快速查找您需要的国航机票。您还可以通过国航推荐的其他航空公司找到最便宜的机票。支付宝在近期公测的新版客户端引起了外界的关注,其全新的界面与功能设计让多数人眼前一亮。由于采取了类“钱包”式的卡槽设计,以及卡券管理功能,也让很多评论者将其与苹果的 Passbook 相提并论.
发表于 16:06:19
倘若用户需要将纸质的卡片存入手机,那么他们只需通过设备自带的摄像头进行扫描,然后创建一个数字钱包保存起来。当消费者去商店购物时不必携带实体的购物卡,因为收银员可以直接扫描设备屏幕上的条形码进行结账。
发表于 21:30:04
三年前,我换上了iPhone智能手机,跟所有女孩子一样,我对iPhone爱不释手。我并不经常更新系统,但是却喜欢尝试新的应用程序,希望这些程序能让我的生活更简单。然而,升级苹果的iOS6却让我懊恼不已。
发表于 16:30:50
iOS 6发布后,备受瞩目的Passbook也一并上线。作为“集中管理所有凭证的最简便的方式”,目前已有不少知名公司的App宣布支持Passbook。
发表于 15:38:14
当我们在手机上下载了众多票据的应用,又在每一个应用中生成更多票据的时候,我们非常期待能有一个应用能够更加便捷的管理这些票据,Passbook的魅力也就在这里。
发表于 11:02:41
热门文章推荐}

我要回帖

更多关于 passbook 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信