国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS wallet開發

2019-11-09 14:41:32
字體:
來源:轉載
供稿:網友

wallet的前身為passbook,2015年WWDC大會蘋果正式改名wallet,passbook是蘋果2012年iOS6開放出來的新功能.可以幫助用戶管理五種類型(Boarding passes(登機牌),Coupons(優惠券),Store cards(購物卡),Event tickets(入場券),Generic(通用卡))的票據。

既然一個票據就是一個Pass,那么什么是Pass呢?在iOS中一個Pass其實就是一個.pkpass文件,事實上它是一個Zip壓縮包,只是這個壓縮包要按照一定的目錄結構來設計,下面是一個Pass包的目錄結構(注意不同的票據類型會適當刪減):

Pass Package

├── icon.png

├── icon@2x.png

├── logo.png

├── logo@2x.png

├── thumbnail.png

├── thumbnail@2x.png

├── background.png

├── background@2x.png

├── strip.png

├── strip@2x.png

├── manifest.json

├── fr.lPRoj

│ └── pass.strings

├── de.lproj

│ └── pass.strings

├── pass.json

└── signature

也就是說在Passbook應用中顯示的內容其實就是一個按照上面文件列表來組織的一個壓縮包。在.pkpass文件中除了圖標icon、縮略圖thumbnail和logo外最重要的就是pass.json、manifest.json和signature。

1.pass.json

這個文件描述了Pass的布局、顏色設置、文本描述信息等,也就是說具體Pass包如何展示其實就是通過這個JSON文件來配置的,關于pass.json的具體配置項在此不再一一介紹,這里主要說一下其中關鍵的幾個配置項:

passTypeIdentifier:pass唯一標識,這個值類似于App ID,需要從開發者中心創建,并且這個標識必須以“pass”開頭(例如下面的示例中取名為“pass.com.taokatao.mywallet”)。

teamIdentifier:團隊標識,申請蘋果開發者賬號時會分配一個唯一的團隊標識(可以在蘋果開發者中心–查看賬戶信息中查看”Team ID“)。

barcode:二維碼信息配置,主要指定二維碼內容、類型、編碼格式。

locations:地理位置信息,可以配置相關位置的文本信息。

2.manifest.json

manifest.json從名稱可以看出這個文件主要用來描述當前Pass包中的文件目錄組織結構。這個文件記錄了除“manifest.json”、“signature”外的文件和對應的sha1哈希值(注意:哈希值可以通過”openssl sha1 [ 文件路徑]“命令獲得)。

3.signature

signature是一個簽名文件。雖然manifest.json存儲了哈希值,但是大家都知道hash算法是公開的,如何保證一個pass包是合法的,未經修改的呢?那就是使用一個簽名文件來驗證。

了解了以上內容后基本上對于如何定義一個pass包有了簡單的概念。有了pass包之后對于添加pass到passbook應用是比較簡單的。但事實上通常大家看到的passbook應用中添加的pass包并不是手動組織的,而是通過程序來完成pass包制作的。舉例來說:如果你在美團上購買一張電影票之后,會告訴你一個優惠碼,這個優惠碼會顯示到pass中。由于這個優惠碼是動態生成的,所以直接手動制作出一個pass包是不現實的。通常情況下pass包的生成都是通過后臺服務器動態生成,然后返回給iOS客戶端來讀取和添加的,手動制作pass包的情況是比較少的,除非你的票據信息是一成不變的。當然為了演示Passbook應用,這里還是會以手動方式演示一個pass包的生成過程,了解了這個過程之后相信在服務器端通過一些后臺程序生成一個pass包也不在話下(下面的生成過程均可通過服務器端編程來實現)。 1.在蘋果開發者中心新建Pass Type ID(例如這里新建一個“pass.com.taokatao.mywallet”),并且基于這個Pass Type ID創建一個Passbook證書(在mac上找到鑰匙串,選擇”從證書頒發機構請求證書“,生成一個證書請求文件;將此文件上傳到對應的Pass Type ID下生成證書文件)如下圖:這里寫圖片描述 這里寫圖片描述 這里寫圖片描述 這里寫圖片描述 下載證書后,將此證書導入Mac中(此處配置的Pass Type ID對應pass.json中的”passTypeIdentitifier“,此證書用于生成簽名文件signature。)。

2.在Xcode中-Targets-Capabilities啟用Pasbook服務,這里需要注意的是”Allow all team pass types“選項,如果勾選了這一項,那么pass.json中的passTypeIdentifier和teamIdentifier就可以是任何團隊創建的任何Pass項目了. 這里寫圖片描述 有了上面的準備工作,下面看一下如何制作一個Pass:

根據所選擇的Passbook類型準備圖片素材,由于這里以一個Store Card舉例,所以需要準備icon、logo和strip三類圖片。 配置pass.json,這里還是強調一下passTypeIdentifier和teamIdentifier,前者就是上面在開發者中心創建的Pass Type ID(”pass.com.taokatao.mywallet“),后者是對應的團隊標識,申請蘋果開發者賬號時會分配一個唯一的團隊標識(可以在蘋果開發者中心–查看賬戶信息中查看”Team ID“)。,其他信息根據實際情況配置。

{ "formatVersion":1, "passTypeIdentifier":"pass.com.taokatao.cardmee.wallet", "serialNumber":"54afe978584e3", "teamIdentifier":"44X96MHP4C", "authenticationToken":"bc83dde3304d766d5b1aea631827f84c", "barcode":{ "message":"userName CangyuZheng", "altText":"會員詳情見背面", "format":"PKBarcodeFormatQR", "messageEncoding":"iso-8859-1" }, "locations":[ { "longitude":-122.3748889, "latitude":37.6189722 }, { "longitude":-122.03118, "latitude":37.33182 } ], "organizationName":"CardMee", "logoText":"CardMee", "description":"", "foregroundColor":"rgb(2,2,4)", "backgroundColor":"rgb(244,244,254)", "storeCard": { "headerFields": [ { "key":"date", "label":"余額", "value":"¥888.66" } ], "secondaryFields": [ { "key":"more", "label":"VIP會員", "value":"Cangyu Zheng" } ], "backFields": [ { "key":"records", "label":"消費記錄(最近10次)", "value":" 9/23 ¥107.00 無糖冰美式/n 9/21 ¥58.00 黑魔卡/n 8/25 ¥44.00 魔卡/n 8/23 ¥107.00 無糖冰美式/n 8/18 ¥107.00 無糖冰美式/n 7/29 ¥58.00 黑魔卡/n 7/26 ¥44.00 魔卡/n 7/13 ¥58.00 黑魔卡/n 7/11 ¥44.00 魔卡/n 6/20 ¥44.00 魔卡/n" }, { "key":"phone", "label":"聯系方式", "value":"4008-888-88" }, { "key":"terms", "label":"會員規則", "value":"(1)本電子票涉及多個環節,均為人工操作,用戶下單后,1-2個工作日內下發,電子票并不一定能立即收到,建議千品用戶提前1天購買,如急需使用,請謹慎下單; /n(2)此劵為電子劵,屬特殊產品,一經購買不支持退款(敬請諒解); /n(3)特別注意:下單時請將您需要接收電子票的手機號碼,填入收件人信息,如號碼填寫錯誤,損失自負;購買成功后,商家于周一至周五每天中午11點和下午17點發2維碼/短信到您手機(周六至周日當天晚上發1次),請用戶提前購買,憑此信息前往影院前臺兌換即可; /n(4)訂購成功后,(您在購買下單后的當天,給您發送電子券,系統會自動識別;如果您的手機能接收二維碼,那收到的就是彩信,不能接收二維碼的話,系統將會自動轉成短信發送給您),短信為16位數,如:1028**********; 每個手機號碼只可購買6張,如需購買6張以上的請在訂單附言填寫不同的手機號碼,并注明張數(例如團購10張,1350755****號碼4張,1860755****號碼6張);/n(5)電子票有效期至2016年2月30日,不與其他優惠券同時使用" }, { "key":"support", "label":"技術支持", "value":"http://s.cardmee.net/camee/" } ] }, "labelColor":"rgb(87,88,93)"}

3.根據pass所需文件創建manifest.json文件,可以通過”openssl sha1 [文件路徑]“分別計算出所有文件的哈希值:(ps:如果出現錯誤檢查是否已cd到目標文件夾)

{ "pass.json":"a3b26ec57dc825aaefb18fa8d11b9fbcad71007d", "icon@2x.png":"6275cbf423464807a8dd408d1645f9161a54d0b8", "icon.png":"4c0c490beea829c6e2d17fa3ff579c623cd199cc", "logo@2x.png":"6275cbf423464807a8dd408d1645f9161a54d0b8", "logo.png":"4c0c490beea829c6e2d17fa3ff579c623cd199cc", "strip@2x.png":"6275cbf423464807a8dd408d1645f9161a54d0b8", "strip.png":"4c0c490beea829c6e2d17fa3ff579c623cd199cc"}

接下來下來準備生成signature文件: a.通過前面導入的Pass Type證書(Pass Type ID:pass.com.taokatao.mywallet)導出個人信息交換(.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(這里設置密碼為123123)

openssl pkcs12 -in mywallet.p12 -nocerts -out mywalletkey.pem -passin pass:123123 -passout pass:123123

e.根據AWDRCA.pem、mywallet.pem、mywalletkey.pem、manifest.json生成signature文件(按照提示輸入mywalletkey.pem導出時設置的密碼123123):

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“)。

zip -r mywallet.pkpass manifest.json pass.json signature logo.png logo@2x.png icon.png icon@2x.png strip.png strip@2x.png

到這里一個pass制作完成了,此處可以在mac中打開預覽: 這里寫圖片描述 如果出現以下錯誤: 這里寫圖片描述 請檢查 1.teamID是否已經更改為你對應的開發者賬號 2.pass.json/manifest.json格式是否正確,全選復制粘貼到json在線編輯中檢驗這里寫圖片描述 3.passTypeIdentifier是否為你開發者賬號下新建的。

到這里一個Pass就只做完成了,下面就看一下在iOS中如何添加這個Pass到Wallet,這里直接將上面制作完成的Pass放到Bundle中完成添加。當然這些都是一步步手動完成的,前面也說了實際開發中這個Pass是服務器端來動態生成的,在添加時會從服務器端下載,這個過程在示例中就不再演示。iOS中提供了PassKit.framework框架來進行Wallet開發,下面的代碼演示了添加Pass到Wallet應用的過程:

#import "ViewController.h"#import <PassKit/PassKit.h>@interface ViewController ()<PKAddPassesViewControllerDelegate>@property (strong,nonatomic) PKPass *pass;//票據@property (strong,nonatomic) PKAddPassesViewController *addPassesController;//票據添加控制器@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; //如果懶得新建界面可放開下面一行 //[self addPass];}#pragma mark - UI事件- (IBAction)addPassClick:(UIBarButtonItem *)sender { //確保pass合法,否則無法添加 [self addPass];}#pragma mark - 屬性/** * 創建Pass對象 * * @return Pass對象 */-(PKPass *)pass{ if (!_pass) { NSString *passPath=[[NSBundle mainBundle] pathForResource:@"mypassbook.pkpass" ofType:nil]; NSData *passData=[NSData dataWithContentsOfFile:passPath]; NSError *error=nil; _pass=[[PKPass alloc]initWithData:passData error:&error]; if (error) { NSLog(@"創建Pass過程中發生錯誤,錯誤信息:%@",error.localizedDescription); return nil; } } return _pass;}/** * 創建添加Pass的控制器 * * @return <#return value description#> */-(PKAddPassesViewController *)addPassesController{ if (!_addPassesController) { _addPassesController=[[PKAddPassesViewController alloc]initWithPass:self.pass]; _addPassesController.delegate=self;//設置代理 } return _addPassesController;}#pragma mark - 私有方法-(void)addPass{ if (![PKAddPassesViewController canAddPasses]) { NSLog(@"無法添加Pass."); return; } [self presentViewController:self.addPassesController animated:YES completion:nil];}#pragma mark - PKAddPassesViewController代理方法-(void)addPassesViewControllerDidFinish:(PKAddPassesViewController *)controller{ NSLog(@"添加成功."); [self.addPassesController dismissViewControllerAnimated:YES completion:nil]; //添加成功后轉到Passbook應用并展示添加的Pass NSLog(@"%@",self.pass.passURL); [[UIapplication sharedApplication] openURL:self.pass.passURL];}@end

OK,大功告成。感謝萬能的資料君。如有不足敬請指教,請私信我


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雷山县| 宜宾县| 沁源县| 漳平市| 江都市| 客服| 商水县| 克拉玛依市| 井研县| 铜陵市| 包头市| 来安县| 伊川县| 盐源县| 库车县| 紫阳县| 广南县| 双流县| 清丰县| 汪清县| 科技| 岑巩县| 安龙县| 义乌市| 合水县| 柘城县| 东乡县| 凌云县| 通海县| 尼木县| 北京市| 萨迦县| 郴州市| 团风县| 比如县| 寿阳县| 育儿| 溧阳市| 万源市| 清原| 永定县|