Бөлісу құралы:


PassKit в Xamarin.iOS

Приложение "Кошелек iOS" позволяет пользователям хранить цифровые передачи на своих устройствах. Эти проходы создаются торговцами и отправляются клиенту по электронной почте, URL-адресам или через собственное приложение iOS продавца. Эти проходы могут представлять различные вещи, от билетов кино до карт лояльности до до добора проходов. Платформа PassKit позволяет разработчикам взаимодействовать с ними программным способом.

В этом документе представлено приложение Wallet и использование API PassKit с Xamarin.iOS.

Кошелек хранит и упорядочивает все проходы по телефону

Требования

Для функций PassKit, описанных в этом документе, требуется iOS 6 и Xcode 4.5, а также Xamarin.iOS 6.0.

Введение

Основная проблема, которая решает PassKit, — это распределение и управление штрихкодами. Ниже приведены некоторые реальные примеры использования штрихкодов:

  • Покупка билетов в интернете — клиенты обычно отправляются по электронной почте штрихкод, представляющий их билеты. Этот штрихкод печатается и выводится в кинотеатр, который будет сканирован для записи.
  • Карты лояльности — клиенты несут ряд различных карточек, относящихся к магазину, в их кошельке или кошельке, для отображения и сканирования при покупке товаров.
  • Купоны — купоны распределяются по электронной почте, как печатные веб-страницы, через почтовые ящики и как штрихкоды в газетах и журналах. Клиенты приносят их в магазин для сканирования, получения товаров, услуг или скидок в ответ.
  • Проходы по посадке — как и покупка билета на фильм.

PassKit предлагает альтернативу для каждого из следующих сценариев:

  • Билеты на фильм — после покупки клиент добавляет билет на событие (по электронной почте или по ссылке веб-сайта). По мере того как время для фильма приближается, проход автоматически будет отображаться на экране блокировки в качестве напоминания, и при поступлении в кино проход легко извлекается и отображается в Кошельке для сканирования.
  • Карты лояльности — вместо того, чтобы (или в дополнение) предоставлять физическую карту, магазины могут выдавать (по электронной почте или после входа на веб-сайт) передачу карточки магазина. Магазин может предоставлять дополнительные функции, такие как обновление баланса учетной записи через push-уведомления, а также использование служб геолокации, которые могут автоматически отображаться на экране блокировки, когда клиент находится рядом с расположением магазина.
  • Купоны — купоны можно легко создать с уникальными характеристиками, чтобы помочь в отслеживании, а также распространяться по электронной почте или по ссылкам веб-сайта. Скачанные купоны могут автоматически отображаться на экране блокировки при приближении пользователя к определенному расположению и (или) по заданной дате (например, при приближении даты окончания срока действия). Так как купоны хранятся на телефоне пользователя, они всегда удобны и не находятся в неправильном месте. Купоны могут поощрять клиентов скачать приложения-компаньоны, так как ссылки App Store могут быть включены в Pass, увеличивая взаимодействие с клиентом.
  • Прохождение доски — после онлайн-регистрации клиент получит свой проход по электронной почте или ссылке. Приложение-компаньон, предоставляемое поставщиком транспорта, может включать процесс регистрации, а также позволить клиенту выполнять дополнительные функции, такие как выбор места или еды. Поставщик транспорта может использовать push-уведомления для обновления прохода, если транспорт отложен или отменен. По мере того как время посадки приближается к проходу, появится на экране блокировки как напоминание и обеспечить быстрый доступ к Pass.

В своей основе PassKit предоставляет простой и удобный способ хранения и отображения штрихкодов на устройстве iOS. Благодаря дополнительной интеграции с блокировкой и расположением push-уведомления и приложение-компаньон интегрируются, она предоставляет основу для очень сложных продаж, билетов и служб выставления счетов.

Экосистема PassKit

PassKit — это не просто API в CocoaTouch, а это часть более крупной экосистемы приложений, данных и служб, которые упрощают безопасный общий доступ и управление штрихкодами и другими данными. На этой высокоуровневой схеме показаны различные сущности, которые могут быть вовлечены в создание и использование проходов:

На этой схеме высокого уровня показаны сущности, участвующие в создании и использовании проходов

Каждая часть экосистемы имеет четко определенную роль:

  • Wallet — встроенное приложение iOS Apple, которое хранит и отображает проходы. Это единственное место, которое передается для использования в реальном мире (т. е. штрихкод отображается вместе со всеми локализованными данными в проходе).
  • Приложения-компаньоны — приложения iOS 6, созданные с помощью поставщиков передачи, чтобы расширить функциональные возможности передачи, например добавление значения в карточку магазина, изменение места на борту или другой бизнес-функции. Приложения-компаньоны не требуются для использования передачи.
  • Сервер — безопасный сервер, на котором можно создать и подписаться для распространения. Приложение-компаньон может подключиться к серверу, чтобы создать новые проходы или запросить обновления для существующих проходов. При желании вы можете реализовать API веб-службы, который будет вызываться кошельком для обновления проходов.
  • Серверы APNS — ваш сервер имеет возможность уведомлять кошелек об обновлениях на заданном устройстве с помощью APNS. Отправьте уведомление в Кошелек, который затем обратитесь к серверу за подробными сведениями об изменении. Приложения-компаньоны не должны реализовывать APNS для этой функции (они могут прослушивать ).PKPassLibraryDidChangeNotification
  • Приложения conduit — приложения, которые не напрямую управляют проходами (например, приложения-компаньоны), но которые могут улучшить их служебную программу, распознав проходы и позволяя им добавляться в Кошелек. Почтовые клиенты, браузеры социальных сетей и другие приложения агрегирования данных могут столкнуться со всеми вложениями или ссылками для передачи.

Вся экосистема выглядит сложно, поэтому стоит отметить, что некоторые компоненты являются необязательными и гораздо проще реализации PassKit возможны.

Что такое pass?

Проход — это коллекция данных, представляющих билет, купон или карточку. Он может быть предназначен для одного использования отдельным пользователем (и поэтому содержит сведения, такие как номер рейса и выделение места) или может быть несколько маркеров использования, которые могут быть совместно использоваться любым количеством пользователей (например, купоном скидки). Подробное описание доступно в документе Apple About Pass Files .

Типы

В настоящее время пять поддерживаемых типов, которые можно отличить в приложении Wallet по макету и верхнему краю прохода:

  • Билет на событие — небольшой полуциркулярный вырез.
  • Проход на борту — ночи на стороне, значок конкретного транспорта можно указать (например, автобус, поезд, самолет).
  • Сохранить карту — округленную верхнюю, например кредитную или дебетовую карту.
  • Купон — перфорированный вдоль верхней части.
  • Универсальный — тот же, что и карточка магазина, округленная сверху.

На этом снимке экрана показаны пять типов проходов (в порядке: купон, универсальный, карточка магазина, билет на посадку и событие):

На этом снимке экрана показаны пять типов проходов

Структура файла

Секретный файл — это ZIP-архив с расширением PKpass , содержащий некоторые файлы JSON (обязательно), различные файлы изображений (необязательно), а также локализованные строки (необязательно).

  • pass.json — обязательно. Содержит все сведения для прохода.
  • manifest.json — обязательно. Содержит хэши SHA1 для каждого файла в проходе, кроме файла подписи и этого файла (manifest.json).
  • сигнатура — обязательный. Создается путем подписывания manifest.json файла с помощью сертификата, созданного на портале подготовки iOS.
  • logo.png — необязательно.
  • background.png — необязательно.
  • icon.png — необязательно.
  • Локализованные файлы строк — необязательно.

Структура каталога секретного файла показана ниже (это содержимое ZIP-архива):

Структура каталога секретного файла показана здесь

pass.json

Формат JSON — это формат, так как на сервере обычно создаются проходы. Это означает, что код создания не зависит от платформы на сервере. Три ключевых фрагмента информации в каждом проходе:

  • teamIdentifier — эти ссылки передаются в учетную запись App Store. Это значение отображается на портале подготовки iOS.
  • passTypeIdentifier — регистрация на портале подготовки для объединения передач (если вы создаете несколько типов). Например, кафе может создать тип передачи карты магазина, чтобы позволить своим клиентам получать кредиты лояльности, но и отдельный тип купона для создания и распространения купонов с скидкой. Этот же кафе может даже провести трансляции музыки и выдать билет на событие для тех.
  • serialNumber — уникальная строка в этой passTypeidentifier строке. Значение непрозрачно к кошельку, но важно для отслеживания определенных проходов при взаимодействии с сервером.

Существует большое количество других ключей 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. Apple утверждает, что 1D штрихкоды не подходит для сканирования на экране заднего экрана телефона.

Альтернативный текст, отображаемый под штрихкодом, необязателен— некоторые торговцы хотят иметь возможность читать или вводить текст вручную.

Кодировка ISO-8859-1 является наиболее распространенной, проверьте, какая кодировка используется системами сканирования, которые будут считывать ваши проходы.

Relevancy (экран блокировки)

Существует два типа данных, которые могут привести к отображению передачи на экране блокировки:

Местонахождение

До 10 расположений можно указать в pass, например, магазины, которые клиент часто посещает, или расположение кинотеатра или аэропорта. Клиент может задать эти расположения через приложение-компаньон или поставщик может определить их из данных об использовании (при сборе с разрешением клиента).

При отображении прохода на экране блокировки забор вычисляется таким образом, чтобы пользователь покидал область, которая скрыта с экрана блокировки. Радиус привязан к передаче стиля, чтобы предотвратить злоупотребление.

Дата и время

В pass можно указать только одну дату и время. Дата и время полезны для активации напоминаний на экране блокировки для прохождения доставок и билетов на события.

Можно обновить с помощью push-уведомлений или через API PassKit, чтобы дата и время могли быть обновлены в случае многопользования билета (например, билет на сезон в театр или спортивный комплекс).

Локализация

Преобразование передачи на несколько языков похоже на локализацию приложения iOS — создание каталогов для конкретного языка с .lproj расширением и размещение локализованных элементов внутри. Преобразования текста должны быть введены в pass.strings файл, а локализованные изображения должны иметь то же имя, что и изображение, которое они заменяют в корневом каталоге Pass.

Безопасность

Проходы подписаны с помощью закрытого сертификата, который создается на портале подготовки iOS. Ниже приведены действия по подписи прохождения:

  1. Вычислите хэш SHA1 для каждого файла в каталоге передачи (не включайте manifest.json или signature файл, ни из которых не должно существовать на этом этапе в любом случае).
  2. Запись manifest.json в виде списка ключей и значений JSON каждого имени файла с хэшем.
  3. Используйте сертификат для подписи manifest.json файла и записи результата в файл с именем signature .
  4. ЗАПАКУйте все и предоставьте результирующий файл .pkpass расширение.

Так как для подписи передачи требуется закрытый ключ, этот процесс должен выполняться только на защищенном сервере, который вы управляете. Не распространяйте ключи, чтобы попытаться создать передачи в приложении.

Настройка и установка

В этом разделе содержатся инструкции по настройке сведений о подготовке и создании первого прохода.

Подготовка PassKit

Чтобы передать в App Store, его необходимо связать с учетной записью разработчика. Для этого требуется два шага:

  1. Пароль должен быть зарегистрирован с помощью уникального идентификатора, называемого идентификатором типа pass.
  2. Чтобы подписать передачу с помощью цифровой подписи разработчика, необходимо создать действительный сертификат.

Чтобы создать идентификатор типа pass, сделайте следующее.

Создание идентификатора типа pass

Первым шагом является настройка идентификатора типа pass для каждого типа передачи, который будет поддерживаться. Идентификатор прохода (или идентификатор типа передачи) создает уникальный идентификатор для pass. Этот идентификатор будет использоваться для связывания передачи с учетной записью разработчика с помощью сертификата.

  1. В разделе "Сертификаты, идентификаторы и профили" портала подготовки iOS перейдите к идентификаторам и выберите идентификаторы типов передачи. Затем нажмите + кнопку, чтобы создать новый тип передачи: Создание нового типа передачи

  2. Укажите описание (имя) и идентификатор (уникальную строку) для pass. Обратите внимание, что все идентификаторы типа pass должны начинаться со строки pass. в этом примере, которую мы используем pass.com.xamarin.coupon.banana : Укажите описание и идентификатор

  3. Подтвердите идентификатор передачи, нажав кнопку "Регистрация ".

Создание сертификата

Чтобы создать сертификат для этого идентификатора типа pass, сделайте следующее:

  1. Выберите созданный идентификатор pass в списке и нажмите кнопку "Изменить ". Выберите новый идентификатор pass в списке

    Затем нажмите кнопку "Создать сертификат...

    Выберите

  2. Выполните действия, чтобы создать запрос на подпись сертификата (CSR).

  3. Нажмите кнопку "Продолжить" на портале разработчика и отправьте CSR, чтобы создать сертификат.

  4. Скачайте сертификат и дважды щелкните его, чтобы установить его в цепочке ключей.

Теперь, когда мы создали сертификат для этого идентификатора типа pass, в следующем разделе описывается, как создать проход вручную.

Дополнительные сведения о подготовке для кошелька см. в руководстве по работе с возможностями .

Создание прохода вручную

Теперь, когда мы создали тип pass, мы можем вручную создать передачу для тестирования на симуляторе или устройстве. Ниже приведены действия по созданию прохода.

  • Создайте каталог для хранения секретных файлов.
  • Создайте файл pass.json, содержащий все необходимые данные.
  • Включите изображения в папку (при необходимости).
  • Вычисление хэшей SHA1 для каждого файла в папке и запись в manifest.json.
  • Подписывание manifest.json с скачанным P12-файлом сертификата.
  • ZIP содержимое каталога и переименование с расширением PKPASS.

В примере кода для этой статьи есть некоторые исходные файлы, которые можно использовать для создания прохода. Используйте файлы в каталоге CouponBanana.raw каталога CreateAPassManually. Существуют следующие файлы:

Эти файлы присутствуют

Откройте pass.json и измените JSON. Необходимо обновить учетную запись разработчика Apple по крайней мере и обновить passTypeIdentifier teamIdentifer ее.

"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-файла), созданного для этого идентификатора типа pass.

Вход в Mac

Скачайте материалы поддержки кошелька с сайта Apple Downloads. signpass Используйте средство, чтобы превратить папку в проход (это также вычисляет хэши SHA1 и ZIP выходные данные в Pkpass-файл).

Тестирование

Если вы хотите проверить выходные данные этих средств (задав имя файла для .zip, а затем откройте его), вы увидите следующие файлы (обратите внимание на добавление manifest.json и signature файлы):

Изучение выходных данных этих средств

После подписания ZIPped и переименование файла (например, в BananaCoupon.pkpass) можно перетащить его в симулятор, чтобы протестировать или отправить сообщение электронной почты себе, чтобы получить на реальном устройстве. Вы увидите экран для добавления прохода, как показано ниже.

Добавление экрана передачи

Как правило, этот процесс будет автоматизирован на сервере, однако ручное создание передачи может быть вариантом для небольших предприятий, которые создают только купоны, которые не требуют поддержки серверного сервера.

Кошелек

Кошелек является центральным элементом экосистемы PassKit. На этом снимке экрана показан пустой кошелек, а также способ передачи списка и отдельных передач:

На этом снимке экрана показан пустой кошелек, а также способ передачи списка и отдельных проходов

К функциям кошелька относятся:

  • Это единственное место, которое проходит отрисовывается с помощью штрихкода для сканирования.
  • Пользователь может изменить параметры обновлений. Если он включен, push-уведомления могут активировать обновления данных в pass.
  • Пользователь может включить или отключить интеграцию с экраном блокировки. Если этот параметр включен, он позволяет автоматически отображаться на экране блокировки на основе соответствующих данных о времени и расположении, внедренных в проход.
  • Обратная сторона прохода поддерживает обновление по запросу, если URL-адрес веб-сервера предоставляется в сквозном формате JSON.
  • Приложения-компаньоны можно открыть (или скачать), если идентификатор приложения указан в сквозном формате JSON.
  • Проходы можно удалить (с милой анимацией измельчения).

Добавление проходов в кошелек

Проходы можно добавить в Кошелек следующим образом:

  • Приложения conduit — они не управляются напрямую, они просто загружают файлы и предоставляют пользователю возможность добавлять их в Кошелек.

  • Приложения-компаньоны — они написаны поставщиками для распространения проходов и предоставления дополнительных функций для просмотра или редактирования. Приложения Xamarin.iOS имеют полный доступ к API PassKit для создания и управления ими. Затем передачи можно добавить в Кошелек с помощью функции PKAddPassesViewController. Этот процесс подробно описан в разделе "Приложения-компаньоны " этого документа.

Приложения conduit

Приложения conduit — это промежуточные приложения, которые могут получать передачи от имени пользователя и должны быть запрограммированы для распознавания их типа контента и предоставления функций для добавления в кошелек. Примеры приложений conduit включают:

  • Почта — распознает вложение как проход.
  • Safari — распознает тип передаваемого контента при щелчке url-адреса.
  • Другие пользовательские приложения — любое приложение, которое получает вложения или открытые ссылки (клиенты социальных сетей, почтовые читатели и т. д.).

На этом снимке экрана показано, как почта в iOS 6 распознает вложения и (при касании) предлагает добавить его в кошелек.

На снимке экрана показано, как почта в iOS 6 распознает вложения передачи

На этом снимке экрана показано, как Почта предлагает добавить вложение для передачи в Кошелек

Если вы создаете приложение, которое может быть каналом для проходов, их можно распознать следующим образом:

  • Расширение файла — PKPASS
  • Тип MIME — application/vnd.apple.pkpass
  • UTI — com.apple.pkpass

Основная операция приложения conduit заключается в том, чтобы получить парольный файл и вызвать PassKit, PKAddPassesViewController чтобы предоставить пользователю возможность добавить передачу в свой кошелек. Реализация этого контроллера представления рассматривается в следующем разделе о приложениях-компаньонах.

Приложения conduit не должны быть подготовлены для определенного идентификатора типа передачи таким же образом, как и приложения-компаньоны.

Приложения-компаньоны

Приложение-компаньон предоставляет дополнительные функциональные возможности для работы с проходами, включая создание pass, обновление сведений, связанных с pass и в противном случае управление проходами, связанными с приложением.

Приложения-компаньоны не должны пытаться дублировать функции Wallet. Они не предназначены для отображения проходов для сканирования.

В оставшейся части этого раздела описывается, как создать базовое приложение-компаньон, взаимодействующее с PassKit.

Подготовка

Так как Бумажник — это технология хранения, приложение должно быть подготовлено отдельно и не может использовать профиль подготовки команды или идентификатор приложения подстановочного знака. Ознакомьтесь с руководством по работе с возможностями, чтобы создать уникальный идентификатор приложения и профиль подготовки для приложения Wallet.

Объемы обслуживания

Файл Entitlements.plist должен быть включен во все последние проекты Xamarin.iOS. Чтобы добавить новый файл Entitlements.plist, выполните действия, описанные в руководстве по работе с правами .

Чтобы задать права, сделайте следующее:

Дважды щелкните файл Entitlements.plist на панели решения, чтобы открыть редактор "Разрешения.plist ":

Редактор Entitlements.plst

В разделе "Кошелек" выберите параметр "Включить кошелек"

Включение прав кошелька

Параметр по умолчанию предназначен для приложения, чтобы разрешить все типы проходов. Однако можно ограничить приложение и разрешить только подмножество типов передач команд. Чтобы включить этот параметр, выберите подмножество типов командных проходов и введите идентификатор типа прохода для подмножества, который требуется разрешить.

Отладка

Если у вас возникли проблемы с развертыванием приложения, убедитесь, что вы используете правильный профиль подготовки и что Entitlements.plist выбран в качестве файла настраиваемых прав в параметрах подписывания пакета iPhone.

Если при развертывании возникает эта ошибка:

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

pass-type-identifiers Затем массив прав некорректно (или не соответствует профилю подготовки). Проверьте правильность идентификаторов типа прохода и идентификатора команды.

Классы

Для доступа к проходам доступны следующие классы PassKit:

  • PKPass — экземпляр pass.
  • PKPassLibrary — предоставляет API для доступа к проходам на устройстве.
  • PKAdd PassViewController — используется для отображения прохода для пользователя, чтобы сохранить его в своем кошельке.
  • PKAddPassesViewControllerDelegate — разработчики Xamarin.iOS

Пример

Ознакомьтесь с проектом PassLibrary в примере этой статьи. В нем показаны следующие распространенные функции, которые потребуются в приложении-компаньоне кошелька:

Проверка доступности кошелька

Кошелек недоступен на iPad, поэтому приложения должны проверяться перед попыткой доступа к функциям PassKit.

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

Создание экземпляра сквозной библиотеки

Библиотека PassKit не является одним из способов, приложения должны создавать и хранить и хранить экземпляр для доступа к API PassKit.

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() метод для получения данных из полей, созданных в проходах (так как вы будете знать, какие поля должны присутствовать). В примере кода это не показано.

Загрузка передачи из файла

Так как пароль может быть добавлен только в Wallet с разрешением пользователя, контроллер представления должен быть представлен, чтобы разрешить им решить. Этот код используется в кнопке "Добавить" в примере для загрузки предварительно созданного прохода, внедренного в приложение (его следует заменить подписанным):

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 метода, как показано ниже.

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# на стороне сервера.

Push-уведомления

Подробное обсуждение использования push-уведомлений для обновления проходит выходит за рамки этой вводной статьи.

Вам потребуется реализовать REST-API, определенный Apple, чтобы реагировать на веб-запросы из Кошелька при необходимости обновлений.

Дополнительные сведения см. в руководстве по обновлению pass в Apple.

Итоги

В этой статье представлен PassKit, описаны некоторые из причин, по которым полезно и описаны различные части, которые должны быть реализованы для полного решения PassKit. В ней описаны шаги, необходимые для настройки учетной записи разработчика Apple для создания проходов, процесса выполнения передачи вручную, а также доступа к API PassKit из приложения Xamarin.iOS.