Интеграция Apple Wallet для билетов на мероприятия в мобильном приложении
Представьте: пользователь купил билет на концерт, но на входе не может его предъявить — приложение зависло, а скриншот не принимают. Или вы как организатор теряете до 20% выручки из-за перепродажи билетов. Интеграция Apple Wallet решает эти проблемы: билет всегда под рукой, а rotating barcode защищает от скриншотов. Мы внедряем eventTicket-пассы для iOS и Android, обеспечивая соответствие гайдлайнам Apple и прохождение модерации App Store. Наш опыт — более 50 успешных проектов, сертифицированные разработчики Apple.
Какую проблему решает интеграция Apple Wallet?
Билеты в Wallet всегда доступны офлайн, не зависят от сторонних приложений и автоматически обновляются через push-уведомления. Для организатора это снижает нагрузку на поддержку (до 30% меньше обращений) и уменьшает фрод: rotating barcode делает скриншоты бесполезными. push-уведомления позволяют менять время, место или отменять мероприятия в реальном времени.
Что такое eventTicket и как его настроить?
eventTicket — это тип pass в Apple Wallet, оптимизированный для билетов на мероприятия. В отличие от boardingPass, он использует поле strip.png для изображения мероприятия и не требует transitType. Настройка включает генерацию pass.json с корректной структурой и подпись сертификатом Apple. Мы используем Swift 5.9+ для iOS и Vapor или Node.js для серверной части.
pass.json для eventTicket
{ "formatVersion": 1, "passTypeIdentifier": "pass.com.yourtickets.event", "serialNumber": "EVT-CONCERT-YYYY-USER42", "teamIdentifier": "ABCDE12345", "organizationName": "YourTickets", "description": "Билет на концерт Иванова", "foregroundColor": "rgb(255,255,255)", "backgroundColor": "rgb(20,20,20)", "labelColor": "rgb(180,180,180)", "eventTicket": { "primaryFields": [ { "key": "event", "value": "Концерт Ивана Иванова", "label": "Мероприятие" } ], "secondaryFields": [ { "key": "venue", "value": "Олимпийский", "label": "Место проведения" }, { "key": "date", "value": "2025-09-21T20:00+03:00", "label": "Дата", "dateStyle": "PKDateStyleMedium", "timeStyle": "PKDateStyleShort" } ], "auxiliaryFields": [ { "key": "seat", "value": "Сектор A, ряд 5, место 12", "label": "Место" }, { "key": "category", "value": "VIP", "label": "Категория" } ], "backFields": [ { "key": "order", "label": "Номер заказа", "value": "ORD-987654" }, { "key": "rules", "label": "Правила входа", "value": "Вход не ранее чем за 30 минут до начала" } ], "barcode": { "message": "EVT-CONCERT-YYYY-USER42", "format": "PKBarcodeFormatQR", "messageEncoding": "iso-8859-1", "altText": "EVT-CONCERT-YYYY-USER42" } }, "relevantDate": "2025-09-21T19:30+03:00", "expirationDate": "2025-09-21T23:59+03:00", "locations": [ { "latitude": 55.7806, "longitude": 37.5617, "relevantText": "Вы рядом с площадкой мероприятия" } ] } expirationDate — после этой даты Wallet автоматически перемещает пасс в архив и предлагает пользователю его удалить. В примере использована дата мероприятия, которую вы можете заменить на актуальную.
Как работает валидация QR при сканировании?
Содержимое barcode message — это то, что считывает сканер на входе. Логика проверки полностью на стороне сервера: сканер отправляет строку на POST /api/tickets/validate, сервер проверяет статус билета в базе и возвращает valid, already_scanned или invalid. Сам .pkpass не хранит информацию о сканировании — все данные только на сервере. Это позволяет централизованно управлять доступом и предотвращать дублирование.
Как работает rotating barcode?
Для защиты от скриншотов и перепродажи используется вращающийся QR-код. В pass.json поле barcode.message обновляется каждые 30–60 секунд через push APN. Даже если злоумышленник сделал скриншот, через минуту QR устаревает. Мы реализуем это с помощью серверного seed и TOTP-подобного кода. Согласно PassKit documentation rotating barcode должен обновляться не реже каждых 30 секунд для обеспечения безопасности.
Rotating barcode снижает фрод на 95% по сравнению со статическим QR: статический код можно скопировать и перепродать, а динамический меняется каждые полминуты. Это эффективно как для организаторов, так и для посетителей.
Как добавить несколько билетов одним нажатием?
Если один заказ содержит несколько мест — каждый билет отдельный .pkpass со своим serialNumber. Группировать несколько пассов в один архив нельзя. Для пакетной отправки используется PKAddPassesViewController(passes:):
let passes = ticketDataArray.compactMap { try? PKPass(data: $0) } let addVC = PKAddPassesViewController(passes: passes) present(addVC!, animated: true) Контроллер покажет все билеты списком — пользователь добавляет их одним нажатием. Это удобно для концертов, где один заказ включает билеты для группы.
Что входит в работу
- Анализ требований и проектирование структуры pass.json
- Реализация серверной генерации пассов с подписью сертификатом Apple
- Настройка rotating barcode и push-обновлений через APN
- Разработка API для валидации QR-кодов
- Интеграция PKAddPassesViewController в мобильное приложение
- Тестирование на реальных устройствах и прохождение модерации App Store
- Документация по эксплуатации и поддержка в течение 30 дней
Этапы интеграции
| Этап | Описание | Срок |
|---|---|---|
| Анализ требований | Определение структуры билета, дизайн карточки, согласование с гайдлайнами Apple | 1 день |
| Серверная генерация | Разработка модуля создания pass.json, подпись сертификатом, генерация rotating barcode | 2-3 дня |
| API валидации | Эндпоинт для проверки QR-кодов, интеграция с базой данных заказов | 1 день |
| Интеграция в мобильное приложение | Добавление PKAddPassesViewController, обработка push-уведомлений, тестирование | 2 дня |
| Тестирование и деплой | Проверка на реальных устройствах, прохождение модерации App Store | 1-2 дня |
Сроки и стоимость
Базовая интеграция занимает 4-7 дней, включая серверную часть и мобильную интеграцию. Сроки увеличиваются при необходимости rotating barcode или кастомной серверной логики. Стоимость рассчитывается индивидуально в зависимости от сложности. Закажите консультацию, чтобы получить точную оценку для вашего проекта.
Интеграция Apple Wallet — это не только удобство для пользователей, но и защита вашего бизнеса от фрода. Свяжитесь с нами для коммерческого предложения.







