iOS 添加 .pkpass 到 Wallet, 與測試代碼

這個是老的方式,最新的方式 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 了,在例子中,目前只需要替換 passTypeIdentifierteamIdentifier,比如我剛剛生成的 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 **

點擊 ** 存儲 ** 在提示輸入密碼的時候

直接點擊 ** 好 ,不輸入密碼。記得把證書 ** Certificates.p12 存放在文件夾 pastest.pass 內。

  • ** 生成 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 才行的)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,807評論 18 139
  • Getting Started Introducing Wallet 以前 Wallet 叫 Passbook ,...
    阿朱先生閱讀 3,855評論 4 7
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,692評論 25 708
  • 突然想起同性戀的話題,其實也不算是很突然,只是有些難堪。 從2000年,同性戀在中國不再被認為是精神疾病。隨著時...
    我是阿洛啊閱讀 724評論 1 2
  • 前段時間,一則新聞報道了一個二胎剛生不久的媽媽打死自己孩子的事件。據這位媽媽說,她哄老二睡覺,老大吵鬧,說...
    秋與冬的田園閱讀 585評論 0 1