這個是老的方式,最新的方式 iOS Wallet 開發,省去了一大堆的簽名工作。
在手機內的 ** Wallet ** app 能夠收集各種卡券,在開始創建pkpass文件之前可以先看一下:
- 蘋果的官方文檔:Wallet Developer Guide 里面介紹了怎樣使用Wallet,而且還有一些模版文件
- Raywenderlich: Passbook Tutorial 教程,里面一步一步的介紹了怎樣生成一個pkpass 文件
** pkpass 的文件內主要包含:**
pass.json,
manifest.json,
signature
還有各種png 圖片
** 卡券分為五種:**
?Coupon
?Boarding pass
?Store card
?Event ticket
?Generic
1. 準備
- 下載 wallet 內的 Example Passes and Sample Code 里面有一個 ** SamplePasses ** 文件夾, 里面有目前所需的各種文件包括 pass.json 和 icon.png, logo.png 等 比如在 ** Coupon.pass ** 文件夾內就包含:
icon.png
icon@2x.png
logo.png
logo@2x.png
pass.json
點擊 ** Coupon.pkpass ** 可看到一張這樣的卡券
-
創建 ** Pass Type ID ** , 蘋果文檔里有介紹,一步步按照文檔來,最終會創建一個類似于如圖的 ** Pass Type ID ** ,
把該 ** Pass Type ID ** 下載,然后雙擊,它會導入到 keychain 里
2. 創建pass.json (這里以蘋果的下載資源為例)
新建一個文件夾,命名為 pastest.pass (也可以隨便),把它放在你好找的地方。在Xcode 創建一個空白的empty 文件,
命名為 pass.json
記得把pass.json文件移動到創建的pastest.pass文件夾內。在剛剛創建的 pass.json 內直接把蘋果的 coupon 內的pass.json 的內容拷貝替換進來
{
"formatVersion" : 1,
"passTypeIdentifier" : "pass.com.apple.devpubs.example",
"serialNumber" : "E5982H-I2",
"teamIdentifier" : "A93A5CM278",
"webServiceURL" : "https://example.com/passes/",
"authenticationToken" : "vxwxd7J8AlNNFPS8k0a0FfUFtq0ewzFdc",
"barcode" : {
"message" : "123456789",
"format" : "PKBarcodeFormatPDF417",
"messageEncoding" : "iso-8859-1"
},
"locations" : [
{
"longitude" : -122.3748889,
"latitude" : 37.6189722
},
{
"longitude" : -122.03118,
"latitude" : 37.33182
}
],
"organizationName" : "Paw Planet",
"description" : "Paw Planet Coupon",
"logoText" : "Paw Planet",
"foregroundColor" : "rgb(255, 255, 255)",
"backgroundColor" : "rgb(206, 140, 53)",
"coupon" : {
"primaryFields" : [
{
"key" : "offer",
"label" : "Any premium dog food",
"value" : "20% off"
}
],
"auxiliaryFields" : [
{
"key" : "expires",
"label" : "EXPIRES",
"value" : "2013-04-24T10:00-05:00",
"isRelative" : true,
"dateStyle" : "PKDateStyleShort"
}
]
}
}
里面的內容就是一大串的 key: value 了,在例子中,目前只需要替換 passTypeIdentifier 和 teamIdentifier,比如我剛剛生成的 passTypeIdentifier 為 ** pass.come.deng.wulala ** 替換成這樣
"passTypeIdentifier" : "pass.come.deng.wulala",
就好了
** teamIdentifier ** 同理,到自己開發者賬號內拷貝過來替換就好了,比如:
"teamIdentifier" : "X5NZ3Y8346",
到此 pass.json 文件就算OK了
3. 創建 manifest.json
同樣的,用Xcode 創建一個empty 文件, 命名為 manifest.json ,由于例子是一個 coupon 的 pkpass 文件, 所以只需要
icon.png
icon@2x.png
logo.png
logo@2x.png
pass.json
manifest.json 內的內容格式:
{
"icon.png":"ba47a8021c8d74d2146d7244c8a0566be37df43b",
"icon@2x.png":"bd5442b4b08aa4dde333ec9ef0269e7fd93140b3",
"logo.png":"780540b3a324bf66aeaee2d352283371356e9502",
"logo@2x.png":"a718ffd4e611e404dd3eb701454bcaefdabbe311",
"pass.json":"98dc0ced131d6a62311fc16a84ec29dec4fc52b6"
}
在里面 "icon.png":"ba47a8021c8d74d2146d7244c8a0566be37df43b",
** ba47a8021c8d74d2146d7244c8a0566be37df43b ** 為 icon.png 的 SHA1 生成值
生成 icon.png logo.png pass.json 的 SHA1 方式為 打開命令行 cd 到你存放文件的文件夾 pastest.pass 內然后 對于 icon.png 圖片在當前目錄的命令行內 輸入
openssl sha1 icon.png
把輸出的值在manifest 內 替換為你自己圖片的值 以此類推,直到把所以的圖片都OK,然后pass.json 文件也一樣
openssl sha1 pass.json
然后值替換,這樣manifest.pass 文件也OK了. **(注意生成 pass.json 的 SHA1 后就不要更改 pass.json內的內容了,否則 pass.json 的 SHA1 需要重新生成 ) **
4. 簽名加密
至此,兩個重要的 json 文件就OK了,接下來是一大堆的簽名工作了。
- ** 導出 Pass Type ID 證書**
首先在keychain 找到你剛剛生成的 Pass Type ID,
右鍵,點擊 ** 導出"xxxxxxxx", 在彈出窗口輸入: Certificates.p12 **
點擊 ** 存儲 ** 在提示輸入密碼的時候
- ** 生成 passcertificate.pem **
cd 到 pastest.pass 文件夾, 然后在命令行輸入:
openssl pkcs12 -inCertificates.p12 -clcerts -nokeys -outpasscertificate.pem -passin pass:
它會在文件夾 pastest.pass 內生成一個 passcertificate.pem。
- ** 生成 pastest.pass **
繼續在文件夾 pastest.pass 命令行目錄內輸入:
openssl pkcs12 -inCertificates.p12 -nocerts -outpasskey.pem -passin pass: -passout pass:12345
它會在文件夾 pastest.pass 內生成一個 passkey.pem
- ** 導出 Apple Worldwide Developer Relations Certification Authority 證書 **
在 keychain 內 找到蘋果的證書 Apple Worldwide Developer Relations Certification Authority, 如果找不到就到開發者賬號下一個。
和生成 證書 Certificates.p12 一樣,** 右鍵 ** -> ** 導出 Apple Worldwide Developer Relations Certification Authority **
在彈出窗口中命名為:** WWDR.pem **
記得 ** 文件格式** 選為 ** 增強保密郵件(.pem)** , 點擊 ** 存儲 ** 把生成的 WWDR.pem 存放在文件夾 pastest.pass 內,
- ** 生成pkpass**
在文件夾 pastest.pass 命令行目錄內輸入:
openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem -inkey passkey.pem -inmanifest.json -outsignature -outform DER -passin pass:12345
成功以后看輸入內容可知會生成一個** signature ** 文件,待會生成 pkpass 的時候會需要。繼續輸入:
zip -r freehugcoupon.pkpass manifest.json pass.json signature logo.pnglogo@2x.png icon.pngicon@2x.png
至此一個命名為 ** freehugcoupon.pkpass ** .pkpass文件就生成了,當然名字可以自定義
5. .pkpass 成功
在文件夾內點擊剛剛生成的 ** freehugcoupon.pkpass ** 會看到結果為
哈哈大功告成
** 你可查看本文生成的. pkpass 所有文件 和 使用下載的蘋果 passes 資源 在Xcode Project 中的 代碼示例 **
( 1: 如果點擊 freehugcoupon.pkpass 無結果不能打開,表明有的步驟錯了,看看是哪一步有問題; 2: 如果用的是Raywenderlich 的 pass.json 文件可能會有錯誤,我試了幾次都打不開,文件簽名之類的也都OK,后來直接用蘋果的coupon 內的 pass.json 才行的)