Интеграция 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 — это не только удобство для пользователей, но и защита вашего бизнеса от фрода. Свяжитесь с нами для коммерческого предложения.







