共用方式為


Xamarin.iOS 中的 PassKit

iOS 電子錢包應用程式可讓使用者將數位通行證儲存在其裝置上。 這些通行證是由商家產生,並透過電子郵件、URL 或透過商家自己的iOS應用程式傳送給客戶。 這些通行證可以代表各種事情,從電影票到忠誠卡到登機證。 PassKit 架構可讓開發人員以程式設計方式與傳遞互動。

本文件介紹電子貨幣包,以及搭配 Xamarin.iOS 使用 PassKit API。

錢包商店,並組織所有通行證在手機上

需求

本文件中討論的 PassKit 功能需要 iOS 6 和 Xcode 4.5,以及 Xamarin.iOS 6.0。

簡介

PassKit 解決的關鍵問題是條碼的散發和管理。 目前如何使用條碼的一些真實世界範例包括:

  • 在線 購買電影票證 – 客戶通常會以代表其票證的條碼傳送電子郵件。 這個條碼是列印並帶到電影院掃描進入。
  • 忠誠卡 – 客戶在錢包或錢包中攜帶許多不同的商店特定卡片,以便在購買商品時顯示和掃描。
  • 優待券 – 優惠券是透過電子郵件、可列印的網頁、信件箱和報紙和雜誌中的條碼散發。 客戶將他們帶到商店進行掃描,以接收貨物、服務或折扣作為回報。
  • 登機證 - 類似於購買電影票。

PassKit 提供下列每個案例的替代方案:

  • 電影票證 – 購買後,客戶會新增活動票證通行證(透過電子郵件或網站連結)。 隨著電影時間的臨近,通行證會自動出現在鎖定螢幕上作為提醒,在到達電影院時,通行證很容易被擷取並顯示在錢包中掃描。
  • 忠誠卡 – 除了提供實體卡 外,商店還可以發行(透過電子郵件或網站登入後)商店卡通行證。 市集可以提供其他功能,例如透過推播通知更新傳遞上的帳戶餘額,而使用地理位置服務,當客戶靠近商店位置時,傳遞會自動出現在鎖定畫面上。
  • 優待券 – 優惠券通行證可以輕鬆地產生具有獨特特性,以協助追蹤,並透過電子郵件或網站連結散發。 當使用者接近特定位置時,下載的優待券會自動出現在鎖定畫面上,以及/或在特定日期上(例如到期日即將到期時)。 由於優惠券儲存在用戶的手機上,所以它們總是很方便,而且不會錯位。 優待券可能會鼓勵客戶下載 Companion Apps,因為 App Store 連結可以併入 Pass,增加與客戶的參與度。
  • 登機證 – 在在線簽入程式之後,客戶會透過電子郵件或連結收到登機證。 運輸提供者提供的隨附應用程式可能包括簽入程式,也允許客戶執行其他功能,例如選擇座位或膳食。 如果傳輸延遲或取消,傳輸提供者可以使用推播通知來更新傳遞。 隨著登機時間的臨近,通行證會出現在鎖定畫面上作為提醒,並提供快速通行證的存取權。

PassKit 的核心提供簡單且方便的方式,可在 iOS 裝置上儲存和顯示條碼。 隨著額外的時間和位置鎖定畫面整合,推播通知和隨附應用程式整合,為非常複雜的銷售、票證和計費服務提供了基礎。

PassKit 生態系統

PassKit 不只是 CocoaTouch 內的 API,而是應用程式、資料和服務的較大生態系統的一部分,可促進條碼和其他數據的安全共用和管理。 此高階圖表顯示可以參與建立和使用傳遞的不同實體:

此高階圖表顯示建立和使用傳遞所涉及的實體

生態系統的每個部分都有明確定義的角色:

  • 錢包 – Apple 的內建 iOS 應用程式,可儲存和顯示通行證。 這是傳遞在真實世界中轉譯使用的唯一位置(即條碼隨即顯示,以及傳遞中的所有當地語系化數據)。
  • 隨附應用程式 – iOS 6 應用程式,由通行證提供者所建置,以擴充他們發出的通行證功能,例如將價值新增至商店卡、變更登機證上的座位或其他商務特定功能。 不需要隨附應用程式,傳遞才能很有用。
  • 您的伺服器 – 可產生傳遞並簽署以進行散發的安全伺服器。 您的隨附應用程式可能會連線到您的伺服器,以產生新的傳遞或要求現有通行證的更新。 您可以選擇性地實作「錢包」呼叫的 Web 服務 API 來更新傳遞。
  • APNS 伺服器 – 您的伺服器能夠使用 APNS 通知指定裝置上傳遞的更新錢包。 將通知推送至電子貨幣包,然後連絡您的伺服器以取得變更的詳細數據。 隨附應用程式不需要針對此功能實作APNS(他們可以接 PKPassLibraryDidChangeNotification 聽 )。
  • Conduit Apps – 不會直接操作通行證的應用程式(就像隨附應用程式所做的一樣),但可以藉由辨識傳球並允許它們新增至錢包來改善其公用程式。 郵件用戶端、社交網路瀏覽器和其他數據匯總應用程式都可能會遇到附件或傳遞連結。

整個生態系統看起來很複雜,因此值得一提的是,某些元件是選擇性的,而且可能執行更簡單的PassKit實作。

什麼是通行證?

通行證是代表票證、優惠券或卡片的數據集合。 它可能用於個人的單一使用(因此包含航班號碼和座位配置等詳細數據),或者它可能會有多個使用令牌,可由任意數目的用戶共用(例如折扣優惠券)。 Apple 的 About Pass Files 檔提供詳細的描述。

類型

目前有五種支持的類型,可透過傳遞的配置和上邊緣,在電子貨幣包應用程式中區分:

  • 事件票證 – 小型半圓形剪下。
  • 登機口 – 可以指定運輸特定圖示(如公共汽車、火車、飛機)。
  • 商店卡 – 四捨五入的頂端,例如信用卡或轉帳卡。
  • 優待券 – 沿著頂端穿孔。
  • 泛型 – 與 Store Card 相同,四捨五入。

這五種通行證類型會顯示在此螢幕快照中(依序:優惠券、一般、商店卡、登機證和活動票):

此螢幕快照顯示五個傳遞類型

檔案結構

傳遞檔案實際上是擴展名為 .pkpassZIP 封存盤,其中包含一些特定的 JSON 檔案(必要)、各種圖像檔(選擇性)以及當地語系化字串(也是選擇性的)。

  • pass.json – 必要。 包含傳遞的所有資訊。
  • manifest.json – 必要專案。 包含傳遞中每個檔案的SHA1哈希,但簽章檔案和這個檔案除外(manifest.json)。
  • signature – 必要專案。 使用 iOS 佈建入口網站中產生的憑證簽署 manifest.json 檔案來建立。
  • logo.png – 選擇性。
  • background.png – 選擇性。
  • icon.png – 選擇性。
  • 可本地化的字串檔案 – 選擇性。

傳遞檔案的目錄結構如下所示(這是 ZIP 封存的內容):

傳遞檔案的目錄結構如下所示

pass.json

JSON 是格式,因為傳遞通常會在伺服器上建立,這表示產生程式代碼在伺服器上與平台無關。 每個階段中的三個主要資訊片段如下:

  • teamIdentifier – 此鏈接全都會傳遞您產生的 App Store 帳戶。 此值會顯示在 iOS 佈建入口網站中。
  • passTypeIdentifier – 在布建入口網站中註冊以群組一起傳遞(如果您產生一個以上的類型)。 例如,咖啡店可能會建立商店卡通行證類型,以允許其客戶賺取忠誠度點數,但也建立和散發折扣優惠券的個別優惠券通行證類型。 同一家咖啡店甚至可能會舉辦現場音樂活動,併為那些商店發放活動票證。
  • serialNumber – 這個 passTypeidentifier 內的唯一字串。 值對電子貨幣包而言不透明,但在與伺服器通訊時,追蹤特定傳遞很重要。

每個 Pass 中有大量的其他 JSON 金鑰,其中範例如下所示:

{
   "passTypeIdentifier":"com.xamarin.passkitdoc.banana",  //Type Identifier (iOS Provisioning Portal)
   "formatVersion":1,                                     //Always 1 (for now)
   "organizationName":"Xamarin",                          //The name which appears on push notifications
   "serialNumber":"12345436XYZ",                          //A number for you to identify this pass
   "teamIdentifier":"XXXAAA1234",                         //Your Team ID
   "description":"Xamarin Demo",                          //
   "foregroundColor":"rgb(54,80,255)",                    //color of the data text (note the syntax)
   "backgroundColor":"rgb(209,255,247)",                  //color of the background
   "labelColor":"rgb(255,15,15)",                         //color of label text and icons
   "logoText":"Banana ",                                  //Text that appears next to logo on top
   "barcode":{                                            //Specification of the barcode (optional)
      "format":"PKBarcodeFormatQR",                       //Format can be QR, Text, Aztec, PDF417
      "message":"FREE-BANANA",                            //What to encode in barcode
      "messageEncoding":"iso-8859-1"                      //Encoding of the message
   },
   "relevantDate":"2012-09-15T15:15Z",                    //When to show pass on screen. ISO8601 formatted.
  /* The following fields are specific to which type of pass. The name of this object specifies the type, e.g., boardingPass below implies this is a boarding pass. Other options include storeCard, generic, coupon, and eventTicket */
   "boardingPass":{
/*headerFields, primaryFields, secondaryFields, and auxiliaryFields are arrays of field object. Each field has a key, label, and value*/
      "headerFields":[          //Header fields appear next to logoText
         {
            "key":"h1-label",   //Must be unique. Used by iOS apps to get the data.
            "label":"H1-label", //Label of the field
            "value":"H1"        //The actual data in the field
         },
         {
            "key":"h2-label",
            "label":"H2-label",
            "value":"H2"
         }
      ],
      "primaryFields":[       //Appearance differs based on pass type
         {
            "key":"p1-label",
            "label":"P1-label",
            "value":"P1"
         }
      ],
      "secondaryFields":[     //Typically appear below primaryFields
         {
            "key":"s1-label",
            "label":"S1-label",
            "value":"S1"
         }
      ],
      "auxiliaryFields":[    //Appear below secondary fields
         {
            "key":"a1-label",
            "label":"A1-label",
            "value":"A1"
         }
      ],
      "transitType":"PKTransitTypeAir"  //Only present in boradingPass type. Value can
                                        //Air, Bus, Boat, or Train. Impacts the picture
                                        //that shows in the middle of the pass.
   }
}

條碼

僅支援 2D 格式:PDF417、Aztec、QR。 蘋果聲稱,1D 條碼不適合在反光手機螢幕上掃描。

條碼下方顯示的替代文字是選擇性的 – 某些商家想要能夠手動讀取/輸入。

ISO-8859-1 編碼是最常見的,檢查掃描系統會使用哪些編碼來讀取您的通行證。

相關性 (鎖定畫面)

有兩種類型的數據可能會導致傳遞顯示在鎖定畫面上:

地點

在通行證中最多可指定10個位置,例如客戶經常造訪的商店,或電影院或機場的位置。 客戶可以透過隨附應用程式設定這些位置,或提供者可以從使用量數據中判斷這些位置(如果由客戶的許可權收集)。

當傳遞顯示在鎖定畫面上時,會計算柵欄,以便當使用者離開區域時,將通行證隱藏在鎖定畫面中。 半徑會系結至傳遞樣式,以防止濫用。

日期和時間

在 Pass 中只能指定一個日期/時間。 日期和時間對於觸發登機牌和事件票證的鎖定畫面提醒很有用。

可以透過推播或PassKit API更新,以便在多用途票證的情況下更新日期/時間(例如劇院或體育綜合體季票)。

當地語系化

將傳遞轉譯成多種語言類似於當地語系化 iOS 應用程式 – 使用 .lproj 延伸模組建立語言特定目錄,並將本地化的專案放在內。 文字翻譯應該輸入檔案 pass.strings 中,而當地語系化影像的名稱應該與在Pass根目錄中取代的影像相同。

安全性

傳遞會使用您在 iOS 布建入口網站中產生的私人憑證進行簽署。 簽署通行證的步驟如下:

  1. 計算傳遞目錄中每個檔案的SHA1哈希(請勿包含 manifest.jsonsignature 檔案,無論如何都不應該存在於這個階段)。
  2. 以 JSON 索引鍵/值清單的形式寫入 manifest.json 每個檔名及其哈希。
  3. 使用憑證簽署檔案, manifest.json 並將結果寫入名為 signature 的檔案。
  4. 壓縮所有專案,並提供產生的檔案 .pkpass 擴展名。

由於您的私鑰必須簽署傳遞,因此此程式應該只在您所控制的安全伺服器上完成。 請勿散髮金鑰以嘗試並產生應用程式中的傳遞。

組態和設定

本節包含協助設定布建詳細數據的指示,並建立您的第一個階段。

布建 PassKit

若要讓傳遞進入 App Store,它必須連結到開發人員帳戶。 這需要兩個步驟:

  1. 傳遞必須使用稱為「傳遞類型標識碼」的唯一標識碼進行註冊。
  2. 您必須產生有效的憑證,才能使用開發人員的數位簽名簽署通行證。

若要建立傳遞類型識別碼,請執行下列動作。

建立傳遞類型識別碼

第一個步驟是針對要支援的每個不同 傳遞類型設定傳遞類型 標識碼。 傳遞標識碼 (或傳遞類型標識碼) 會建立 Pass 的唯一識別碼。 我們將使用此標識碼,使用憑證將傳遞連結至您的開發人員帳戶。

  1. 在 iOS 佈建入口網站的 [憑證、標識符和配置檔] 區段中,流覽至 [標識符],然後選取 [傳遞類型識別符]。 然後選取 + 按鈕以建立新的傳遞類型: 建立新的傳遞類型

  2. 提供 Pass 的描述(名稱)和識別碼(唯一字串)。 請注意,所有傳遞類型識別碼都必須以字串 pass. 開頭。在此範例中,我們使用 pass.com.xamarin.coupon.banana提供描述和識別碼

  3. 按下 [註冊] 按鈕來確認 [傳遞標識符]。

產生憑證

若要為此傳遞類型識別元建立新的憑證,請執行下列動作:

  1. 從清單中選取新建立的 [傳遞識別符],然後按兩下 [ 編輯 ] : 從清單中選取新的傳遞識別碼

    然後,選取 [ 建立憑證...]

    選取 [建立憑證]

  2. 請遵循建立憑證簽署要求 (CSR) 的步驟。

  3. 在開發人員入口網站上按 [ 繼續] 按鈕,並上傳 CSR 以產生您的憑證。

  4. 下載憑證,然後按兩下該憑證,將它安裝在您的密鑰鏈中。

既然我們已為此傳遞類型標識元建立憑證,下一節將說明如何手動建置傳遞。

如需布建電子錢包的詳細資訊,請參閱 使用功能 指南。

手動建立傳遞

現在我們已建立傳遞類型,我們可以手動製作傳遞,以在模擬器或裝置上進行測試。 建立傳遞的步驟如下:

  • 建立目錄以包含傳遞檔案。
  • 建立pass.json檔案,其中包含所有必要的數據。
  • 在資料夾中包含影像(如有需要)。
  • 計算資料夾中每個檔案的SHA1哈希,並寫入至manifest.json。
  • 使用下載的憑證 .p12 檔案簽署manifest.json。
  • 壓縮目錄的內容,並使用 .pkpass 擴展名重新命名。

本文範例程式代碼中有一些原始程式檔可用來產生傳遞。 使用 CreateAPassManually 目錄目錄中的檔案 CouponBanana.raw 。 下列檔案存在:

這些檔案存在

開啟pass.json並編輯 JSON。 您必須至少更新 passTypeIdentifierteamIdentifer ,以符合您的 Apple Developer 帳戶。

"passTypeIdentifier" : "pass.com.xamarin.coupon.banana",
"teamIdentifier" : "?????????",

然後,您必須計算每個檔案的哈希,並建立 manifest.json 檔案。 當您完成時,看起來會像這樣:

{
  "icon@2x.png" : "30806547dcc6ee084a90210e2dc042d5d7d92a41",
  "icon.png" : "87e9ffb203beb2cce5de76113f8e9503aeab6ecc",
  "pass.json" : "c83cd1441c17ecc6c5911bae530d54500f57d9eb",
  "logo.png" : "b3cd8a488b0674ef4e7d941d5edbb4b5b0e6823f",
  "logo@2x.png" : "3ccd214765507f9eab7244acc54cc4ac733baf87"
}

接下來,必須使用針對此傳遞類型標識符產生的憑證 (.p12 檔案)來產生此檔案的簽章。

在 Mac 上登入

Apple 下載網站下載電子錢包種子支援材料signpass使用工具將資料夾轉換成傳遞(這也會計算 SHA1 哈希,並將輸出壓縮成 .pkpass 檔案)。

測試

如果您要檢查這些工具的輸出(將檔名設定為 .zip 然後開啟它),您會看到下列檔案(請注意 和 signature 檔案的manifest.json新增):

檢查這些工具的輸出

簽署之後,ZIPped 並將檔案重新命名為 , BananaCoupon.pkpass您可以將它拖曳到模擬器中進行測試,或傳送電子郵件給自己以在實際裝置上擷取。 您應該會看到一個畫面來 新增 傳遞,如下所示:

新增傳遞畫面

一般來說,該程式會在伺服器上自動化,不過手動傳遞建立可能是小型企業的選項,這些企業只建立不需要支援後端伺服器的優待券。

電子錢包

錢包是 PassKit 生態系統的核心部分。 此螢幕快照顯示空白的錢包,以及通行證清單和個別通行證的外觀:

此螢幕快照顯示空白的錢包,以及通行證清單和個別通行證的外觀

電子貨幣包的功能包括:

  • 這是通過其條碼進行掃描的唯一轉譯位置。
  • 用戶可以變更更新的設定。 如果啟用,推播通知可以觸發Pass中數據的更新。
  • 用戶可以啟用或停用鎖定畫面整合。 如果啟用,這可讓傳遞根據其鎖定畫面自動顯示,根據傳入中內嵌的相關時間和位置數據。
  • 如果傳遞 JSON 中提供 web-server-URL,則傳遞的反向端支援提取到重新整理。
  • 如果應用程式識別碼是在傳遞 JSON 中提供,則可以開啟隨附應用程式(或下載)。
  • 可以刪除通行證(使用可愛的碎紙動畫)。

將傳遞新增至錢包

通行證可以透過下列方式新增至電子貨幣包:

  • Conduit Apps – 這些不會直接操作傳遞,它們只會載入傳遞檔案,並向使用者顯示將他們新增至電子貨幣包的選項。

  • 隨附應用程式 – 這些是由提供者撰寫來散發通行證,並提供其他功能來瀏覽或編輯它們。 Xamarin.iOS 應用程式具有 PassKit API 的完整存取權,以建立及操作傳遞。 然後可以使用 將通行證新增至電子貨幣包 PKAddPassesViewController。 本檔的隨附應用程式一節會詳細說明此程式。

Conduit 應用程式

Conduit 應用程式是可能代表使用者接收通行證的中繼應用程式,而且應該經過程式設計來辨識其內容類型,並提供新增至錢包的功能。 管管應用程式的範例包括:

  • 郵件 – 將附件辨識為傳遞。
  • Safari – 按兩下傳遞 URL 連結時,辨識傳遞內容類型。
  • 其他自定義應用程式 – 任何接收附件或開啟連結的應用程式(社交媒體用戶端、郵件閱讀程式等)。

此螢幕快照顯示 iOS 6 中的郵件如何辨識傳遞附件,以及 (觸控時) 供應專案以將它新增至錢包。

此螢幕快照顯示 iOS 6 中的郵件如何辨識傳遞附件

此螢幕快照顯示郵件供應專案如何將傳遞附件新增至錢包

如果您要建置可能是通行證管道的應用程式,則可以透過下列方式加以辨識:

  • 擴展名 - .pkpass
  • MIME 類型 - application/vnd.apple.pkpass
  • UTI – com.apple.pkpass

Conduit 應用程式的基本作業是擷取傳遞檔案,並呼叫 PassKit 的 PKAddPassesViewController ,讓使用者選擇將傳遞新增至其錢包。 此檢視控制器的實作涵蓋於隨附應用程式下一節

Conduit 應用程式不需要針對特定傳遞類型標識符布建,其方式與隨附應用程式相同。

隨附應用程式

隨附應用程式提供處理傳遞的其他功能,包括建立傳遞、更新與Pass相關聯的資訊,以及管理與應用程式相關聯的傳遞。

隨附應用程式不應該嘗試複製電子貨幣包的功能。 它們不打算顯示掃描的通行證。

本節的其餘部分說明如何建置與 PassKit 互動的基本隨附應用程式。

佈建

由於錢包是市集技術,因此應用程式必須分開布建,且無法使用Team Provisioning Profile或通配符應用程式識別碼。 請參閱使用功能指南,為錢包應用程式建立唯一的應用程式標識碼和布建配置檔。

權利

Entitlements.plist 檔案應該包含在所有最近的 Xamarin.iOS 專案中。 若要新增 Entitlements.plist 檔案,請遵循使用權利指南中的步驟。

若要設定權利,請執行下列動作:

按兩下 Solution Pad 中的 Entitlements.plist 檔案,以開啟 Entitlements.plist 編輯器:

Entitlements.plst 編輯器

在 [錢包] 區段下,選取 [ 啟用錢包] 選項

啟用錢包權利

默認選項是讓應用程式允許所有傳遞類型。 不過,您可以限制您的應用程式,只允許小組傳遞類型的子集。 若要啟用此功能,請選取 [ 允許小組傳遞類型的 子集],然後輸入您想要允許之子集的傳遞類型標識符。

偵錯

如果您在部署應用程式時遇到問題,請檢查您使用的是正確的布建配置檔,且 Entitlements.plist 已選取 為iPhone套件組合簽署選項中的 [自定義權利] 檔案。

如果您在部署時遇到此錯誤:

Installation failed: Your code signing/provisioning profiles are not correctly configured (error: 0xe8008016)

pass-type-identifiers則權利陣列不正確(或不符合布建配置檔)。 確認傳遞類型識別碼和您的小組識別碼是否正確。

類別

下列 PassKit 類別可供應用程式存取 Pass:

  • PKPass – Pass 的實例。
  • PKPassLibrary – 提供 API 來存取裝置上的傳遞。
  • PKAddPassesViewController – 用來顯示使用者儲存在其錢包中的通行證。
  • PKAddPassesViewControllerDelegate – Xamarin.iOS 開發人員

範例

請參閱本文範例中的 PassLibrary 專案。 它示範在電子貨幣包隨附應用程式中所需的下列常見函式:

檢查電子貨幣包是否可用

iPad 上無法使用電子錢包,因此應用程式應該先檢查,再嘗試存取 PassKit 功能。

if (PKPassLibrary.IsAvailable) {
    // create an instance and do stuff...
}

建立傳遞連結庫實例

PassKit 連結庫不是單一連結庫,應用程式應該建立和儲存和實例來存取 PassKit API。

if (PKPassLibrary.IsAvailable) {
    library = new PKPassLibrary ();
    // do stuff...
}

取得通行證清單

應用程式可以從連結庫要求傳遞清單。 此清單會自動依PassKit進行篩選,因此您只能看到已使用您的小組標識碼建立的通行證,且這些通行證會列在權利中。

var passes = library.GetPasses ();  // returns PKPass[]

請注意,模擬器不會篩選傳回的傳遞清單,因此此方法應該一律在實際裝置上進行測試。 此清單可以顯示在UITableView中。 新增兩張優待券之後,範例應用程式看起來會像這樣:

新增兩張優待券之後,範例應用程式看起來會像這樣

顯示傳遞

一組有限的資訊可用於轉譯隨附應用程式內的傳遞。

從這組標準屬性中選擇,以顯示傳遞清單,如範例程式代碼所示。

string passInfo =
                "Desc:" + pass.LocalizedDescription
                + "\nOrg:" + pass.OrganizationName
                + "\nID:" + pass.PassTypeIdentifier
                + "\nDate:" + pass.RelevantDate
                + "\nWSUrl:" + pass.WebServiceUrl
                + "\n#" + pass.SerialNumber
                + "\nPassUrl:" + pass.PassUrl;

此字串會顯示為範例中的警示:

範例中已選取優待券警示

您也可以使用 LocalizedValueForFieldKey() 方法來擷取您設計之傳遞中欄位的數據(因為您將知道應該有哪些字段)。 範例程式代碼不會顯示這個。

從檔案載入傳遞

由於傳遞只能新增至具有使用者許可權的電子貨幣包,因此必須顯示檢視控制器,才能讓他們決定。 此程式代碼會用於 範例中的 [新增 ] 按鈕,以載入內嵌在應用程式中的預先建置傳遞(您應該將此取代為您已簽署的傳遞):

NSData nsdata;
using ( FileStream oStream = File.Open (newFilePath, FileMode.Open ) ) {
        nsdata = NSData.FromStream ( oStream );
}
var err = new NSError(new NSString("42"), -42);
var newPass = new PKPass(nsdata,out err);
var pkapvc = new PKAddPassesViewController(newPass);
NavigationController.PresentModalViewController (pkapvc, true);

傳遞會顯示 [新增] 和 [取消] 選項:

顯示 [新增] 和 [取消] 選項的傳遞

取代現有的傳遞

取代現有的傳遞不需要使用者的許可權,但如果傳遞不存在,它就會失敗。

if (library.Contains (newPass)) {
     library.Replace (newPass);
}

編輯傳遞

PKPass 不可變動,因此您無法更新程式碼中的傳遞物件。 若要改變傳遞中的數據,應用程式必須能夠存取可保留傳遞記錄的網頁伺服器,併產生具有應用程式可下載之更新值的新傳遞檔案。

傳遞檔案建立必須在伺服器上完成,因為傳遞必須使用必須保持私人且安全的憑證進行簽署。

產生更新的傳遞檔案之後,請使用 Replace 方法來覆寫裝置上的舊數據。

顯示掃描的傳遞

如先前所述,只有錢包可以顯示掃描的通行證。 您可以使用 方法顯示 OpenUrl Pass,如下所示:

UIApplication.SharedApplication.OpenUrl (p.PassUrl);

接收變更通知

應用程式可以使用 接聽對傳遞連結庫 PKPassLibraryDidChangeNotification所做的變更。 變更可能是由在背景觸發更新的通知所造成,因此最好在應用程式中接聽更新。

noteCenter = NSNotificationCenter.DefaultCenter.AddObserver (PKPassLibrary.DidChangeNotification, (not) => {
    BeginInvokeOnMainThread (() => {
        new UIAlertView("Pass Library Changed", "Notification Received", null, "OK", null).Show();
        // refresh the list
        var passlist = library.GetPasses ();
        table.Source = new TableSource (passlist, library);
        table.ReloadData ();
    });
}, library);  // IMPORTANT: must pass the library in

註冊通知時,請務必傳遞連結庫實例,因為 PKPassLibrary 不是單一實例。

伺服器處理

建置支援PassKit的伺服器應用程式的詳細討論已超出本簡介文章的範圍。

請參閱 dotnet-passbook 開放原始碼 C# 伺服器端程序代碼。

推播通知

使用推播通知來更新傳遞的詳細討論已超出本簡介文章的範圍。

您必須實作 Apple 所定義的 REST 型 API,以在需要更新時回應來自電子錢包的 Web 要求。

如需詳細資訊,請參閱Apple更新 傳遞 指南。

摘要

本文介紹 PassKit,概述其實用原因,並說明必須針對完整 PassKit 解決方案實作的不同部分。 它說明設定 Apple Developer 帳戶以建立通過所需的步驟、手動進行傳遞的程式,以及如何從 Xamarin.iOS 應用程式存取 PassKit API。