19.0. Введение
Пожалуй, всем приходилось иметь дело с проездными билетами, дисконтными картами и скидочными талонами. Например, вы ходите в кофейню, в которой постоянным клиентам раздают специальные дисконтные карты. Если вы уже успели заказать определенное количество чашек кофе, то вам предложат бесплатную чашечку за счет заведения. Дисконтные карты используются и в магазинах. Например, вы можете купить в супермаркете продукты на сумму X, за что вам выдадут дисконтную карту или скидочный купон, которые можно будет использовать, когда вы в следующий раз придете в этот магазин.
На рис. 19.1 показано, как на устройстве с iOS выглядит обычный (бесплатный) железнодорожный билет, отображенный в Passbook.
Рис. 19.1. Железнодорожный билет, представленный в виде талона в приложении Passbook на устройстве с iOS
Приложения iOS для взаимодействия с такими бесплатными билетами могут использовать также фреймворк Passbook. Вернемся к примеру с кофейней. Если мы пишем мобильное приложение для этой кофейни, то можем предусмотреть в нем и такую возможность: посетитель добавляет к дисконтной карточке некоторую сумму, что позволяет ему не только выпить кофе, но и воспользоваться Wi-Fi-соединением. Итак, когда пользователь открывает такое приложение, он замечает в базе данных Passbook клубный талон, полученный именно в этой кофейне. Пользователь может добавить некоторую сумму к этому талону прямо на устройстве, а затем сообщить барриста, что внес плату за пользование сетью через приложение, где имеется виртуальный клубный талон.
Pass Kit — это цифровое решение от Apple для осуществления именно таких транзакций. Итак, разберемся с терминологией, а затем изучим эту тему подробнее.
• Pass Kit. Фреймворк Pass Kit от Apple позволяет разработчикам доставлять виртуальные скидочные талоны, снабженные цифровой подписью, на совместимые устройства с операционной системой iOS 6 и выше.
Passbook. Клиентское приложение на устройствах с iOS 7. Позволяет хранить и обрабатывать талоны, созданные разработчиками, а также управлять этими талонами.
Итак, мы (разработчики) будем пользоваться Pass Kit для создания талонов с цифровой подписью и доставки их нашим пользователям. Пользователям потребуется взаимодействовать с талонами, которые мы для них создаем, для этого они будут использовать приложение Passbook, установленное на устройстве. Итак, мы сможем выдавать пользователям в цифровой форме различные талоны, проездные билеты, скидочные купоны, дисконтные и клубные карты и т. д. Не придется носить целую стопку карточек в кошельке. Весь этот контент можно хранить в одном месте — в приложении Passbook для iOS.
Прежде чем опробовать эту новую технологию, рассмотрим общую картину: как именно спроектировано такое хранилище и как оно помогает достигать наших целей. Я разделил эту концепцию на несколько более мелких элементов. Рассмотрим, как доставлять пользователям талоны, снабженные цифровой подписью.
1. Разработчик создает сертификат и соответствующий ему закрытый ключ. Это делается на портале инициализации Apple (Apple Provisioning Portal).
2. Затем разработчик создает ряд файлов. Они будут представлять собой талон, который мы позже доставим пользователю.
3. Разработчик подписывает созданный талон с применением того сертификата, который был создан на первом этапе.
4. Разработчик тем или иным способом доставляет талон пользователю.
5. Пользователь увидит талон и сможет добавить его на свое устройство.
6. Как только талон окажется на пользовательском устройстве, Passbook сохранит его для последующего использования до тех пор, пока пользователь не решит удалить талон.
Конечно, после прочтения этого списка у вас могла еще не сложиться целостная картина. На рис. 19.2 все показано наглядно.
Рис. 19.2. Создание и распространение среди пользователей талонов с цифровой подписью в операционных системах iOS 6 и выше
Все детали процесса будут подробно описаны в разделах этой главы. Некоторые технологические аспекты Pass Kit, связанные с тем, как обеспечивать актуальность ваших талонов и отсылать уведомления с сервера, требуют определенных знаний о серверном программировании. Ради упрощения материала мы не будем в этой главе останавливаться на данных аспектах, а поговорим преимущественно о создании талонов. Научившись создавать талоны, вы сможете распространять их разными способами. Два из таких способов объяснены в этой главе. Те детали, которые связаны не с системой iOS непосредственно, а с серверной разработкой, в этой главе не рассматриваются.
19.1. Создание сертификатов Pass Kit
Постановка задачи
Требуется распространять между пользователей талоны с цифровой подписью. Для этого первым делом нужно создать цифровые сертификаты для подписывания ваших талонов.
Решение
Создавайте цифровые сертификаты на портале инициализации iOS.
Обсуждение
Как было объяснено во введении к этой главе, для распространения талонов между пользователями эти талоны требуется снабжать цифровыми подписями. А перед этим нужно получить в Apple сертификат, который позволил бы уникально связать все талоны с вашей учетной записью разработчика. Таким образом Apple отличает «настоящие» талоны от «ненастоящих».
При создании сертификата выполните следующие шаги.
1. В браузере откройте центр разработки для iOS (iOS Dev Center). Не буду ставить здесь ссылку, так как со временем она может измениться. Просто введите такой запрос в поисковик — и он выдаст вам нужный сайт в мгновение ока.
2. Если вы еще не вошли на сайт под вашей учетной записью, сделайте это.
3. Оказавшись в системе, перейдите на страницу Certificates, Identifiers & Profiles (Сертификаты, идентификаторы, профили).
4. Перейдите на страницу Identifiers (Идентификаторы) и далее на страницу Pass Type ID (ID типа талона). Соответствующий раздел находится в левой части экрана.
5. Когда вы окажетесь на нужной странице, она, возможно, еще будет пуста. Найдите и нажмите экранную кнопку +.
6. Теперь в поле Description (Описание) введите текст, который будет описывать ID типа вашего талона.
7. В поле Identifier (Идентификатор) введите идентификатор талона в формате обратного доменного имени. Например, если ID вашего приложения — com.pixolity.testingpasskit, то для талонов, интегрированных с данным приложением, подойдет идентификатор pass.pixolity.ios.cookbook.testingpasses. Разумеется, следует подбирать для идентификаторов талонов такие названия, которые что-то означают в контексте вашего приложения. На практике принято начинать имя идентификатора с pass, а затем можно писать все, что хотите. На рис. 19.3 показано, как нужно заполнять поля на этой странице.
Рис. 19.3. Внесение информации о простом идентификаторе типа талона
Когда закончите заполнение этой страницы, нажмите кнопку Continue (Продолжить). Вам для предварительного просмотра будет представлен талон. Если вас все устроит, просто нажмите кнопку Register (Зарегистрировать) (рис. 19.4). Итак, теперь у вас есть идентификатор типа талона. Но он пока не связан ни с одним сертификатом. Чтобы создать сертификат и ассоциировать его с вашим идентификатором типа талона, выполните следующие шаги.
Рис. 19.4. Если вся информация указана правильно, подтвердите создание ID типа талона
1. В разделе Pass Type ID (Идентификаторы типа талона) на портале инициализации iOS найдите созданный вами идентификатор и нажмите кнопку Settings (Настройки) (рис. 19.5). В столбце Pass Certificate (Сертификаты талонов) в этом списке вы увидите, что ваш идентификатор типа талона обозначен как None (Отсутствует). В столбце Action (Действия) нажмите ссылку Configure (Сконфигурировать).
Рис. 19.5. Задаем идентификатор типа талона
2. Выбрав на портале идентификатор типа талона, вы сможете создать для него сертификат (рис. 19.6). Просто нажмите кнопку Create Certificate (Создать сертификат).
Рис. 19.6. Мы готовы создать сертификат для идентификатора типа талона
3. Теперь вам будет предложено создать запрос на подписывание сертификата, воспользовавшись доступом к связке ключей на Mac (рис. 19.7). Следуйте инструкциям, которые видите на экране. Когда закончите создание запроса на подписывание сертификата, нажмите экранную кнопку Continue (Продолжить).
Рис. 19.7. Выполняйте инструкции по созданию запроса на подписывание сертификата
Запрос на подписывание сертификата можно создать не только в Mac. Для создания такого запроса необходимо убедиться, что на вашей машине установлен Open SSL. Описание генерирования сертификатов на машинах, где не установлен Mac, выходит за рамки этой книги. Однако, если вас интересует этот вопрос, вы легко найдете ответ на него в Интернете — достаточно немного поискать.
Создавая на компьютере запросы на подписывание сертификата (это делается с помощью доступа к связке ключей), вы также создаете закрытый ключ, ассоциированный с таким сертификатом. Apple рекомендует время от времени делать резервные копии базы данных связки ключей, так как на портале инициализации iOS эти ключи не сохраняются. Если вы переходите к работе с новым компьютером, то ваши ключи туда нужно будет перенести вручную. Поэтому они и называются закрытыми. Экспортировать закрытые ключи несложно: щелкните на ключе правой кнопкой мыши и выберите в контекстном меню команду Export (Экспортировать).
4. Далее в браузере вам будет предложено загрузить запрос на подписывание сертификата на сайт Apple, чтобы в ответ получить готовый сертификат. Закрытый ключ был создан на вашем компьютере в тот самый момент, когда вы подготовили запрос на подписывание сертификата. Сертификат, который Apple выдаст по окончании процесса, будет подходить к закрытому ключу. Далее нажмите кнопку Choose File (Выбрать файл) на этом экране, чтобы выбрать запрос на подписывание сертификата, созданный для вас связкой ключей (рис. 19.8). Сделав это, нажмите кнопку Generate (Сгенерировать).
Рис. 19.8. Загрузка запроса на подписывание сертификата на сайт Apple для получения ссылки на сертификат
5. Когда сертификат сгенерирован, вы увидите примерно такой экран, как на рис. 19.9. Нажмите кнопку Download (Скачать), чтобы скачать сгенерированный сертификат.
Рис. 19.9. Apple сообщает вам о том, что сертификат создан успешно
6. Теперь у вас на диске должен быть готовый сертификат. Найдите этот файл и дважды щелкните на нем кнопкой мыши, чтобы импортировать его в вашу связку ключей. Чтобы убедиться, что все сработало правильно, откройте на компьютере программу для доступа к связке ключей (Keychain Access), там перейдите в раздел Login (Учетная запись) и далее — в подраздел My Certificate (Мой сертификат). Затем в правой части экрана подтвердите, что ваш сертификат на месте и что он ассоциирован с закрытым ключом (рис. 19.10).
Рис. 19.10. Сертификат, сгенерированный Apple, правильно ассоциирован с закрытым ключом
Итак, вы создали сертификат и готовы подписывать талоны, а потом рассылать их на устройства с iOS.
См. также
Раздел 19.0.
19.2. Создание файлов талонов
Постановка задачи
Требуется создать файл талона, представляющий данные, которые должны сохраняться на пользовательском устройстве с iOS.
Решение
Создайте файл pass.json и заполните его соответствующими ключами и значениями.
Обсуждение
Для представления талонов во фреймворке Pass Kit компания Apple выбрала формат JSON. Аббревиатура JSON расшифровывается как «объектная нотация JavaScript», широко используется в веб-приложениях и веб-службах. Однако вы, будучи iOS-разработчиком, можете и не иметь достаточных знаний о JSON.
Файлы JSON состоят из обычных ключей и значений, этим они напоминают словари. Ключ может иметь значение, а значения могут быть самыми разными — от простой строки до словаря, который и сам содержит ключи и значения. Вот простой пример JSON, обладающий всеми характерными чертами этой нотации:
{
«key 2 — dictionary» = {
«key 2.1» = «value 2.1»;
«key 2.2» = «value 2.2»;
};
«key 3 — array» = (
{
«array item 1, key1» = value;
«array item 1, key2» = value;
},
{
«array item 2, key1» = value;
«array item 2, key2» = value;
}
);
key1 = value1;
}
Как видите, словари заключены в квадратные скобки, а массивы — в фигурные. Другие элементы представляют собой обычные пары «ключ — значение». Если бы мы попытались представить этот объект JSON в виде экземпляра NSDictionary, то у нас получился бы такой код:
NSDictionary *json = @{
@"key1": @"value1",
@"key 2 — dictionary": @{
@"key 2.1": @"value 2.1",
@"key 2.2": @"value 2.2",
},
@"key 3 — array": @[
@{
@"array item 1, key1": @"value",
@"array item 1, key2": @"value"
},
@{
@"array item 2, key1": @"value",
@"array item 2, key2": @"value"
}
]
};
Подробнее о нотации JSON вы можете почитать на сайте JSON.org. Перейдем к созданию файлов талонов. Как уже говорилось, такой файл состоит из обычной нотации JSON. Не путайте файлы талонов и сами талоны. Талон — это коллекция файлов, в которую входит и pass.json. Вся эта коллекция в целом и будет представлять собой талон с цифровой подписью, который пользователь сможет установить на своем устройстве. Файл талона «объясняет», как талон должен быть представлен на устройстве.
Файл pass.json можно создавать с помощью высокоуровневых и низкоуровневых ключей. Высокоуровневыми называются такие ключи, которые сразу же видны в основной иерархии файла pass.json. Низкоуровневые ключи являются дочерними для высокоуровневых. Не волнуйтесь, если пока это не совсем понятно. Я тоже сначала запутался в этой иерархии, но читайте дальше — и стройная картина обязательно сложится.
Начнем с создания файла pass.json в Xcode. Должен вас предупредить, что Xcode, к сожалению, не лучший инструмент для редактирования JSON. Однако это наша основная интегрированная среда разработки, так что продолжим работать в ней. Чтобы создать файл pass.json, выполните следующие шаги.
1. Создайте в Xcode простой проект для iOS, выбрав File — New — Project (Файл — Новый — Проект).
2. В левой части диалогового окна New Project (Новый проект) убедитесь, что находитесь в категории iOS. Затем выберите раздел Other (Другой), а в правой части экрана — вариант Empty (Пустой) (рис. 19.11). Сделав это, нажмите кнопку Next (Далее).
Рис. 19.11. Создание пустого проекта в iOS
3. Теперь укажите имя вашего проекта в поле Product Name (Имя продукта). Сделав это, нажмите кнопку Next (Далее). После этого можете сохранить файл на диске. Когда вы успешно выберете путь для сохранения проекта, появится возможность создать файл pass.json.
4. В новом пустом проекте в Xcode выберите File — New — File (Файл — Новый — Файл).
5. В диалоговом окне New File (Новый файл), будучи в категории iOS, выберите вариант Other (Другой). Справа выберите вариант Empty (Пустой) (рис. 19.12). Сделав это, нажмите кнопку Next (Далее).
Рис. 19.12. Добавление пустого файла в проект
6. После того как вы нажмете кнопку Next (Далее), вам будет предложено сохранить файл на диске. Убедитесь, что сохраняете его как pass.json. Справившись с этим, нажмите кнопку Create (Создать), и файл будет добавлен на диск в рамках вашего проекта.
Отлично, вот вы и создали файл pass.json на диске. Теперь нужно заполнить этот файл ключами и значениями. Прежде чем мы подробно поговорим о ключах и значениях, детально разберем, какая информация находится в файле талона:
{
«formatVersion»: 1,
«passTypeIdentifier»: «<# Put your Pass Type ID here #>»,
«serialNumber»: «p69f2J»,
«teamIdentifier»: «<# Put your team ID here #>»,
«description»: «Train Ticket Example»,
«locations»: [
{
«longitude»: -0.1 70867,
«latitude»: 50.8 34948
}
],
«barcode»: {
«message»: «12345 67890»,
«format»: «PKBarcodeFormatPDF417»,
«messageEncoding»: «iso-8859-1»
},
«organizationName»: «O'Reilly Railways»,
«logoText»: «O'Reilly Railways»,
«foregroundColor»: «rgb(255, 255, 255)»,
«backgroundColor»: «rgb(100, 100, 100)»,
«boardingPass»: {
«transitType»: «PKTransitTypeTrain»,
«primaryFields»: [
{
«key»: «departure»,
«label»: «Departs From»,
«value»: «Hove, 07:37»,
},
{
«key»: «departurePlatform»,
«label»: «Departs from Platform»,
«value»: "2",
}
],
«auxiliaryFields»: [
{
«key»: «arrival»,
«label»: «Arrives At»,
«value»: «London Bridge, 08:41»
},
{
«key»: «arrivalPlatform»,
«label»: «Arrives at Platform»,
«value»: «13»
}
],
«backFields»: [
{
«key»: «oreillyRailways»,
«label»: «O'Reilly Railways»,
«value»: «For more information, visit www.oreilly.com»
},
{
«key»: «termsAndConditions»,
«label»: «Terms and Conditions»,
«value»: «To be filled later»
}
]
}
}
Я специально оставил ключи teamIdentifier и passTypeIdentifier без значений. Значениями этих ключей должна быть информация, которую вы сами указали на портале инициализации, например идентификатор талона. Значения этих ключей необходимо заполнять совершенно точной собственной информацией.
Класс. Теперь у нас есть готовый файл pass.json, который можно включать в талон с цифровой подписью. Не забывайте, талон — это не только файл pass.json. В состав талона входят также несколько изображений и файл описания (манифеста), где будут перечислены все файлы, образующие талон.
Приведу некоторые важнейшие ключи, которые могут находиться в файле pass.json:
• formatVersion — этот ключ указывает версию формата талона. Его значение должно быть равно константе 1;
• passTypeIdentifier — это идентификатор талона, созданный вами ранее на портале инициализации iOS, но здесь не указывается ID команды. Например, если мой полный идентификатор типа талона — TEAMID.pass.pixolity.testingpasskit, то в данном случае я укажу значение идентификатора талона как pass.pixolity.testingpasskit;
• teamIdentifier — это идентификатор вашей команды. Чтобы узнать это значение, просто перейдите на главную страницу центра разработки в iOS (iOS Dev Center) и далее — в Центр участников (Member Center). Выберите вашу учетную запись (Your Account), а затем Профиль организации (Organization Profile). Там вы должны найти поле под названием Company/Organization ID (Идентификатор компании/организации). Это идентификатор вашей команды. Просто скопируйте это значение и вставьте его в качестве ключа в ваш файл pass.json;
• description — краткое описание назначения талона. Это описание будет использоваться при оптимизации доступности приложения в iOS;
• organizationName — имя вашей компании;
• serialNumber — уникальный серийный номер талона. Вы можете придумать его по ходу разработки. Он должен быть информативным для вас и вашей организации. Обратите внимание: если два и более талона имеют один и тот же идентификатор типа, то их серийные номера не могут быть одинаковыми;
• barcode — штрихкод для талона. Настоятельно рекомендуется включать в цифровой талон информацию в формате штрихкода. Это словарь, ключи, которые могут в нем находиться, описаны далее:
• message — сообщение, зашифрованное в штрихкоде;
• format — формат штрихкода. В качестве значений для этого ключа можно указать PKBarcodeFormatText, PKBarcodeFormatQR, PKBarcodeFormatPDF417 или PKBarcodeFormatAztec. Обсуждение формата штрихкодов выходит за рамки этой книги, поэтому в данном случае не будем вдаваться в детали;
• messageEncoding — кодировка, применяемая в штрихкоде. В качестве значения этого ключа укажите iso-8859-1;
• logoText — текст, который будет выводиться на вашем талоне рядом с логотипом в приложении Passbook на устройстве;
• foregroundColor — основной цвет вашего талона. Это значение состоит из красного, зеленого и голубого компонентов, каждый из которых может выражаться числом в диапазоне от 0 до 255. Значение включается в функцию rgb(). Например, чистому красному цвету соответствует значение rgb(255, 0, 0), а чистому белому — rgb(255, 255, 255);
• backgroundColor — фоновый цвет вашего талона. Указывается в том же формате, что и foregroundColor.
Когда все нужные значения для этих ключей будут заданы, вы сможете указать тип создаваемого талона. Для этого нужно включить в число высокоуровневых ключей талона либо один из предыдущих ключей, либо один из следующих:
• eventTicket — сообщает Passbook, что талон представляет собой билет на мероприятие, например на концерт;
• coupon — сообщает Passbook, что талон представляет собой скидочный купон. Например, такой талон может быть выдан в магазине, и пользователь, предъявив его, имеет право на скидку при приобретении тех или иных товаров;
• storeCard — говорит Passbook, что талон представляет собой дисконтную или клубную карту;
• boardingPass — сообщает Passbook, что талон представляет собой проездной билет на поезд или автобус либо посадочный талон на самолет;
• generic — талон, не относящийся ни к одной из вышеупомянутых категорий.
Каждый из приведенных ключей в файле pass.json будет содержать словарь значений (которые, в свою очередь, являются ключами со значениями). Эти ключи будут конкретно определять, для чего применяется талон и какие значения он содержит.
Когда вы внесете талон одного из этих типов в качестве ключа в файл pass.json, нужно будет указать словарные ключи и значения для данного талона (мы уже говорили, что все талоны вышеперечисленных типов являются словарями). Каждый словарь такого типа может содержать следующие ключи:
• transitType — этот ключ требуется только в словаре типа boardingPass. В других случаях его можно просто игнорировать. В этом словаре могут содержаться следующие значения: PKTransitTypeAir, PKTransitTypeBus, PKTransitTypeTrain, PKTransitTypeBoat и PKTransitTypeGeneric. Талоны с такими значениями соответствуют билетам на самолет, автобус, поезд, водный транспорт. Последнее значение является универсальным;
• headerFields — часть информации, расположенная в верхней части талона и доступная для просмотра в Passbook на устройстве. Старайтесь не перегружать этот заголовок информацией, поскольку эти значения всегда будут видны пользователю, даже если все талоны сложены «в стопку» в интерфейсе приложения Passbook;
• primaryFields — самая важная информация о вашем талоне, которая будет отображаться на его лицевой стороне. Например, если мы говорим о посадочном талоне на самолет, то здесь вы найдете номер терминала, номер места и название авиакомпании. В другом талоне здесь может присутствовать иной набор значений;
• secondaryFields — второстепенная информация, также отображаемая на лицевой стороне талона. Например, в посадочном талоне на самолет к этой категории можно отнести время посадки, дату посадки и тип воздушного судна;
• auxiliaryFields — наименее важная информация, отображаемая на лицевой стороне талона. В посадочном талоне на самолет к такой информации можно отнести предположительное время прибытия;
• backFields — информация, отображаемая на оборотной стороне талона.
В качестве значений все вышеупомянутые ключи получают словари, а эти словари, в свою очередь, могут содержать следующие ключи:
• label — надпись-название поля, которое должно отображаться на талоне (с лицевой или оборотной стороны в зависимости от того, к какому ключу добавлен этот словарь);
• key — ключ, которым ваше приложение может воспользоваться для считывания значения этого поля;
• value — значение этого поля;
• textAlignment — опциональный ключ, который может описывать визуальное выравнивание надписи на талоне. Для этого поля можно указать любое из следующих значений:
• PKTextAlignmentRight;
• PKTextAlignmentCenter;
• PKTextAlignmentLeft;
• PKTextAlignmentNatural;
• PKTextAlignmentJustified.
Да уж, многовато ключей и значений приходится запоминать. Но не волнуйтесь, со временем к этому привыкаешь. Итак, создадим простой файл pass.json. Сначала сформулируем требования, а потом приступим к написанию самого файла талона. Как раз применим на практике ту теорию, которую выучили раньше. Далее изложена суть примера.
• Создаваемый талон будет соответствовать железнодорожному билету.
• Поезд выходит из английского города Хоув в 7:37. Состав отбывает от платформы 2.
• Поезд прибывает на вокзал Лондон-Бридж в Лондоне в 8:41 (платформа 13).
• Билет предоставляет право проезда в поездах придуманной нами компании «О’Рейли Рэйлуэйз».
Но прежде, чем приступать к делу, нам потребуется подробно рассмотреть массив locations из файла pass.json. Этот ключ является массивом, каждый элемент которого имеет по два ключа. Чуть позже мы их рассмотрим. Но самая интересная черта этого ключа заключается в том, что он может содержать геолокационную информацию о создаваемом вами талоне. Когда талон импортируется в приложение Passbook на вашем устройстве с iOS, операционная система выведет для пользователя информацию о вашем талоне. В частности, будет сообщено, что талон действителен в том месте, где сейчас находится пользователь. Предположим следующее: пользователю нужно показывать билет на поезд всякий раз, когда он (как пассажир) подходит к турникету на станции Хоув (станция отправления). Итак, вы можете указать в электронном талоне местоположение станции отправления (по ключу locations), чтобы iOS автоматически выводила талон на экран, как только пользователь прибудет на станцию. Вы можете реализовать такую же функцию и для конечной станции, так как, когда вечером пользователь будет уезжать с вокзала Лондон-Бридж в Хоув, станцией отправления станет Лондон. Если вы движетесь из точки A в точку B, то B — пункт назначения. Когда вы возвращаетесь, B становится точкой отправления, а A — точкой назначения. Итак, вы можете указать в массиве locations местоположение точек A и B, а также любых других важных точек на том маршруте, где действует ваш талон. Вот ключи, которые могут входить в состав любого массива с информацией о местоположении:
• longitude — долгота географической точки. Это значение типа double. Не заключайте его в кавычки;
• latitude — широта географической точки. Это значение типа double. Не заключайте его в кавычки.
См. также
Разделы 19.0 и 19.2.
19.3. Подготовка пиктограмм и изображений для талонов
Постановка задачи
Необходимо гарантировать, что оформление вашего талона будет выдержано в стилистике компании. Для этого нужно придать талону характерные черты либо снабдить его узнаваемым изображением.
Решение
Создайте фон, пиктограммы, логотипы и вставьте их в ваш талон, снабженный цифровой подписью.
Обсуждение
На талоне могут содержаться различные изображения:
• фон (background.png, [email protected] и [email protected]) — фоновое изображение на талоне. Не на всех талонах есть фоновые изображения;
логотип (logo.png и [email protected]) — логотип, который будет находиться в верхнем левом углу талона. Зависит от типа талона;
пиктограмма (icon.png и [email protected]) — пиктограмма для талона. Не у всех талонов есть пиктограммы. В этой главе мы подробно поговорим о создании пиктограмм для талонов;
миниатюра (thumbnail.png и [email protected]) — миниатюра-ярлык, соответствующая талону. Будет видна, когда талоны сложены «в стопку».
Как понятно из названий, все эти изображения создаются в двух вариантах: для обычного и для сетчатого дисплея (Retina). Apple не требует строгого соблюдения этого правила, но разве мы, разработчики, не ценим наших клиентов? Сетчатые дисплеи сегодня так популярны, что становятся общепризнанным промышленным стандартом. Поэтому, пожалуйста, не забывайте создавать и сетчатые варианты изображений с высоким разрешением.
Итак, мы выяснили, каковы будут имена файлов изображений. Перейдем к параметрам этих изображений. Я перечисляю только сетчатые изображения (чтобы получить обычные, просто разделите все значения по длине и ширине на 2):
• [email protected] — 640 пикселов в ширину и 960 пикселов в высоту;
• [email protected] — 640 пикселов в ширину и 1136 пикселов в высоту, для iPhone 5;
• [email protected] — 60 пикселов в ширину и 60 пикселов в высоту;
• [email protected] — 58 пикселов в ширину и 29 пикселов в высоту;
• [email protected] — 200 пикселов в ширину и 200 пикселов в высоту.
В этом разделе я создал все изображения максимально простым образом. На рис. 19.13 они все показаны на одном холсте.
Рис. 19.13. Все изображения с талона на одном холсте
Рисунок сделан для наглядности и просто показывает, сколько изображений требуется подготовить для одного талона. Не нужно создавать такое изображение, в котором все эти элементы расположены на одном холсте.
Все изображения готовы. Сохраните их в том же каталоге, где уже находится файл pass.json. Переходим к следующему этапу работы — создаем файл описания (манифеста).
См. также
Раздел 19.2.
19.4. Подготовка талонов к цифровому подписыванию
Постановка задачи
Требуется подготовить талоны к цифровому подписыванию. Это необходимый предварительный этап, без которого такое подписывание выполнить невозможно.
Решение
Создайте файл manifest.json в том же каталоге, где находятся файл pass.json и изображения для талона. Файл описания будет написан в формате JSON. Его корневой объект — это словарь. Ключами в этом словаре являются имена файлов (имена всех изображений плюс имя файла pass.json). Значение каждого ключа представляет собой SHA1-хеш соответствующего файла.
Обсуждение
Просто создайте файл manifest.json с ключами для всех изображений, а значения пока оставьте пустыми. Содержимое вашего файла manifest.json должно выглядеть примерно так:
{
«background.png»: "",
«[email protected]»: "",
«[email protected]»: "",
«icon.png»: "",
«[email protected]»: "",
«logo.png»: "",
«[email protected]»: "",
«pass.json»: "",
«thumbnail.png»: "",
«[email protected]»: ""
}
А теперь начинается самое интересное. Нужно рассчитывать SHA1-хеши всех этих файлов. Учтите, что теперь при каждом изменении файлов (например, вы нашли ошибку в файле pass.json и исправили ее) потребуется также пересчитывать SHA1-хеш и записывать новое значение этого хеша в файле manifest.json. Чтобы рассчитать значение SHA1-хеша для любого файла в операционной системе OS X, просто выполните следующие шаги.
1. Откройте окно терминала и перейдите в каталог, где находится целевой файл (для этого используется команда cd).
2. Выполните в окне терминала команду openssl. В качестве ее первого аргумента сообщите sha1, в качестве второго — имя файла.
Например, в каталоге с моим проектом есть подкаталог pass. В этот каталог я поместил мой файл pass.json, полупустой файл manifest.json, а также все изображения для талона (фоновое изображение, логотип и т. д.). Теперь в окне терминала я рассчитаю значения SHA1-хешей для всех этих файлов и запишу полученные значения в файл описания. Итак, в первой строке следующего листинга идет команда openssl, а все остальные строки — это значения хешей, полученные в качестве вывода:
openssl sha1 *.png *.json
SHA1([email protected])= e2aaf36f4037b2a4008240dc2d13652aad6a15bb
SHA1(background.png)= b21a92dedb89f8b731adabc299b054907de2347d
SHA1([email protected])= 6abab0f77fd89f1a213940fd5c36792b4cc6b264
SHA1(icon.png)= ed698ab24c5bd7f0e7496b2897ec054bbd4 26747
SHA1([email protected])= 90381c84cfea22136c951ddb3b368ade71f49eef
SHA1(logo.png)= c3bd8c5533b6c9f500bbadbdd957b9eac8a6bfe9
SHA1([email protected])= 1a56a5564dec5e8742ad65dc47aa9bd64c39222f
SHA1(thumbnail.png)= 58883d22196eb73f33ea556a4b7ea735f90a6213
SHA1([email protected])= 0903df90165ef1a8909a15b4f652132c273 68560
SHA1(manifest.json)= 894f795b991681de8b12101afb8c2984bf8d0f65
SHA1(pass.json)= c5acddbab742f488867c34882c55ca14efff0de9
Мы рассчитали SHA1-хеши всех файлов, в том числе хеш manifest.json. Однако SHA1-хеш файла manifest.json нам не понадобится, так как он содержит хеши всех остальных файлов, а своего собственного хеша не имеет. Поэтому мы просто игнорируем хеш файла manifest.json.
Итак, теперь требуется заполнить файл manifest.json значениями SHA1 всех остальных файлов — эти хеши мы только что рассчитали:
{
«background.png»: «b21a92dedb89f8b731adabc299b054907de2347d»,
«[email protected]»: «6abab0f77fd89f1a213940fd5c36792b4cc6b264»,
«[email protected]»: «e2aaf36f4037b2a4008240dc2d13652aad6a15bb»,
«icon.png»: «ed698ab24c5bd7f0e7496b2897ec054bbd4 26747»,
«[email protected]»: «90381c84cfea22136c951ddb3b368ade71f49eef»,
«logo.png»: «c3bd8c5533b6c9f500bbadbdd957b9eac8a6bfe9»,
«[email protected]»: «1a56a5564dec5e8742ad65dc47aa9bd64c39222f»,
«pass.json»: «c5acddbab742f488867c34882c55ca14efff0de9»,
«thumbnail.png»: «58883d22196eb73f33ea556a4b7ea735f90a6213»,
«[email protected]»: «0903df90165ef1a8909a15b4f652132c273 68560»
}
Пока все понятно. Переходим к следующему этапу: нам нужно снабдить талон цифровой подписью.
См. также
Раздел 19.1.
19.5. Цифровое подписывание талонов
Постановка задачи
Вы подготовили каталог pass с файлом описания и файлом pass.json, а также все изображения. Теперь вы хотите снабдить цифровой подписью каталог с талоном и его содержимое. Это требуется для создания файла талона, готового к распространению.
Решение
Для подписывания талонов используйте OpenSSL.
Обсуждение
Каждый талон требуется подписывать с помощью сертификата, созданного в разделе 19.1. Для подписывания талонов мы вновь будем использовать команду openssl в окне терминала. Перед тем как читать дальше, убедитесь в том, что создали каталог pass и поместили в него файлы pass.json, manifest.json и все изображения. Этот каталог не обязательно должен называться pass. Тем не менее, чтобы было удобнее читать этот раздел и оставшиеся разделы этой главы, лучше не импровизировать и назвать этот каталог с файлами именно pass.
Некоторые читатели могли запутаться в том, куда относятся некоторые ключи и для чего нужны те или иные сертификаты. Надеюсь, в этом разделе ситуация прояснится. Когда вы запрашиваете новый сертификат на портале инициализации iOS, в связке ключей на вашем компьютере создается закрытый ключ, а также файл запроса на подпись сертификата (CSR). Сертификат будет сгенерирован Apple. Когда вы скачаете файл сертификата, он будет иметь расширение. cer. Это просто сертификат! Когда вы импортируете его в связку ключей, результирующий файл будет иметь расширение. p12. В этом файле будут содержаться и сертификат, и закрытый ключ к нему.
Прежде чем мы вплотную займемся процессом подписывания, нам потребуется экспортировать созданный сертификат из связки ключей. Не забывайте, что сертификат, полученный вами на портале инициализации iOS, — это не тот самый сертификат, который экспортируется из связки ключей. Поэтому при экспорте сертификата для идентификатора типа талона обязательно выполните следующие шаги.
1. Откройте на Mac программу для доступа к связке ключей (Keychain Access).
2. В левой верхней части окна в области Keychains (Связки ключей) убедитесь, что вы выбрали связку ключей для входа в систему (Login Keychain).
3. В области Category (Категория) слева выберите My Certificates (Мои сертификаты).
4. Найдите ваш сертификат для идентификатора типа талона в правой части экрана и щелкните на нем правой кнопкой мыши.
5. Теперь выберите функцию Export (Экспортировать) (рис. 19.14) и завершите экспорт вашего файла на диск в виде файла. p12. Не сохраняйте сертификат в каталоге pass. Сертификат должен находиться вне этого каталога.
Рис. 19.14. Экспорт сертификата идентификатора типа талона из программы Keychain Access
6. После того как вы попытаетесь экспортировать свой сертификат, система запросит у вас два пароля: пароль, который требуется задать для сертификата, и пароль вашей учетной записи пользователя в OS X — это должен быть пользователь, владеющий доступом к связке ключей. Первый пароль, сопровождающий сертификат, гарантирует, что без этого пароля сертификат нельзя будет импортировать на произвольную машину. Второй пароль удостоверяет, что человек, импортирующий сертификат из связки ключей, действительно имеет на это право. Например, если вы отойдете от компьютера, оставив его незаблокированным, а ваш приятель попытается экспортировать сертификат из вашей связки ключей, для этого ему придется указать пароль вашей учетной записи. В любом случае рекомендуется гарантировать, что у разных учетных записей в одной системе разные пароли. Например, если вы с братом работаете на одном и том же Mac, то ваш пароль должен быть уникальным именно для вашей учетной записи. Если пароль у вас будет одинаковым, это поставит под сомнение всю систему безопасности вашего компьютера.
Убедитесь, что не сохраняете сертификат в каталоге pass. Нельзя рассылать сертификат вместе с талоном.
Итак, вы экспортировали сертификат. У вас должен был получиться файл, который, возможно, называется Certificates.p12. Теперь нужно разделить этот файл на сертификат как таковой и закрытый ключ. Однако если вы подписываете талон с помощью OpenSSL, то вам приходится передавать сертификат и закрытый ключ по отдельности. Чтобы получить из файла Certificates.p12 закрытый ключ и сертификат (этот файл мы только что экспортировали из программы Keychain Access), выполните следующее.
1. Откройте окно терминала, если еще не сделали этого.
2. Перейдите в каталог, в котором вы сохранили экспортированный сертификат (файл. p12).
3. Чтобы получить сертификат, введите в окне терминала следующую команду:
openssl pkcs12 — in «Certificates.p12» — clcerts — nokeys \
— out «exported-certificate»
После того как вы введете эту команду, система сразу же потребует у вас присвоить экспортированному сертификату пароль. В этом примере я задаю пароль 123, но вы придумайте пароль получше.
4. Чтобы получить закрытый ключ из сертификата, экспортированного из связки ключей, выполните в окне терминала следующую команду:
openssl pkcs12 — in «NAME OF YOUR.P12 CERTIFICATE FILE» \
— nocerts — out «NAME OF THE OUTPUT KEY»
Я назвал экспортированный закрытый ключ exported-key, но вы можете назвать его и иначе, если желаете:
openssl pkcs12 — in «Certificates.p12» — nocerts — out «exported-key»
От вас вновь потребуется ввести пароли для ключа. Для моего ключа я указал пароль 1234, чтобы его можно было легко запомнить. Такой же пароль я задал для сертификата. Но если вы работаете в организации, где безопасности уделяется должное внимание, такой пароль вам, разумеется, не подойдет. Выберите пароль, который кажется вам осмысленным. Для максимальной защиты необходимо гарантировать, что все пароли для экспортируемых вами сертификатов/ключей являются уникальными.
Замечательно. Теперь у нас есть файлы экспортированного сертификата и закрытого ключа. Можем перейти к подписыванию талона с их помощью. Чтобы это сделать, выполните следующие шаги.
1. Если вы еще не сделали этого, поместите все файлы, относящиеся к талону (pass.json, manifest.json и все соответствующие изображения), в каталог pass. Вы можете назвать этот каталог как хотите, но в рамках этого раздела рекомендую давать создаваемым каталогам такие же названия, какие даю я. Так нам будет проще ориентироваться, в каком каталоге мы находимся и что делаем в окне терминала.
2. Воспользуйтесь командой cd, чтобы перейти из текущего рабочего каталога в каталог pass, где находятся все интересующие нас файлы талона.
3. Выполните команду rm — f.DS_Store, чтобы убедиться, что в каталоге pass отсутствуют ненужные скрытые системные файлы OS X. Вы также должны проверить, перечислены ли все файлы из этого каталога в файле manifest.json, где наряду с самими файлами должны находиться и их SHA1-хеши. Если в этот каталог просочатся какие-то другие файлы (как перечисленные в файле описания, так и не указанные там), то талон получится недействительным. Его не удастся прочитать в приложении Passbook ни на устройстве с iOS, ни на симуляторе.
4. Выполните в окне терминала следующую команду, чтобы сгенерировать в каталоге pass файл signature:
openssl smime — binary — sign — signer «PATH TO YOUR EXPORTED CERTIFICATE» \
— inkey «PATH TO YOUR EXPORTED PRIVATE KEY» — in manifest.json \
— out signature — outform DER
Эта команда должна выполняться в каталоге pass, где находятся все ваши ресурсы, связанные с талоном. Экспортированный сертификат и закрытый ключ — это тот сертификат и тот ключ, которые были извлечены из сертификата, экспортированного из связки ключей. Не указывайте в этой команде сертификат в том виде, в каком он был экспортирован из связки ключей. Ранее мы уже рассмотрели, как извлекать реальный сертификат и закрытый ключ из файла. p12, экспортированного из связки ключей. Можете перечитать этот фрагмент раздела, чтобы проверить, все ли вы делаете правильно.
На последнем этапе система запросит у вас пароль к закрытому ключу. Помните его? Вы задавали этот пароль, когда извлекали закрытый ключ из сертификата, экспортированного из связки ключей. Теперь эта команда создаст файл signature в каталоге pass. Почти все готово. Остается заархивировать подготовленный каталог в виде файла с расширением. pkpass. Для этого выполните следующие шаги.
1. Откройте окно терминала и с помощью команды cd перейдите в каталог pass.
2. Чтобы запаковать ваш каталог pass в файл pass.pkpass, выполните в текущем каталоге следующую команду:
zip — r pass.pkpass. -x '.DS_Store'
В результате все файлы талона будут упакованы в архив pass.pkpass. Вновь необходимо убедиться в том, что в готовом архиве не будет файла. DS_Store.
См. также
Разделы 19.1 и 19.4.
19.6. Распространение талонов по электронной почте
Постановка задачи
Требуется рассылать талоны с цифровой подписью клиентам по электронной почте.
Решение
Посылайте талоны по электронной почте в виде прикрепленных файлов.
Обсуждение
Талон, который вы подписали и упаковали в разделе 19.5, готов к распространению. Один из простейших способов распространения талонов — по электронной почте. Выполните следующие шаги, чтобы рассылать ваши талоны с помощью приложения Mail.app из операционной системы OS X.
1. Откройте приложение Mail.app в операционной системе OS X. В меню File (Файл) выберите пункт New Message (Новое сообщение).
2. Введите адрес электронной почты того клиента, которому хотите послать талон.
3. Введите заголовок электронного сообщения.
4. Введите текст электронного сообщения. После этого просто перетащите файл pass.pkpass, подготовленный в разделе 19.5, в конец вашего электронного сообщения (рис. 19.15).
Рис. 19.15. Распространение талонов с цифровой подписью с помощью приложения Mail.app операционной системы OS X
5. Отправьте электронное письмо.
В операционной системе OS X Mavericks у пользователей появилась возможность просматривать талоны прямо в приложении Mail.app. Поскольку программа Passbook интегрирована с облаком iCloud, теперь вы можете нажать на сенсорном экране на талон, прикрепленный к электронному письму, и отправить его прямо на ваше устройство (устройства) с iOS. Для этого на мобильном устройстве должна быть установлена программа Passbook, а также активизирована связь с iCloud — это делается в соответствующем разделе настроек (рис. 19.16).
Рис. 19.16. В операционной системе OS X Mavericks талоны отображаются прямо в приложении Mail.app
Теперь, работая с сенсорным экраном, пользователь может нажать пальцем на талон, прикрепленный к письму. В результате откроется приложение Passbook, в интерфейсе которого талон отобразится, и пользователь сможет добавить его в Passbook.
См. также
Раздел 19.7.
19.7. Распространение талонов с помощью веб-сервисов
Постановка задачи
Требуется, чтобы пользователи могли скачивать прямо с вашего сайта талоны, снабженные цифровой подписью.
Решение
На своих веб-страницах создавайте гиперссылки на талоны. pkpass. Когда пользователь будет просматривать веб-страницы на устройстве, он может просто нажать на сенсорном экране заинтересовавшую его ссылку. Когда он это сделает, браузер Safari обнаружит, что ссылка указывает на файл. pkpass, и передаст этот файл в Passbook. В результате талон будет отображаться на сайте, а пользователи смогут добавлять талоны в приложения Passbook.
Обсуждение
Браузер Safari в операционной системе iOS не может непосредственно обрабатывать загрузку файлов талонов в формате. pkpass. Чтобы реализовать такую возможность, необходимо создавать веб-страницы и включать в них гиперссылки, указывающие на файлы. pkpass. Простой код на языке HTML, доставляющий пользователю файл pass.pkpass, приведен далее:
Ссылка указана здесь как localhost, так как в моей операционной системе OS X установлен и работает веб-сервер Apache. Вместо localhost вам понадобится дать такую ссылку, которая будет корректна в вашей среде разработки.
Теперь, когда пользователь откроет ссылку на своем устройстве в браузере Safari, он увидит примерно такую картинку, как на рис. 19.17.
Рис. 19.17. Просмотр сайта в браузере Safari на симуляторе iOS
Когда пользователь нажмет на ссылку, перед ним на экране откроется знакомый графический интерфейс Passbook. Пользователь сможет добавить полученный талон в Passbook.
См. также
Раздел 19.6.
19.8. Настройка возможности доступа к талонам в приложениях, работающих на устройстве с операционной системой iOS
Постановка задачи
Требуется развернуть приложение с поддержкой Passbook на устройстве с операционной системой iOS и гарантировать, что ваше приложение сможет читать талоны с цифровой подписью, имеющиеся на этом устройстве.
Решение
Создайте соответствующий профиль инициализации для вашего приложения. Он должен быть связан с ID приложения. Это приложение должно обладать доступом на работу с талонами.
Обсуждение
Необходимо подписывать приложения соответствующим профилем инициализации, который создан на том же портале, что и ID типа талона. Это требуется для того, чтобы вы могли считывать собственные талоны из приложения Passbook, установленного на пользовательском устройстве. Процесс проиллюстрирован на рис. 19.18.
Рис. 19.18. Процесс обеспечения доступа к талонам в приложении для iOS на устройстве с iOS
Итак, начнем! Предполагается, что на данном этапе у вас уже есть сертификат на разработку/распространение. Создадим идентификатор App ID для идентификатора типа талона (Pass Type ID), подготовленного нами в разделе 19.1. После этого займемся созданием соответствующего профиля инициализации для App ID. Сделайте вот что.
1. Перейдите в центр разработки для iOS (iOS Dev Center) в вашем браузере и зайдите на этот сайт под своим именем, если еще не сделали этого.
2. Перейдите в раздел Certificates, Identifiers & Profiles (Сертификаты, идентификаторы, профили).
3. Далее перейдите в раздел Identifiers (Идентификаторы), а затем в раздел App ID (Идентификатор приложения) и там нажмите экранную кнопку с символом +.
4. В поле Description (Описание) опишите ID вашего приложения. Эти сведения должны быть информативными для вас, вашей команды и организации.
5. В качестве значения Bundle Seed ID (Префикс идентификатора) укажите Use Team ID (Использовать ID команды).
6. В разделе Bundle Identifier (Идентификатор пакета) (суффикс App ID) укажите идентификатор пакета, записанный в стиле обратного доменного имени. В моем случае при работе с талоном, имеющим ID pass.pixolity.testingpasskit, идентификатор пакета App ID будет записываться как com.pixolity.testingpasskit.
7. Убедитесь, что установлен флажок Explicit App ID (Явный идентификатор приложения), и полностью введите в стиле обратного доменного имени идентификатор пакета приложения, который вы хотите создать. Я задал здесь значение com.pixolity.ios.cookbook.testingpasses, а мой идентификатор типа талона (Pass Type ID) ранее был задан как pass.pixolity.ios.cookbook.testingpasses. Идентификатор типа талона может и не совпадать с идентификатором пакета, но если такое совпадение соблюдается, то в будущем вам будет гораздо проще находить нужный идентификатор типа талона, если уже известен идентификатор приложения.
8. В разделе App Services (Сервисы приложения) на этой странице нужно обязательно установить флажок Passbook. Так вы откроете в вашем приложении доступ к книге талонов Passbook.
9. Когда сделаете это, нажмите кнопку Continue (Продолжить). На следующем экране, который откроется перед вами (рис. 19.19), вы увидите все значения, которые ввели на предыдущей странице. Просмотрите их еще раз внимательно и, если вас все устроит, нажмите кнопку Submit (Отправить).
Рис. 19.19. Обзор нового идентификатора приложения (App ID) перед интеграцией его с Passbook
10. Теперь, когда вы активизировали использование талонов для данного App ID, создадим профиль инициализации. Перейдите в подраздел Provisioning Profiles (Профили инициализации) раздела iOS Provisioning Profile (Профиль инициализации iOS).
11. Мы собираемся создать профиль инициализации для разработки, а не Ad Hoc (Специальная сборка). Поэтому в подразделе Provisioning (Инициализация) раздела Development (Разработка) нажмите кнопку +.
12. Откроется следующий экран. На нем выберите элемент iOS App Development (Разработка приложения для iOS) и нажмите кнопку Continue (Продолжить).
13. Теперь вам будет предложено выбрать идентификатор приложения (App ID) для вашего профиля. Выберите идентификатор приложения, созданный вами раньше в этом разделе книги, и нажмите кнопку Continue (Продолжить) (рис. 19.20).
Рис. 19.20. Выбор правильного идентификатора приложения для нового профиля инициализации, создаваемого для целей разработки
14. Теперь вы увидите список доступных сертификатов для разработки, которые есть у вас на портале. Выберите один или несколько сертификатов, с которыми хотите ассоциировать ваш профиль. Обычно принято ассоциировать профиль всего с одним сертификатом, но на портале, где трудится много программистов, у каждого из которых есть свой сертификат разработки, бывает необходимо создать такой профиль, который ассоциирован сразу с несколькими сертификатами. Сделав выбор, нажмите кнопку Continue (Продолжить).
15. Далее вы увидите список зарегистрированных устройств. Выберите из него те устройства, которые будут включены в ваш профиль. Сделав это, нажмите кнопку Continue (Продолжить).
16. На следующем экране система запросит у вас указать имя профиля. Дайте ему информативное имя, а затем нажмите кнопку Generate (Сгенерировать).
17. Когда ваш профиль будет сгенерирован, нажмите кнопку Download (Скачать), чтобы загрузить его на ваше устройство (рис. 19.21). После того как загрузка завершится, перетащите этот профиль в iTunes, чтобы установить его на вашем устройстве.
Рис. 19.21. Профиль Passbook готов к скачиванию
Существует несколько способов установки профиля инициализации в операционной системе OS X. Самый лучший и быстрый способ — просто перетащить профиль в iTunes. Профиль также можно установить, воспользовавшись Xcode. Какой бы способ вы ни выбрали, ни в коем случае не делайте двойного щелчка на профиле в ходе его установки. В случае двойного щелчка профиль установится на диске под совершенно невразумительным названием, и позже вам будет очень сложно найти нужный профиль среди множества других. Чтобы не засорять диск, пользуйтесь iTunes или Xcode для установки профилей инициализации. Все профили инициализации, установленные у вас на диске, можно просмотреть в файле ~/Library/MobileDevice/Provisioning Profiles/.
18. Теперь откройте ваш проект в Xcode. На вкладке Build Settings (Настройки сборки) выберите только что созданный профиль инициализации для отладочных сборок (Debug-only). То же самое можно сделать и для специальных сборок (Ad Hoc), но в схеме Release (Релиз) на вкладке Build Settings (Настройки сборки).
19. В Xcode рядом с вкладкой Build Settings (Настройки сборки) выберите Capabilities (Возможности), найдите там элемент Passbook и переведите его виртуальный переключатель в положение On (Включено) (рис. 19.22).
Рис. 19.22. Активизация Passbook в Xcode
20. Как только вы переведете переключатель для Passbook в положение On (Включено), Xcode свяжется с центром разработки и выберет оттуда все доступные для вас идентификаторы типа талона. В списке (рис. 19.23) выберите тот идентификатор типа талона, который вы создали ранее в этом разделе.
Рис. 19.23. Выбор корректного идентификатора типа талона в Xcode.
Вот мы и закончили настройку фреймворка Pass Kit! Осталось написать приложение, которое будет иметь доступ к талонам, расположенным на устройстве. Это приложение будет описано в разделе 19.9.
См. также
Разделы 19.6 и 19.7.
19.9. Взаимодействие с Passbook с помощью программирования
Постановка задачи
Требуется возможность программно взаимодействовать с талонами, установленными на пользовательском устройстве.
Решение
Включите в проект PassKit.framework и воспользуйтесь библиотекой PKPassLibrary, чтобы найти интересующие вас талоны. Талоны относятся к типу PKPass. Используя этот класс, вы сможете получать информацию о талонах.
Обсуждение
Для чтения этого раздела необходимо внимательно проработать раздел 19.8 и подготовить в Xcode проект для iOS, обладающий корректным профилем инициализации. Это нужно для доступа к вашим талонам, расположенным в пользовательской библиотеке Passbook.
Apple предоставила для iOS-разработчиков фреймворк PassKit.framework. Этот фреймворк позволяет взаимодействовать с талонами, которые пользователь установил на своем устройстве (устройствах). Чтобы можно было использовать этот фреймворк с применением новейшего компилятора LLVM, вам всего лишь потребуется импортировать в проект соответствующий обобщающий заголовок, вот так:
#import «AppDelegate.h»
#import
<# Остаток вашего кода находится здесь #>
Далее потребуется объявить закрытое свойство типа PKPassLibrary в файле реализации делегата нашего приложения. Вышеупомянутый класс из фреймворка PassKit.framework позволяет взаимодействовать с талонами, добавленными на устройство. Для считывания значений, таких как номер платформы, с которой отправляется поезд, и город отправления, вам также нужно знать ключи из файла pass.json, который вы создали в разделе 19.2. Итак, объявим и эти ключи, тоже в файле реализации делегата приложения:
#import «AppDelegate.h»
#import
@interface AppDelegate ()
@property (nonatomic, strong) PKPassLibrary *passLibrary;
@end
NSString *PassIdentifier = @"pass.pixolity.testingpasskit";
NSString *PassSerialNumber = @"p69f2J";
NSString *DepartureKey = @"departure";
NSString *DeparturePlatformKey = @"departurePlatform";
NSString *Arrival = @"arrival";
NSString *ArrivalPlatform = @"arrivalPlatform";
@implementation AppDelegate
<# Остаток вашего кода находится здесь #>
Великолепно! Написав этот код, вы теоретически получаете возможность доступа к библиотеке Passbook, расположенной на устройстве. Но погодите: а что делать, если на устройстве не установлена эта библиотека? Сначала нужно проверить, имеется ли библиотека Passbook на устройстве. Для этого используется метод класса isPassLibraryAvailable, относящийся к классу PKPassLibrary.
Далее нужно инстанцировать свойство passLibrary типа PKPassLibrary, а потом воспользоваться относящимся к библиотеке талонов методом экземпляра passWithPassTypeIdentifier: serialNumber:, чтобы найти искомый талон. Вот теперь понятно, почему среди различных ключей, относящихся к талону, мы, в частности, определяли идентификатор талона и его серийный номер. Вышеупомянутый метод вернет объект типа PKPass, который будет соответствовать вашему талону. Имея объект талона, вы можете считывать значения его ключей различными способами.
Ключи, задаваемые по умолчанию, в частности название организации и серийный номер, отображаются на свойства. Apple делает это за вас в классе PKPass. Однако если вы хотите получить доступ к значениям внутри primaryFields или в других подобных местах, то потребуется воспользоваться методом экземпляра localizedValueForFieldKey:, относящимся к классу PKPass. Мы сообщаем этому методу наши ключи, чтобы получить значения, ассоциированные с этими ключами. Далее показан небольшой фрагмент кода, позволяющий узнать информацию из талона, созданного в разделе 19.2: начальную и конечную точки маршрута, а также соответствующие железнодорожные платформы.
Код взят из файла реализации делегата нашего приложения.
#import «AppDelegate.h»
#import
@interface AppDelegate ()
@property (nonatomic, strong) PKPassLibrary *passLibrary;
@end
NSString *PassIdentifier = @"pass.pixolity.testingpasskit";
NSString *PassSerialNumber = @"p69f2J";
NSString *DepartureKey = @"departure";
NSString *DeparturePlatformKey = @"departurePlatform";
NSString *Arrival = @"arrival";
NSString *ArrivalPlatform = @"arrivalPlatform";
@implementation AppDelegate
— (void) displayPassInformation:(PKPass *)paramPass{
if (paramPass == nil){
NSLog(@"The given pass is nil.");
return;
}
NSLog(@"Departs From = %@",
[paramPass localizedValueForFieldKey: DepartureKey]);
NSLog(@"Departure Platform = %@",
[paramPass localizedValueForFieldKey: DeparturePlatformKey]);
NSLog(@"Arrives at = %@",
[paramPass localizedValueForFieldKey: Arrival]);
NSLog(@"Arrival Platform = %@",
[paramPass localizedValueForFieldKey: ArrivalPlatform]);
}
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
if ([PKPassLibrary isPassLibraryAvailable]){
self.passLibrary = [[PKPassLibrary alloc] init];
PKPass *pass =
[self.passLibrary passWithPassTypeIdentifier: PassIdentifier
serialNumber: PassSerialNumber];
[self displayPassInformation: pass];
} else {
/* Здесь можно выполнить еще какое-нибудь действие */
NSLog(@"The pass library is not available.");
}
self.window = [[UIWindow alloc]
initWithFrame: [[UIScreen mainScreen] bounds]];
// Точка переопределения для дополнительной настройки после запуска
приложения
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Идентификатор талона и серийный номер, указанные здесь, соответствуют талону, который я создал с помощью моего сертификата. Ваш серийный номер может быть таким же, но идентификатор талона определенно будет другим. Он должен быть информативен для вашей компании/на вашем портале инициализации.
См. также
Раздел 19.2.