Xamarin.ios의 PassKitPassKit in Xamarin.iOS

IOS 전자 지갑 앱을 사용 하면 사용자가 장치에 디지털 패스를 저장할 수 있습니다.The iOS Wallet app allows users to store digital passes on their devices. 이러한 패스는 상인에 의해 생성 되 고 전자 메일, Url 또는 판매자 고유의 iOS 앱을 통해 고객에 게 전송 됩니다.These passes are generated by merchants and sent to the customer via email, URLs, or through the merchant's own iOS app. 이러한 패스는 영화 티켓에서 충성도 카드까지 다양 한 항목을 나타낼 수 있습니다.These passes can represent various things, from movie tickets to loyalty cards to boarding passes. 개발자는 PassKit 프레임 워크를 사용 하 여 패스를 프로그래밍 방식으로 조작할 수 있습니다.The PassKit framework allows developers to interact with passes programmatically.

이 문서에서는 PassKit API를 사용 하 여 전자 지갑 및 사용을 소개 합니다.This document introduces Wallet and using the PassKit API with Xamarin.iOS.

요구 사항Requirements

이 문서에 설명 된 PassKit 기능에는 Xamarin.ios 6.0과 함께 iOS 6 및 Xcode 4.5가 필요 합니다.The PassKit features discussed in this document require iOS 6 and Xcode 4.5, along with Xamarin.iOS 6.0.

소개Introduction

PassKit에서 해결 하는 주요 문제는 바코드의 배포 및 관리입니다.The key problem that PassKit solves is the distribution and management of barcodes. 현재 바코드를 사용 하는 방법에 대 한 몇 가지 실제 예는 다음과 같습니다.Some real-world examples of how barcodes are currently used include:

  • 온라인으로 영화 티켓 구매 – 고객은 일반적으로 티켓을 나타내는 바코드를 메일로 전송 합니다.Buying movie tickets online – Customers are typically emailed a barcode that represents their tickets. 이 바코드는 인쇄 되어 항목을 검색 하는 데 사용 됩니다.This barcode is printed and taken to the cinema to be scanned for entry.
  • 충성도 카드 – 고객은 상품을 구매할 때 표시 및 검색을 위해 다양 한 매장 특정 카드를 자신의 전자 지갑 또는 지갑에 운반 합니다.Loyalty cards – Customers carry a number of different store-specific cards in their wallet or purse, for display and scanning when they purchase goods.
  • 쿠폰 – 쿠폰은 letterboxes 및 신문 및 잡지의 바코드를 통해 전자 메일을 통해 인쇄 가능한 웹 페이지를 통해 배포 됩니다.Coupons – Coupons are distributed via email, as printable web pages, through letterboxes and as barcodes in newspapers and magazines. 고객은 상품, 서비스 또는 할인을 고객에 게 제공 하는 검색을 위해 스토어에 가져옵니다.Customers bring them to a store for scanning, to receive goods, services or discounts in return.
  • 패스를 탑재 하는 것과 유사 합니다.Boarding passes – Similar to buying a movie ticket.

PassKit는 이러한 각 시나리오에 대 한 대안을 제공 합니다.PassKit offers an alternative for each of these scenarios:

  • 영화 티켓 – 구매 후 고객이 이벤트 티켓 전달 (전자 메일 또는 웹 사이트 링크를 통해)을 추가 합니다.Movie tickets – After purchase, the customer adds an event ticket pass (via email or a website link). 영화에 대 한 시간이 되 면 패스가 자동으로 잠금 화면에 표시 되 고, 영화에 도착 하는 경우, 검색을 위해 쉽게 검색 하 여 전자 지갑에 표시할 수 있습니다.As the time for the movie approaches, the pass will automatically appear on the lock-screen as a reminder, and on arrival at the cinema the pass is easily retrieved and displayed in Wallet for scanning.
  • 물리적 카드를 제공 하는 것이 아니라 (또는 그 외에도 ) 카드는 매장 카드를 통과 하는 (전자 메일을 통해 또는 웹 사이트 로그인 후) 문제를 발생 시킬 수 있습니다.Loyalty cards – Rather than (or in addition to) providing a physical card, stores can issue (via email or after a website login) a Store Card Pass. 저장소는 푸시 알림을 통해 패스의 계정 잔액을 업데이트 하 고, 지리적 위치 서비스를 사용 하는 등의 추가 기능을 제공할 수 있습니다. 고객이 상점 위치에 가까워지면 패스가 잠금 화면에 자동으로 나타날 수 있습니다.The store can provide additional features such as updating the balance of the account on the pass via push notifications, and using geolocation services the pass could automatically appear on the lock-screen when the customer is near a store location.
  • 쿠폰 – 쿠폰 전달은 추적 및 전자 메일 또는 웹 사이트 링크를 통해 배포 하는 데 도움이 되는 고유한 특성을 사용 하 여 쉽게 생성할 수 있습니다.Coupons – Coupon passes can easily be generated with unique characteristics to help with tracking, and distributed via email or website links. 다운로드 한 쿠폰은 사용자가 특정 위치에 가까이 있을 때 잠금 화면에 자동으로 표시 될 수 있으며, 또는 지정 된 날짜 (예: 만료 날짜에 근접 하는 경우)에도 자동으로 표시 됩니다.Downloaded coupons can automatically appear on the lock-screen when the user is near a specific location, and/or on a given date (such as when the expiry date is approaching). 쿠폰은 사용자의 휴대폰에 저장 되므로 항상 유용 하 고 위치가 잘못 됩니다.Because the coupons are stored on the user’s phone, they are always handy and do not get misplaced. 앱 스토어 링크를 Pass에 통합 하 여 고객과의 참여를 높일 수 있기 때문에 쿠폰은 고객이 자매 앱을 다운로드 하도록 유도할 수 있습니다.Coupons might encourage customers to download Companion Apps because App Store links can be incorporated into the Pass, increasing engagement with the customer.
  • 패스를 탑재 하는 중 – 온라인 체크 인 프로세스 후 고객이 전자 메일 또는 링크를 통해 보드 전달 전달을 받게 됩니다.Boarding passes – After an online check-in process, the customer would receive their boarding pass via email or a link. 전송 공급자가 제공 하는 도우미 앱에는 체크 인 프로세스가 포함 될 수 있으며 고객이 사용자 또는 식사 선택 등의 추가 기능을 수행할 수도 있습니다.A Companion App provided by the transport provider could include the check-in process, and also allow the customer to perform additional functions like choosing their seat or meal. 전송이 지연 되거나 취소 된 경우 전송 공급자는 푸시 알림을 사용 하 여 pass를 업데이트할 수 있습니다.The transport provider can use push notifications to update the pass if transport is delayed or canceled. 탑재 시간이 되 면 패스가 잠금 화면에 미리 알림으로 표시 되 고 패스에 빠르게 액세스할 수 있게 됩니다.As the boarding time approaches the pass will appear on the lock-screen as a reminder and to provide quick access to the Pass.

PassKit는 코어에서 iOS 장치에 바코드를 저장 하 고 표시 하는 간단 하 고 편리한 방법을 제공 합니다.At its core, PassKit provides a simple and convenient way to store and display barcodes on your iOS device. 추가 시간 및 위치 잠금 화면 통합, 푸시 알림 및 부록 응용 프로그램 통합은 매우 정교한 판매, 티켓 및 청구 서비스를 위한 토대를 제공 합니다.With the additional time and location lock-screen integration, push notifications and Companion Application integrate it offers a foundation for very sophisticated sales, ticketing and billing services.

PassKit 에코 시스템PassKit Ecosystem

PassKit는 CocoaTouch 내에서 API가 아니라 바코드 및 기타 데이터를 안전 하 게 공유 하 고 관리할 수 있는 더 큰 앱, 데이터 및 서비스 에코 시스템의 일부입니다.PassKit is not just an API within CocoaTouch, rather it is part of a larger ecosystem of apps, data and services that facilitate the secure sharing and management of barcodes and other data. 이 개략적인 다이어그램은 패스를 만들고 사용 하는 데 사용할 수 있는 여러 엔터티를 보여 줍니다.This high-level diagram shows the different entities that can be involved in creating and using passes:

에코 시스템의 각 부분에는 명확 하 게 정의 된 역할이 있습니다.Each piece of the ecosystem has a clearly-defined role:

  • 전자/ 반자 – Apple의 기본 제공 iOS 앱은 패스를 저장 하 고 표시 합니다.Wallet – Apple’s built-in iOS app that stores and displays passes. 이 유일한 장소는 실제 환경에서 사용할 수 있도록 렌더링 됩니다 (ie는 해당 패스의 모든 지역화 된 데이터와 함께 바코드를 표시 합니다).This is the only place that passes are rendered for use in the real world (ie the barcode is displayed, along with all the localized data in the pass).
  • 동반 앱 – 저장소 카드에 값을 추가 하 여 탑재 된 패스 또는 다른 비즈니스 관련 함수에서 사용자를 변경 하는 것과 같이 통과 하는 패스의 기능을 확장 하기 위해 pass 공급자가 작성 한 iOS 6 앱입니다.Companion Apps – iOS 6 apps built by pass providers to extend the functionality of the passes they issue, such as adding value to a store card, changing the seat on a boarding pass or other business-specific function. 도우미 앱은 전달에 유용 하 게 사용할 필요가 없습니다.Companion Apps are not required for a pass to be useful.
  • 서버 – 통과를 생성 하 고 배포용으로 서명할 수 있는 보안 서버입니다.Your server – A secure server where passes can be generated and signed for distribution. 도우미 앱은 새 패스를 생성 하거나 기존 패스에 대 한 업데이트를 요청 하기 위해 서버에 연결할 수 있습니다.Your Companion App may connect to your server to generate new passes or request updates to existing passes. 필요에 따라 작은 사용자가 업데이트 통과를 위해 호출 하는 웹 서비스 API를 구현할 수 있습니다.You may optionally implement the web service API that Wallet would call to update passes.
  • Apns 서버 – 서버에는 apns를 사용 하 여 지정 된 장치에 대 한 업데이트를 전자 지갑에 알릴 수 있는 기능이 있습니다.APNS Servers – Your server has the ability to notify Wallet of updates to a pass on a given device using APNS. 변경 내용에 대 한 세부 정보를 확인 하려면 전자 메일에 전자 메일을 보낼 수 있습니다.Push a notification to Wallet which will then contact your server for details of the change. 도우미 앱은 PKPassLibraryDidChangeNotification 이 기능에 대해 APNS를 구현할 필요가 없습니다 (를 수신할 수 있음).Companion apps do not need to implement APNS for this feature (they can listen to the PKPassLibraryDidChangeNotification ).
  • 응용 프로그램 (예: 좋아요 앱)을 직접 조작 하지 않는 응용 프로그램은 패스를 인식 하 고 작은 사람에 게 추가할 수 있도록 허용 하 여 유틸리티를 개선할 수 있는 응용 프로그램입니다.Conduit Apps – Applications that don’t directly manipulate passes (like companion apps do), but which can improve their utility by recognizing passes and allowing them to be added to Wallet. 메일 클라이언트, 소셜 네트워크 브라우저 및 기타 데이터 집계 앱은 모두 첨부 파일이 나 패스에 대 한 링크를 만날 수 있습니다.Mail clients, social network browsers and other data aggregation apps may all encounter attachments or links to passes.

전체 에코 시스템은 복잡 하므로 일부 구성 요소는 선택 사항이 며 훨씬 더 간단한 PassKit 구현도 가능 합니다.The entire ecosystem looks complex, so it’s worth noting that some components are optional and much simpler PassKit implementations are possible.

Pass 란?What is a Pass?

Pass는 티켓, 쿠폰 또는 카드를 나타내는 데이터의 컬렉션입니다.A pass is a collection of data representing a ticket, coupon or card. 개인의 단일 사용을 위한 것일 수 있습니다. 따라서 항공편 번호 및 사용자 할당과 같은 세부 정보를 포함 하거나 할인 쿠폰과 같은 여러 사용자가 공유할 수 있는 여러 사용 토큰이 있을 수 있습니다.It may be intended for a single use by an individual (and therefore contain details such as a flight number and seat allocation) or it may a multiple use token that can be shared by any number of users (such as a discount coupon). 자세한 설명은 Apple의 파일 전달 정보 문서에 나와 있습니다.A detailed description is available in Apple’s About Pass Files document.

유형Types

현재 5 개의 지원 되는 형식으로,이는 패스의 레이아웃 및 위쪽 가장자리를 통해 전자 지갑 앱에서 구분할 수 있습니다.Currently five supported types, which can be distinguished in the Wallet app by the layout and top edge of the pass:

  • 이벤트 티켓 – 작은 반원형 컷아웃.Event Ticket – small semicircular cutout.
  • Pass – 노치를 나란히 탑재 하 고, 전송 관련 아이콘을 지정할 수 있습니다 (예:Boarding Pass – notches in side, transport-specific icon can be specified (eg. 버스, 학습, 비행기).bus, train, airplane).
  • 매장 카드 – 신용 카드 또는 직불 카드와 같이 위쪽으로 반올림 됩니다.Store Card – rounded top, like a credit or debit card.
  • 쿠폰 – 위쪽을 따라 perforated.Coupon – perforated along the top.
  • Generic – 매장 카드와 같으며 위쪽으로 반올림 됩니다.Generic – same as Store Card, rounded top.

5 개의 패스 형식이이 스크린샷에서 표시 됩니다 (순서: 쿠폰, 일반, 매장 카드, 전달 패스 및 이벤트 티켓).The five pass types are shown in this screenshot (in order: coupon, generic, store card, boarding pass and event ticket):

파일 구조File Structure

패스 파일은 일부 특정 JSON 파일 (필수), 다양 한 이미지 파일 (옵션) 및 지역화 된 문자열 (선택 사항)을 포함 하는 확장명이 pkpass 인 ZIP 보관 파일입니다.A pass file is actually a ZIP archive with a .pkpass extension, containing some specific JSON files (required), a variety of image files (optional) as well as localized strings (also optional).

  • pass – 필수 항목입니다.pass.json – required. 패스에 대 한 모든 정보를 포함 합니다.Contains all the information for the pass.
  • manifest.xml – 필수 항목입니다.manifest.json – required. 서명 파일 및이 파일 (manifest.xml)을 제외 하 고 pass의 각 파일에 대 한 SHA1 해시를 포함 합니다.Contains SHA1 hashes for each file in the pass except the signature file and this file (manifest.json).
  • signature – 필수 항목입니다.signature – required. IOS 프로 비전 포털 manifest.json 에서 생성 된 인증서를 사용 하 여 파일에 서명 하는 방식으로 만들어집니다.Created by signing the manifest.json file with the certificate generated in the iOS Provisioning Portal.
  • 로고 .png – 선택 사항입니다.logo.png – optional.
  • background .png – 선택 사항입니다.background.png – optional.
  • icon .png – 선택 사항입니다.icon.png – optional.
  • 지역화할 수 있는 문자열 파일 – 선택 사항입니다.Localizable strings files – optional.

패스 파일의 디렉터리 구조는 아래와 같습니다 (ZIP 보관 파일의 내용).Directory structure of a pass file is shown below (this is the contents of the ZIP archive):

pass.jsonpass.json

JSON은 일반적으로 패스가 서버에서 만들어지기 때문에 형식입니다. 즉, 생성 코드는 서버에 대 한 플랫폼에 구애 받지 않습니다.JSON is the format because passes are typically created on a server – it means that the generation code is platform-agnostic on the server. 모든 패스의 세 가지 주요 정보는 다음과 같습니다.The three key pieces of information in every pass are:

  • Teamidentifier – 앱 스토어 계정에 생성 하는 모든 패스를 연결 합니다.teamIdentifier – This links all passes you generate to your App Store account. 이 값은 iOS 프로 비전 포털에 표시 됩니다.This value is visible in the iOS Provisioning Portal.
  • passTypeIdentifier – 프로 비전 포털에 등록 하 여 두 개 이상의 유형을 생성 하는 경우 함께 전달 합니다.passTypeIdentifier – Register in Provisioning Portal to group passes together (if you produce more than one type). 예를 들어 커피숍은 고객이 충성도 크레딧을 획득 하 고 할인 쿠폰을 만들고 배포 하기 위한 별도의 쿠폰 전달 유형을 얻을 수 있도록 매장 카드 패스 유형을 만들 수 있습니다.For example, a coffee shop might create a store card pass type to allow their customers to earn loyalty credits, but also a separate coupon pass type to create and distribute discount coupons. 동일한 커피숍에서 라이브 음악 이벤트를 보유 하 고 해당 이벤트에 대 한 이벤트 티켓이 전달 될 수도 있습니다.That same coffee shop might even hold live music events and issue Event Ticket passes for those.
  • 일련 의 고유 문자열 passTypeidentifier 입니다.serialNumber – A unique string within this passTypeidentifier . 값은 작은 값으로 불투명 하지만 서버와 통신할 때 특정 패스를 추적 하는 데 중요 합니다.The value is opaque to Wallet, but is important for tracking specific passes when communicating with your server.

각 패스에는 다음과 같은 여러 가지 다른 JSON 키가 있습니다.There is a large number of other JSON keys in each Pass, an example of which is shown below:

{
   "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.
   }
}

바코드가Barcodes

2D 형식만 지원 됩니다. PDF417, Aztec, QR.Only 2D formats are supported: PDF417, Aztec, QR. Unsuited은 1D 바코드가 backlit 휴대폰 화면에서 스캔 하는 것을 말합니다.Apple claims that 1D barcodes are unsuited to scanning on a backlit phone screen.

바코드 아래에 표시 되는 대체 텍스트는 선택 사항입니다. 일부 상인은 수동으로 읽거나 입력할 수 있습니다.Alternate text displayed below the barcode is optional – some merchants want to be able to read/type manually.

ISO-8859-1 인코딩은 가장 일반적 이며, 패스를 읽을 검색 시스템에서 사용 하는 인코딩을 확인 합니다.ISO-8859-1 encoding is the most common, check which encoding is used by the scanning systems that will read your passes.

관련성 (잠금 화면)Relevancy (Lock Screen)

잠금이 화면에 표시 될 수 있는 데이터에는 두 가지 유형이 있습니다.There are two types of data that can cause a pass to be displayed on the lock-screen:

위치Location

패스에는 최대 10 개의 위치를 지정할 수 있습니다. 예를 들어 고객에 게 자주 방문 하는 매장 또는 영화 또는 공항의 위치를 지정할 수 있습니다.Up to 10 locations can be specified in a Pass, eg stores that a customer frequently visits, or the location of a cinema or airport. 고객은 도우미 앱을 통해 이러한 위치를 설정 하거나 공급자가 사용 현황 데이터 (고객의 권한으로 수집 된 경우)에서 이러한 위치를 결정할 수 있습니다.A customer could set these locations via a Companion App or the provider could determine them from usage data (if collected with the customer’s permission).

패스가 잠금 화면에 표시 되 면 사용자가 영역을 벗어나면 패스가 잠금 화면에서 숨겨집니다. 그러면 fence가 계산 됩니다.When the pass is displayed on the lock-screen, a fence is calculated so that when the user leaves the area the pass is hidden from the lock-screen. 악용을 방지 하기 위해 반지름이 패스 스타일에 연결 됩니다.The radius is tied to pass style to prevent abuse.

날짜 및 시간Date and Time

한 번에 하나의 날짜/시간만 지정할 수 있습니다.Only one date/time can be specified in a Pass. 날짜 및 시간은 보드 전달 및 이벤트 티켓에 대 한 잠금 화면 미리 알림을 트리거하는 데 유용 합니다.The date and time is useful for triggering lock-screen reminders for boarding passes and event tickets.

푸시 또는 PassKit API를 통해 업데이트할 수 있으므로 다중 사용 티켓 (예: 극장식 또는 스포츠에 대 한 시즌 티켓)에서 날짜/시간을 업데이트할 수 있습니다.Can be updated via push or via PassKit API, so that the date/time could be updated in the case of a multiple-use ticket (such as a season ticket to a theatre or sporting complex).

지역화Localization

패스를 여러 언어로 변환 하는 것은 iOS 응용 프로그램을 지역화 하는 것과 비슷합니다. .lproj 확장을 사용 하 여 언어별 디렉터리를 만들고 지역화 된 요소를 내부에 저장 합니다.Translating a pass into multiple languages is similar to localizing an iOS application – create language specific directories with the .lproj extension and place the localized elements inside. 텍스트 번역은 pass.strings 파일에 입력 해야 하는 반면, 지역화 된 이미지의 이름은 Pass root에서 대체 하는 이미지와 같아야 합니다.Text translations should be entered into a pass.strings file, while localized images should have the same name as the image they replace in the Pass root.

보안Security

패스는 iOS 프로 비전 포털에서 생성 하는 개인 인증서를 사용 하 여 서명 됩니다.Passes are signed with a private certificate that you generate in the iOS Provisioning Portal. 패스에 서명 하는 단계는 다음과 같습니다.The steps to sign the pass are:

  1. Pass 디렉터리의 각 파일에 대 한 SHA1 해시를 계산 합니다. 또는 manifest.json signature 파일은 포함 하지 마세요 .이 단계에서는 존재 하지 않습니다.Calculate a SHA1 hash for each file in the pass directory (do not include the manifest.json or signature file, neither of which should exist at this stage anyway).
  2. 해시 manifest.json 를 사용 하 여 각 파일 이름의 JSON 키/값 목록으로 작성 합니다.Write manifest.json as a JSON key/value list of each filename with its hash.
  3. 인증서를 사용 하 여 manifest.json 파일에 서명 하 고 결과를 라는 signature 파일에 기록 합니다.Use the certificate to sign the manifest.json file and write the result to a file called signature .
  4. 모든 파일을 압축 하 고 결과 파일에 파일 .pkpass 확장명을 제공 합니다.ZIP the everything up and give the resulting file a .pkpass file extension.

Pass에 서명 하는 데 개인 키가 필요 하므로이 프로세스는 사용자가 제어 하는 보안 서버 에서만 수행 해야 합니다.Because your private key is required to sign the pass, this process should only be done on a secure server that you control. 응용 프로그램에서 패스를 시도 하 고 생성 하기 위해 키를 배포 하지 마십시오.DO NOT distribute your keys to try and generate passes in an application.

구성 및 설정Configuration and Setup

이 섹션에서는 프로 비전 세부 정보를 설정 하 고 첫 번째 단계를 만드는 데 도움이 되는 지침을 제공 합니다.This section contains instructions to help setup your provisioning details and create your first pass.

PassKit 프로 비전Provisioning PassKit

패스를 앱 스토어에 입력 하려면 개발자 계정에 연결 해야 합니다.In order for a pass to enter the App Store, it must be linked to a developer account. 이렇게 하려면 다음 두 단계가 필요 합니다.This requires two steps:

  1. Pass는 패스 형식 ID 라고 하는 고유 식별자를 사용 하 여 등록 해야 합니다.The pass must be registered using a unique identifier, called the Pass Type ID.
  2. 개발자의 디지털 서명으로 pass에 서명 하려면 유효한 인증서를 생성 해야 합니다.A valid Certificate must be generated to sign the pass with the developer's digital signature.

패스 유형 ID를 만들려면 다음을 수행 합니다.To create a Pass Type ID do the following.

패스 유형 ID 만들기Create a Pass Type ID

첫 번째 단계는 지원 되는 각각의 서로 다른 유형의 패스에 대해 패스 유형 ID를 설정 하는 것입니다.The first step is to set up a Pass Type ID for each different type of pass to be supported. 패스 ID (또는 패스 유형 식별자)는 패스에 대 한 고유 식별자를 만듭니다.The Pass ID (or Pass Type identifier) creates a unique identifier for the Pass. 이 ID를 사용 하 여 인증서를 사용 하 여 pass를 개발자 계정과 연결 합니다.We will use this ID to link the pass with your developer account using a Certificate.

  1. IOS 프로 비전 포털의 인증서, 식별자 및 프로필 섹션에서 식별자 로 이동 하 여 Pass 유형 id 를 선택 합니다.In the Certificates, Identifiers, and Profiles section of the iOS Provisioning Portal, navigate to Identifiers and select Pass Type IDs . 그런 다음 단추 + 를 선택 하 여 새 패스 유형을 만듭니다. Then select the + button to create a new pass type:

  2. 패스에 대 한 설명 (이름) 및 식별자 (고유 문자열)를 제공 합니다.Provide a Description (name) and Identifier (unique string) for the Pass. 모든 패스 형식 id는이 예제에서 다음을 사용 pass. pass.com.xamarin.coupon.banana 하는 문자열로 시작 해야 합니다. Note that all Pass Type IDs must begin with the string pass. In this example we use pass.com.xamarin.coupon.banana :

  3. 등록 단추를 눌러 패스 ID를 확인 합니다.Confirm the Pass ID by pressing the Register button.

인증서 생성Generate A Certificate

이 패스 유형 ID에 대 한 새 인증서를 만들려면 다음을 수행 합니다.To create a new Certificate for this Pass Type ID, do the following:

  1. 목록에서 새로 만든 패스 ID를 선택 하 고 편집 을 클릭 합니다. Select the newly created Pass ID from the list, and click Edit :

    그런 다음 인증서 만들기 ...를 선택 합니다.Then, select Create Certificate… ::

  2. 단계에 따라 CSR (인증서 서명 요청)을 만듭니다.Follow the steps to create a Certificate Signing Request (CSR).

  3. 개발자 포털에서 계속 단추를 누르고 CSR을 업로드 하 여 인증서를 생성 합니다.Press the Continue button on the developer portal and upload the CSR to generate your certificate.

  4. 인증서를 다운로드 하 고 키를 두 번 클릭 하 여 키 집합에 설치 합니다.Download the certificate and double-click on it to install it in your keychain.

이제이 패스 유형 ID에 대 한 인증서를 만들었으므로 다음 섹션에서는 패스를 수동으로 빌드하는 방법을 설명 합니다.Now that we have created a certificate for this Pass Type ID, the next section describes how to build a pass manually.

전자 지갑 프로 비전에 대 한 자세한 내용은 기능 사용 가이드를 참조 하세요.For more information on Provisioning for Wallet, refer to the Working with Capabilities guide.

수동으로 패스 만들기Create a Pass Manually

이제 Pass 형식을 만들었으므로 시뮬레이터 또는 장치에서 테스트 하는 패스를 수동으로 만들 수 있습니다.Now that we’ve created the Pass Type we can manually craft a pass to test on the simulator or a device. 패스를 만드는 단계는 다음과 같습니다.The steps to create a pass are:

  • 패스 파일을 포함할 디렉터리를 만듭니다.Create a directory to contain the pass files.
  • 필요한 모든 데이터가 포함 된 pass 파일을 만듭니다.Create a pass.json file that contains all the required data.
  • 필요한 경우 폴더에 이미지를 포함 합니다.Include images in folder (if required).
  • 폴더의 모든 파일에 대 한 SHA1 해시를 계산 하 고,. n a s. json에 씁니다.Calculate SHA1 hashes for every file in the folder, and write to manifest.json.
  • 다운로드 한 인증서. p12 파일을 사용 하 여 매니페스트를 서명 합니다.Sign manifest.json with the downloaded certificate .p12 file.
  • 디렉터리의 내용을 압축 하 고. pkpass 확장으로 이름을 바꿉니다.ZIP the directory’s contents and rename with .pkpass extension.

이 문서의 샘플 코드 에는 패스를 생성 하는 데 사용할 수 있는 몇 가지 소스 파일이 있습니다.There are some source files in the sample code for this article that can be used to generate a pass. Createapassmanually 디렉터리 CouponBanana.raw 의 디렉터리에 있는 파일을 사용 합니다.Use the files in the CouponBanana.raw directory of the CreateAPassManually directory. 다음 파일이 표시 됩니다.The following files are present:

Pass를 열고 JSON을 편집 합니다.Open pass.json and edit the JSON. Apple Developer 계정에 일치 하려면 passTypeIdentifier 적어도 teamIdentifer 및를 업데이트 해야 합니다.You must at least update the passTypeIdentifier and teamIdentifer to match your Apple Developer account.

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

그런 다음 각 파일에 대 한 해시를 계산 하 여 manifest.json 파일을 만들어야 합니다.You must then calculate the hashes for each file and create the manifest.json file. 완료 되 면 다음과 같이 표시 됩니다.It will look something like this when you’re done:

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

그런 다음이 패스 형식 ID에 대해 생성 된 인증서 (.p12 파일)를 사용 하 여이 파일에 대 한 서명을 생성 해야 합니다.Next a signature must be generated for this file using the certificate (.p12 file) that was generated for this Pass Type ID.

Mac에서 서명Signing On a Mac

Apple 다운로드 사이트에서 전자 지갑 초기값 지원 자료 를 다운로드 하세요.Download the Wallet Seed Support Materials from the Apple Downloads site. signpass 도구를 사용 하 여 폴더를 pass로 전환 합니다 .이는 SHA1 해시를 계산 하 고 출력을 pkpass 파일에 압축 합니다.Use the signpass tool to turn your folder into a pass (this will also calculate the SHA1 hashes and ZIP the output into a .pkpass file).

테스트Testing

이러한 도구의 출력을 검토 하 고 (파일 이름을 .zip으로 설정 하 여 여는 manifest.json 경우) 다음 파일이 표시 됩니다 (및 signature 파일 추가).If you were to examine the output of these tools (by setting the filename to .zip and then opening it), you would see the following files (note the addition of the manifest.json and signature files):

서명 된 후 파일의 이름을 바꾸고 (예:Once you have signed, ZIPped and renamed the file (eg. to BananaCoupon.pkpass)를 시뮬레이터로 끌어서 테스트 하거나 실제 장치에서 검색할 수 있도록 자신에 게 전자 메일로 보낼 수 있습니다.to BananaCoupon.pkpass) you can drag it into the simulator to test, or email it to yourself to retrieve on a real device. 다음과 같이 pass를 추가 하는 화면이 표시 됩니다.You should see a screen to Add the pass, like this:

일반적으로이 프로세스는 서버에서 자동으로 수행 되지만, 수동 패스 생성은 백 엔드 서버를 지원 하지 않는 쿠폰만 생성 하는 소규모 기업을 위한 옵션 일 수 있습니다.Normally that process would be automated on a server, however manual pass creation might be an option for small businesses that are only creating coupons that do not require the support of a back-end server.

WalletWallet

PassKit 에코 시스템의 핵심이 되는 작은 부분입니다.Wallet is the central piece of the PassKit ecosystem. 이 스크린샷에서는 빈 전자 지갑 및 패스 목록과 개별 패스가 어떻게 표시 되는지 보여 줍니다.This screenshot shows the empty Wallet, and how the pass list and individual passes look:

작은 기능에는 다음이 포함 됩니다.Features of Wallet include:

  • 이 유일한 장소는 검색을 위해 바코드를 사용 하 여 렌더링 됩니다.It is the only place that passes are rendered with their barcode for scanning.
  • 사용자가 업데이트에 대 한 설정을 변경할 수 있습니다.User can change the settings for updates. 사용 하도록 설정 하면 푸시 알림이 Pass의 데이터에 대 한 업데이트를 트리거할 수 있습니다.If enabled, push notifications can trigger updates to the data in the Pass.
  • 사용자가 잠금 화면 통합을 사용 하거나 사용 하지 않도록 설정할 수 있습니다.User can enable or disable lock-screen integration. 사용 하도록 설정 하면 패스에 포함 된 관련 시간 및 위치 데이터에 따라 패스가 잠금 화면에 자동으로 나타날 수 있습니다.If enabled, this allows the pass to automatically appear on their lock screen, based on relevant time and location data embedded in the pass.
  • 패스 JSON에서 웹 서버 URL이 제공 된 경우 패스의 반대 쪽에서 끌어오기-새로 고침을 지원 합니다.The reverse side of the pass supports pull-to-refresh, if a web-server-URL is supplied in the pass JSON.
  • 앱 ID가 pass JSON에 제공 된 경우에는 도우미 앱을 열거나 다운로드할 수 있습니다.Companion Apps can be opened (or downloaded) if the app’s ID is supplied in the pass JSON.
  • 귀여운 단편화 animation을 사용 하 여 패스를 삭제할 수 있습니다.Passes can be deleted (with a cute shredding animation).

작은에 게 패스 추가Adding Passes into Wallet

패스는 다음과 같은 방법으로 작은에 추가할 수 있습니다.Passes can be added to Wallet in the following ways:

  • 을 직접 조작 하지 않는 앱-패스 파일을 로드 하 고 사용자에 게 작은 사용자에 게 추가 하는 옵션을 제공 합니다.Conduit Apps – These do not manipulate passes directly, they simply load pass files and present the user with the option of adding them to Wallet.

  • 동반 앱 -공급자가 전달 된 앱을 배포 하 고 탐색 하거나 편집 하기 위한 추가 기능을 제공 합니다.Companion Apps – These are written by providers to distribute passes and offer additional functionality to browse or edit them. Xamarin.ios 응용 프로그램은 PassKit API에 대 한 완전 한 액세스 권한을 가지 며 패스를 만들고 조작 합니다.Xamarin.iOS applications have complete access to the PassKit API to create and manipulate passes. 그런 다음를 PKAddPassesViewController사용 하 여 작은에 게 패스를 추가할 수 있습니다.Passes can then be added to Wallet using the PKAddPassesViewController. 이 프로세스는이 문서의 자매 응용 프로그램 섹션에서 자세히 설명 합니다.This process is described in more detail in the Companion Applications section of this document.

응용 프로그램 통로Conduit Applications

컨 트 응용 프로그램은 사용자를 대신 하 여 패스를 받을 수 있는 중간 앱 이며, 해당 콘텐츠 형식을 인식 하 고 전자 지갑에 추가할 기능을 제공 하도록 프로그래밍 해야 합니다.Conduit applications are intermediate apps that might receive passes on behalf of a user, and should be programmed to recognize their content-type and provide functionality to add to the Wallet. 응용 프로그램의 예는 다음과 같습니다.Examples of conduit apps include:

  • Mail – 첨부 파일을 패스로 인식 합니다.Mail – Recognizes attachment as a Pass.
  • Safari – 패스 URL 링크를 클릭 하면 pass Content-type을 인식 합니다.Safari – Recognizes the pass Content-Type when a pass URL link is clicked.
  • 기타 사용자 지정 앱 -첨부 파일 또는 오픈 링크 (소셜 미디어 클라이언트, 메일 읽기 권한자 등)를 수신 하는 앱입니다.Other custom apps – Any app that receive attachments or open links (social media clients, mail readers, etc).

이 스크린샷은 iOS 6의 메일이 메시지 첨부 파일을 인식 하 고 (작업 시) 전자 메일을 통해 전자 메일을 전자 메일추가 하는 방법을 보여 줍니다.This screenshot shows how Mail in iOS 6 recognizes a pass attachment and (when touched) offers to Add it to Wallet.

패스에 대 한 통로가 될 수 있는 앱을 빌드하는 경우 다음에서 인식할 수 있습니다.If you are building an app that could be a conduit for passes, they can be recognized by:

  • 파일 확장명 -pkpassFile extension - .pkpass
  • MIME 형식 -application/vnd. apple pkpassMIME Type - application/vnd.apple.pkpass
  • UTI – .com. pkpassUTI – com.apple.pkpass

통로 응용 프로그램의 기본 작업은 pass 파일을 검색 하 고 PassKit PKAddPassesViewController 를 호출 하 여 사용자에 게 해당 사용자에 게 pass를 추가할 수 있는 옵션을 제공 하는 것입니다.The basic operation of a conduit application is to retrieve the pass file and call PassKit’s PKAddPassesViewController to give the user the option to add the pass to their Wallet. 이 뷰 컨트롤러의 구현은 다음에 나오는 응용 프로그램의 섹션에서 설명 합니다.The implementation of this view controller is covered in the next section on Companion Applications.

보조 응용 프로그램에서 수행 하는 것과 동일한 방식으로 특정 패스 유형 ID에 대해 통로 응용 프로그램을 프로 비전 할 필요가 없습니다.Conduit Applications do not need to be provisioned for a specific pass Type ID in the same way that Companion Applications do.

도우미 응용 프로그램Companion Applications

동반 응용 프로그램은 Pass 만들기, Pass와 관련 된 정보 업데이트 및 기타 응용 프로그램과 관련 된 pass 관리를 포함 하 여 패스 작업을 위한 추가 기능을 제공 합니다.A companion application provides additional functionality for working with passes, including creating a Pass, updating information associated with a Pass and otherwise managing passes associated with the application.

도우미 응용 프로그램은 작은 기능을 복제 하려고 해서는 안 됩니다.Companion applications should not attempt to duplicate the features of Wallet. 검색에 대 한 패스를 표시 하기 위한 것은 아닙니다.They are not intended to display passes for scanning.

이 섹션의 나머지 부분에서는 PassKit와 상호 작용 하는 기본 자매 앱을 빌드하는 방법을 설명 합니다.This remainder of this section describes how to build a basic Companion App that interacts with PassKit.

프로비전Provisioning

전자 지갑은 매장 기술 이므로 응용 프로그램을 별도로 프로 비전 해야 하며 팀 프로 비전 프로필 또는 와일드 카드 앱 ID를 사용할 수 없습니다.Because Wallet is a store technology, the application needs to be provisioned separately and cannot use Team Provisioning Profile or Wildcard App ID. 기능 사용 가이드를 참조 하 여 전자 지갑 응용 프로그램에 대 한 고유한 앱 ID 및 프로 비전 프로필을 만듭니다.Refer to the Working with Capabilities guide to create a unique App ID and Provisioning Profile for the Wallet application.

권리가Entitlements

Info.plist 파일은 모든 최신 xamarin.ios 프로젝트에 포함 되어야 합니다.The Entitlements.plist file should be included in all recent Xamarin.iOS project. 새 info.plist 파일을 추가 하려면 자격 사용 가이드의 단계를 따르세요.To add a new Entitlements.plist file, follow the steps in the Working with Entitlements guide.

자격을 설정 하려면 다음을 수행 합니다.To set entitlements do the following:

Solution Pad에서 info.plist 파일을 두 번 클릭 하 여 info.plist 편집기를 엽니다.Double-click on the Entitlements.plist file in the Solution Pad to open the Entitlements.plist editor:

전자 지갑 섹션에서 전자 지갑 사용 옵션을 선택 합니다.Under the Wallet section, select the Enable Wallet option

기본 옵션은 앱에서 모든 패스 유형을 허용 하는 것입니다.The default option is for your app to allow all pass types. 그러나 앱을 제한 하 고 팀 패스 유형의 하위 집합만 허용할 수 있습니다.However, it is possible to restrict your app and only allow a subset of team pass types. 이를 사용 하도록 설정 하려면 팀 패스 유형의 하위 집합 허용 을 선택 하 고 허용할 하위 집합의 패스 유형 식별자를 입력 합니다.To enable this select the Allow subset of team pass types and enter the pass type identifier of the subset that you wish to allow.

디버깅Debugging

응용 프로그램을 배포 하는 데 문제가 있는 경우 올바른 프로 비전 프로필 을 사용 하 고 Entitlements.plist 있는지, iPhone 번들 서명 옵션에서 사용자 지정 자격 파일로 선택 되어 있는지 확인 합니다.If you have problems deploying your application, check that you are using the correct Provisioning Profile and that the Entitlements.plist is selected as the Custom entitlements file in the iPhone Bundle Signing options.

배포할 때이 오류가 발생 하는 경우:If you experience this error when deploying:

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

그런 다음 자격 배열이 잘못 되었거나 프로 비전 프로필과일치 하지 않습니다. pass-type-identifiersthen the pass-type-identifiers entitlements array is incorrect (or does not match the Provisioning Profile). 패스 유형 Id와 팀 ID가 올바른지 확인 합니다.Verify the Pass Type IDs and your Team ID are correct.

클래스Classes

앱에서 액세스 하는 데 사용할 수 있는 PassKit 클래스는 다음과 같습니다.The following PassKit classes are available for apps to access passes:

  • Pkpass – 패스의 인스턴스입니다.PKPass – An instance of a Pass.
  • PKPassLibrary – 장치에서 패스에 액세스할 수 있는 API를 제공 합니다.PKPassLibrary – Provides the API to access the passes on the device.
  • PKAddPassesViewController – 사용자가 전자 지갑에 저장할 수 있도록 pass를 표시 하는 데 사용 됩니다.PKAddPassesViewController – Used to display a pass for the user to save in their Wallet.
  • PKAddPassesViewControllerDelegate – xamarin.ios 개발자PKAddPassesViewControllerDelegate – Xamarin.iOS developers

예제Example

이 문서에 대 한 샘플 코드 의 PassLibrary 프로젝트를 참조 하세요.Refer to the PassLibrary project in the sample code for this article. 다음은 작은 공격자 응용 프로그램에 필요한 다음과 같은 일반적인 함수를 보여 줍니다.It demonstrates the following common functions that would be required in a Wallet Companion Application:

전자 지갑 사용 가능 여부 확인Check that Wallet is Available

IPad에서는 전자 지갑를 사용할 수 없으므로 응용 프로그램에서 PassKit 기능에 액세스 하기 전에 확인 해야 합니다.Wallet is not available on the iPad, so applications should check before attempting to access PassKit features.

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

패스 라이브러리 인스턴스 만들기Creating a Pass Library Instance

PassKit 라이브러리는 단일 항목이 아닌 응용 프로그램에서 PassKit API에 액세스 하는 및 인스턴스를 만들고 저장 해야 합니다.The PassKit library is not a singleton, applications should create and store and instance to access the PassKit API.

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

패스 목록 가져오기Get a List of Passes

응용 프로그램은 라이브러리에서 패스 목록을 요청할 수 있습니다.Applications can request a list of passes from the library. 이 목록은 PassKit에 의해 자동으로 필터링 되므로, 사용자의 자격에 나열 된 팀 ID로 생성 된 패스만 볼 수 있습니다.This list is automatically filtered by PassKit, so that you can only see passes that have been created with your Team ID and which are listed in your Entitlements.

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

시뮬레이터는 반환 되는 패스 목록을 필터링 하지 않으므로이 메서드는 항상 실제 장치에서 테스트 되어야 합니다.Note that the simulator does not filter the list of passes returned, so this method should always be tested on real devices. 이 목록은 UITableView에 표시 될 수 있습니다.This list can be displayed in a UITableView. 샘플 앱 은 두 개의 쿠폰이 추가 된 후 다음과 같이 표시 됩니다.The sample app looks like this after two coupons have been added:

패스 표시Displaying Passes

제한 된 정보 집합은 동반 앱 내에서 패스를 렌더링 하는 데 사용할 수 있습니다.A limited set of information is available for rendering of passes within companion apps.

예제 코드와 같이 일련의이 표준 속성을 선택 하 여 패스 목록을 표시 합니다.Choose from this set of standard properties to display lists of passes, as the example code does.

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

이 문자열은 샘플에서 경고로 표시 됩니다.This string is shown as an alert in the sample:

또한 메서드를 LocalizedValueForFieldKey() 사용 하 여 사용자가 디자인 한 패스의 필드에서 데이터를 검색할 수 있습니다 (어떤 필드가 표시 되어야 함).You can also use the LocalizedValueForFieldKey() method to retrieve data from fields in the passes you have designed (since you will know what fields should be present). 예제 코드는이를 표시 하지 않습니다.The example code does not show this.

파일에서 패스 로드Loading a Pass from a File

사용자의 권한이 있는 전자 지갑에는 한 번만 추가 될 수 있으므로 사용자가 결정할 수 있도록 보기 컨트롤러가 표시 되어야 합니다.Because a pass can only be added to Wallet with the user’s permission, a view controller must be presented to let them decide. 이 코드는 예제에서 추가 단추를 사용 하 여 앱에 포함 된 미리 작성 된 패스를 로드 합니다 .이 코드는 사용자가 서명한 것으로 바꾸어야 합니다.This code is used in the Add button in the example, to load a pre-built pass that is embedded in the app (you should replace this with one that you have signed):

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);

이 패스는 추가취소 옵션과 함께 제공 됩니다.The pass is presented with Add and Cancel options:

기존 패스 바꾸기Replace an Existing Pass

기존 패스를 교체 하는 경우 사용자의 권한이 필요 하지 않지만 패스가 아직 없는 경우 실패 합니다.Replacing an existing pass does not require the user’s permission, however it will fail if the pass does not already exist.

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

패스 편집Editing a Pass

PKPass는 변경할 수 없으므로 코드에서 패스 개체를 업데이트할 수 없습니다.PKPass isn’t mutable, so you cannot update pass objects in your code. Pass의 데이터를 변경 하려면 응용 프로그램에서 통과 기록을 유지 하 고 응용 프로그램에서 다운로드할 수 있는 업데이트 된 값을 사용 하 여 새 패스 파일을 생성할 수 있는 웹 서버에 대 한 액세스 권한이 있어야 합니다.To alter the data in a pass an application must have access to a web server that can keep a record of passes and generate a new pass file with updated values which the application can download.

통과는 개인 및 보안을 유지 해야 하는 인증서로 서명 해야 하므로 서버에서 패스 파일 만들기를 수행 해야 합니다.Pass file creation must be done on a server because passes must be signed with a certificate that must be kept private and secure.

업데이트 된 패스 파일이 생성 되 면 메서드를 Replace 사용 하 여 장치의 이전 데이터를 덮어씁니다.Once an updated pass file has been generated, use the Replace method to overwrite the old data on the device.

검색에 대 한 Pass 표시Display a Pass for scanning

앞에서 설명한 것 처럼, 작은 숫자만 검색에 대 한 통과를 표시할 수 있습니다.As previously noted, only Wallet can display a pass for scanning. 다음과 같이 메서드를 OpenUrl 사용 하 여 패스를 표시할 수 있습니다.A Pass can be displayed using the OpenUrl method as shown:

UIApplication.SharedApplication.OpenUrl (p.PassUrl);

변경 알림 받기Receiving Notifications Of Changes

응용 프로그램은를 PKPassLibraryDidChangeNotification사용 하 여 패스 라이브러리에 적용 되는 변경 내용을 수신할 수 있습니다.Applications can listen for changes being made to the Pass Library using the PKPassLibraryDidChangeNotification. 백그라운드에서 업데이트를 트리거하는 알림으로 인해 변경 될 수 있으므로 앱에서 수신 대기 하는 것이 좋습니다.Changes could be caused by notifications triggering updates in the background, so it is good practice to listen for them in your app.

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가 singleton이 아니기 때문에 알림에 등록할 때 라이브러리 인스턴스를 전달 하는 것이 중요 합니다.It is important to pass a library instance when registering for the notification because PKPassLibrary is not a singleton.

서버 처리Server Processing

PassKit을 지원 하기 위해 서버 응용 프로그램을 빌드하는 방법에 대 한 자세한 내용은이 소개 문서의 범위를 벗어나는 것입니다.A detailed discussion of building a server application to support PassKit is beyond the scope of this introductory article.

Dotnet passbook 오픈 소스 C# 서버 쪽 코드를 참조 하세요.See dotnet-passbook open source C# server-side code.

푸시 알림Push Notifications

업데이트 전달에 푸시 알림을 사용 하는 방법에 대 한 자세한 내용은이 소개 문서의 범위를 벗어나는 것입니다.A detailed discussion of using push notifications to update passes is beyond the scope of this introductory article.

업데이트가 필요한 경우에는 전자 지갑에서 웹 요청에 응답 하기 위해 Apple에서 정의한 REST와 유사한 API를 구현 해야 합니다.You would be required to implement the REST-like API defined by Apple to respond to web requests from Wallet when updates are required.

자세한 내용은 Apple의 Pass 업데이트 가이드를 참조 하세요.See Apple's Updating a Pass guide for more information.

요약Summary

이 문서에서는 PassKit를 소개 했으며 전체 PassKit 솔루션에 대해 구현 해야 하는 다양 한 부분을 설명 하 고 설명 하는 몇 가지 이유를 설명 했습니다.This article introduced PassKit, outlined some of the reasons why it is useful and described the different parts that must be implemented for a full PassKit solution. 통과를 만들도록 Apple 개발자 계정을 구성 하는 데 필요한 단계, 수동으로 패스를 만드는 프로세스 및 Xamarin.ios 응용 프로그램에서 PassKit Api에 액세스 하는 방법을 설명 했습니다.It described the steps required to configure your Apple Developer account to create passes, the process to make a pass manually and also how to access the PassKit APIs from a Xamarin.iOS application.