Windows Phone 8中加入了錢包Wallet這個功能,這個功能很是的有意思,開發者能夠經過Wallet提供的API建立獲取Wallet中的商品。統一管理用戶的收集優惠券、信用卡、成員資格、會員卡和一些自定義的信息。甚至能夠將本身開發的應用集成到系統的Wallet中,不只方便了用戶的管理,還可讓用戶直接從Wallet中獲得關聯的應用。這個關聯的功能很是適合一些筆記類、旅行類、金融管理類的應用,好比,印象筆記、有道筆記、挖寶和攜程、藝龍。網絡
在使用Wallet的API以前,你必需要開啓應用的Wallet能力,在WMAppManifest.xml中勾選ID_CAP_WALLET,以下圖。app
Deals是一種經常使用的Wallet類型,你能夠理解爲是一個優惠劵的集合,你能夠在你的應用內建立優惠劵信息並將其添加到系統的Wallet中,並提供了更新、刪除的功能。async
var deal = new Deal(guid); deal.MerchantName = "Contoso"; deal.MerchantAddress.Business1.Street = "boulevard Roi Albert II"; deal.MerchantAddress.Business1.PostalCode = "1030"; deal.MerchantAddress.Business1.City = "Schaerbeek"; deal.MerchantAddress.Business1.CountryRegion = "Belgium"; deal.OfferWebsite = new Uri("http://www.contoso.com"); deal.IssuerName = "Contoso"; deal.StartDate = DateTime.Now.Date.AddDays(1); deal.ExpirationDate = deal.StartDate.Value.AddMonths(2); var barcode = new BitmapImage(); barcode.SetSource(Application.GetResourceStream(new Uri("Assets/barcode.bmp", UriKind.Relative)).Stream); deal.BarcodeImage = barcode; var logo99 = new BitmapImage(); logo99.SetSource(Application.GetResourceStream(new Uri("Assets/DealIcon99.png", UriKind.Relative)).Stream); deal.Logo99x99 = logo99; var logo159 = new BitmapImage(); logo159.SetSource(Application.GetResourceStream(new Uri("Assets/DealIcon159.png", UriKind.Relative)).Stream); deal.Logo159x159 = logo159; var logo336 = new BitmapImage(); logo336.SetSource(Application.GetResourceStream(new Uri("Assets/DealIcon336.png", UriKind.Relative)).Stream); deal.Logo336x336 = logo336; deal.CustomProperties.Add("Perso", new CustomWalletProperty("Custom field", "This is a custom message.")); await deal.SaveAsync();
上面咱們就建立了一個deal並經過SaveAsync方法將其保存到了Wallet中。deal的Logo有三種格式,分別對應不一樣分辨率的手機。CustomProperties是一個字典類,來保存自定義的信息。ide
var walletItems = await Wallet.GetItemsAsync(); var item = walletItems.FirstOrDefault(s => s.Id == guid); if(item != null) { Wallet.Remove(item); }
GetItemsAsync方法返回的是一個WallteItemCollection的集合,這個集合是包括咱們應用內建立愛你的WalletItem,不包括其餘入口建立的WalletItem,因此你只能對本身應用內建立的Item作修改。你可使用Linq來獲取單個的元素,使用Wallet的Remove方法從Wallet中刪除deal。網站
Wallet也能夠用來支付,經過OnlinePaymentInstrument,PaymentInstrument,WalletTransactionItem能夠實現不一樣需求,下面咱們主要講的仍是最後一種WalletItem,前兩種須要你的開發者帳號到MarketPlace註冊。下面咱們來建立一個會員卡的WalletItem。ui
var membership = new WalletTransactionItem("ContosoRewards"); var logo99 = new BitmapImage(); logo99.SetSource(Application.GetResourceStream(new Uri("Assets/Icon99.png", UriKind.Relative)).Stream); membership.Logo99x99 = logo99; var logo159 = new BitmapImage(); logo159.SetSource(Application.GetResourceStream(new Uri("Assets/Icon159.png", UriKind.Relative)).Stream); membership.Logo159x159 = logo159; var logo336 = new BitmapImage(); logo336.SetSource(Application.GetResourceStream(new Uri("Assets/Icon336.png", UriKind.Relative)).Stream); membership.Logo336x336 = logo336; membership.DisplayName = "Contoso Shop";
var task = new AddWalletItemTask {Item = Membership}; task.Completed += taskCompleted; task.Show(); private void taskCompleted(object sender, AddWalletItemResult e) { if (e.TaskResult == TaskResult.OK) { MessageBox.Show("Membership created"); } else { MessageBox.Show("Membership not created !"); } }
WalletTransactionItem須要經過AddWalletItemTask添加到Wallet中,這時咱們在Wallet中就能夠看到咱們剛剛建立的會員卡了。一般咱們還要特別記錄會員卡的使用狀況,這個記錄也能夠記錄在Wallet中,經過WalletTransactionItem的TransactionHistory
屬性向Wallet中添加使用記錄。spa
Membership.TransactionHistory.Add(Guid.NewGuid().ToString(), new WalletTransaction { Description = "超市消費", DisplayAmount = "-100", IsTransactionTimeValid = true, TransactionDate = DateTime.Now });
上面的例子都是咱們在本身建立的App內操做Wallet中的數據,試想若是咱們在網站上貼出了一個優惠劵,經過本身的App將這個優惠劵添加到了Wallet中,若是這個優惠劵過時了咱們可否在不打開原應用的狀況下直接在Wallet中刷新優惠劵呢?答案是能夠的,這就須要咱們在應用內添加一個WalletAgent,若是以前沒有使用過BackgroundAgent,那麼最好先自行Google一下BackgroundAgent的原理。
代理
protected override async void OnRefreshData(Microsoft.Phone.Wallet.RefreshDataEventArgs args) { foreach (var walletItem in args.Items) { var transactionitem = walletItem as WalletTransactionItem; if (transactionitem == null) continue; int balance; if (int.TryParse(transactionitem.DisplayBalance.Split(' ')[0], out balance)) { balance = balance + 10; transactionitem.DisplayBalance = balance + " points"; transactionitem.TransactionHistory.Add(Guid.NewGuid().ToString(), new WalletTransaction { Description = "Agent operation", DisplayAmount = "+ 10", IsTransactionTimeValid = true, }); await transactionitem.SaveAsync(); } else { // Error, do something } } base.OnRefreshData(args); }
繼承自WalletAgent的代理類只須要重寫OnRefreshData就能夠對Wallet中的優惠劵作出相應的操做,args.Items表明能夠更新的優惠劵的項。用戶經過點擊相應優惠劵下的刷新按鈕處罰OnRefreshData事件,咱們能夠經過一個WebService獲取網絡上有關優惠劵最新的信息,而後更新Wallet。code
爲了讓用戶在Wallet的其餘選項中發現你的應用,你須要將你的應用添加爲Wallet的擴展。這樣當用戶點擊「添加」時,會使您的應用出如今 Wallet 的「其餘」應用列表中。隨後,用戶能夠從該列表中挑選您的應用,該應用將在手機上下載並安裝。若要出如今 Wallet 的「其餘」列表中,請註冊爲一項 Wallet 擴展。擴展在您的應用項目的 WMAppManifest.xml 文件中指定。如下是 WMAppManifest.xml 文件的一個示例,其中包含用於將應用註冊爲 Wallet 擴展的 Extension 元素。xml
<Extensions> <Extension ExtensionName="Wallet_app_membership" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5683}" TaskID="_default"/> </Extensions>
在以上代碼中,經過在 WMAppManifest.xml 文件中將一個 Extension 元素添加至 Extensions擴展。
ExtensionName: 定義所註冊擴展的類型。註冊爲 Wallet 擴展時,此屬性的有效值爲:
Wallet_app_other – 用於非特定 Wallet 項目
Wallet_app_loyalty – 用於信用卡
Wallet_app_membership – 用於會員卡
Wallet_app_transit – 用於儲值卡
Wallet_app_payment – 用於支付卡
即便你的應用將用於多種 Wallet 項目類型也只須要註冊一次,。能夠按須要註冊爲多種 Wallet 項目類型的擴展,方法是在 WMAppManifest.xml 文件中將多個 Extension 元素添加到 Extensions 中。目前,當用戶在Wallet中點擊「其餘」以顯示「添加到 Wallet」對話框並查找 Wallet 擴展時,將返回全部擴展,不管註冊爲哪一種 Wallet 項目類型。
ConsumerID: 這是一個固定值,在手機上設置爲 Wallet 應用的 id,即 {5B04B775-356B-4AA0-AAF8-6491FFEA5683}。
TaskID: 將此設置爲 default。