2015-02-26
Passbook 是 iOS 6 引入的一种简化电子票卷的东西,但其实在感觉在中国一直没有推广好,当然 你可以拿来做特殊的用途 比如你的名片 哈哈!你可以按照下面的教程 完成属于自己的 Passbook 名片.这样 别人要你的名片的时候只要让他打开 Passbook 扫一扫就好啦.当然 如果你问我这和微信有什么区别的话 我只能说 逼格高(微信太 low 啦),人活着就是为了逼格! 好了,让我们先看看制作的效果图 然后 根据下面的教程一步一步走 你也可以制作自己的 Passbook 名片了
首先,我们对 Passbook 开发做一个大致的了解,Passbook 可以不需要任何的 App 接入,换句话说 你可以不写一行代码,就能利用 Passbook 制作自己的文件,但是 你需要一个开发者账号。Passbook 识别一个 .pkpass 后缀的文件,而 .pkpass 本质就是一个 zip 文件,文件包含了以下内容(不同的 pkpass 可能包含的东西不一样):
{ "formatVersion": 1, "passTypeIdentifier": "pass.me.qiufeng.mypassbookcard", "serialNumber": "00003", "teamIdentifier": "xxxxxx", "organizationName": "qiufeng", "description": "I'm QiuFeng", "logoText": "We Simplify, But We Perfect", "backgroundColor" : "rgb(0, 0, 0)", "foregroundColor" : "rgb(255, 255, 255)", "barcode": { "message": "I'm qiufeng", "format": "PKBarcodeFormatPDF417", "messageEncoding": "utf-8", "altText": "SCAN TO ADD" }, "generic": { "primaryFields": [ { "key": "name", "label": "NAME", "value": "Feng Qiu" } ], "secondaryFields": [ { "key": "JOB", "label": "JOB", "value": "iOS Engineer", "textAlignment": "PKTextAlignmentLeft" } ], "auxiliaryFields": [ { "key": "", "label": "", "value": "Design. Code. Build. Innovate", "textAlignment": "PKTextAlignmentCenter" } ], "backFields": [ { "label": "PHONE", "key": "PHONE", "value": "+86 188-1736-7675" }, { "key": "WECHAT", "label": "WECHAT", "value": "qfviolethill" }, { "key": "EMAIL", "label": "EMAIL", "value": "mailqiufeng@iCloud.com" }, { "label": "WEBSITE", "key": "WEBSITE", "value": "http://www.qiufeng.me/" }, { "label" : "", "key" : "message", "value" : "We are what we repeatedly do. Excellence, then, is not an act, but a habit." } ] } }
这里有几个地方 你会和我的不一样 一个是 passTypeIdentifier 一个是 teamIdentifier
我们逐一介绍每个字段的作用:
{ "icon@2x.png": "b793b73c7921be3448f8df77fbca7843c8d6d68e", "thumbnail@2x.png": "b793b73c7921be3448f8df77fbca7843c8d6d68e", "pass.json": "74974e196dbcbb8bd566542cc5ad01e1cff814ca" }这里需要注意的是 后面一大串加密的东西 你和我的都不一样,这里采用的是 SHA1 算法(不要担心,不需要你对这种算法有任何的了解),打开 终端,然后 cd 到文件目录下面, 依次输入如下命令
openssl sha1 pass.json命令行的输出看起来是这样(实际的校验和可能会不同): SHA1(pass.json)= 74974e196dbcbb8bd566542cc5ad01e1cff814ca 然后把 74974e196dbcbb8bd566542cc5ad01e1cff814ca 复制到 pass.json 对应的值中。 同样的方法 对 icon@2x.png 和 thubnail@2x.png也进行加密,需要注意的地方:如果你对 pass.json 做出了修改,那么对应的加密就会变了,你就需要重新生成那个 pass.json 对应的值,比如 我在 pass.json 的最后多敲了一个回车或者空格,那么我就需要重新输入 openssl sha1 pass.json,得到新的加密 然后把新的加密放到 manifest.json 里面。
接下来 我们需要制作苹果的证书了
还记得刚刚查看 teamIdentifier 对应那个字段的证书吗?我们需要再次利用他了, 现在你将会把这个证书和秘钥导出成 PEM 格式, 这样你可以把它们用于 OpenSSL。
打开钥匙串访问, 在左边的菜单中选择证书(在类型下面),再次找到刚刚的那个 “Pass Type ID: pass.me.qiufeng.mypassbookcard” 的证书。(也就是重新找到那个证书)
右键点击这个证书, 在弹出菜单中选择导出 “Pass Type ID: pass.me.qiufeng.mypassbookcard”,将导出的文件保存成 “Certificates.p12” 到你的工作目录中。将会有一个弹出框,让你输入一个密码:
为了让这个过程更简单一点, 直接点击 OK – 这个证书将会导出为不带密码保护的。
openssl pkcs12 -in Certificates.p12 -clcerts -nokeys -out passcertificate.pem -passin pass:这将仅将 pass 证书导出为 PEM 格式,并在同一个目录中把它保存成 “passcertificate.pem”。(如果这个操作成功的话, OpenSSL 将会输出 “MAC verified OK” 消息。)
openssl pkcs12 -in Certificates.p12 -nocerts -out passkey.pem -passin pass: -passout pass:12345注意到这次, 你需要提供一个密码来导出这个私钥文件。 在这个例子中, 仅使用 “12345″ – 在生产环境中, 应当使用一个强密码 – 不能是 “password1” 或者 “passw00t” 这种东西。
openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem -inkey passkey.pem -in manifest.json -out signature -outform DER -passin pass:12345仔细看一看上面的命令行 – 非常容易理解所有的参数。 signer 参数是你的 pass 证书的文件名; inkey 是用于对 manifest.json 签名的私钥文件; in 是输入文件的文件名; out 是输出文件的文件名;outform 是输出的格式(你需要用 “DER“ 来创建一个分离的签名); 最后, passin 是私钥的密码。
zip -r qifueng.pkpass manifest.json pass.json signature thumbnail\@2x.png icon\@2x.png通过使用 shell 命令 “zip”, 你创建一个叫做 qiufeng.pkpass 的 ZIP 文件, 并且这个档案包中包含了后面列表中的所有文件。
"formatVersion": 1,这一行,少了最后面那个逗号 变成
"formatVersion": 1这时候 通过 这个console 我们可以找到这么一行log
iPhone sharingd[55] <Warning>: Invalid data error reading pass /var/mobile/Library/Caches/com.apple.sharingd/com.apple.Passbook/96050960-3BE4-41AE-A306-C328B4B81248.pkpass/pass.json. Invalid json from URL file:///var/mobile/Library/Caches/com.apple.sharingd/com.apple.Passbook/96050960-3BE4-41AE-A306-C328B4B81248.pkpass/pass.json: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Badly formed object around character 29.) UserInfo=0x13f02fa70 {NSDebugDescription=Badly formed object around character 29.}