שילוב Apple Wallet לכרטיסי אירועים באפליקציה הניידת שלך
תארו לעצמכם: משתמש קנה כרטיס להופעה, אבל בכניסה הוא לא יכול להציג אותו — האפליקציה קפאה, וצילום מסך לא מתקבל. או שאתם כמארגנים מפסידים עד 20% מההכנסות בגלל מכירה חוזרת של כרטיסים. שילוב Apple Wallet פותר את הבעיות האלה: הכרטיס תמיד בהישג יד, וברקוד מסתובב מגן מפני צילומי מסך. אנו מיישמים מעברי eventTicket עבור iOS ו-Android, תוך עמידה בהנחיות Apple ובבדיקות App Store. רקורד שלנו: מעל 50 פרויקטים מוצלחים ומפתחי Apple מוסמכים.
איזו בעיה פותר שילוב Apple Wallet?
כרטיסי Wallet זמינים תמיד במצב לא מקוון, בלתי תלויים באפליקציות צד שלישי, ומתעדכנים אוטומטית באמצעות התראות push. עבור המארגן, זה מפחית את עומס התמיכה (עד 30% פחות פניות) וממזער הונאות: ברקוד מסתובב הופך צילומי מסך לחסרי תועלת. התראות push מאפשרות שינויים בזמן אמת בשעה, במקום או ביטולים.
מה זה eventTicket ואיך מגדירים אותו?
eventTicket הוא סוג מעבר ב-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": "Вы рядом с площадкой мероприятия"
}
]
}ה-{ "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": "Вы рядом с площадкой мероприятия" } ] } — לאחר תאריך זה, Wallet מעביר אוטומטית את המעבר לארכיון ומציע למשתמש למחוק אותו. הדוגמה משתמשת בתאריך האירוע, אותו תוכלו להחליף בתאריך בפועל.
איך עובד אימות QR בעת סריקה?
תוכן הברקוד expirationDate הוא מה שהסורק קורא בכניסה. לוגיקת האימות היא כולה בצד השרת: הסורק שולח את המחרוזת ל-message, השרת בודק את מצב הכרטיס במסד הנתונים ומחזיר POST /api/tickets/validate, valid או already_scanned. ה-invalid עצמו אינו מאחסן מידע סריקה — כל הנתונים נמצאים רק בשרת. זה מאפשר בקרת כניסה מרכזית ומונע שכפול.
איך עובד ברקוד מסתובב?
כדי להגן מפני צילומי מסך ומכירה חוזרת, נעשה שימוש ב-QR מסתובב. ב-.pkpass, השדה pass.json מתעדכן כל 30–60 שניות באמצעות APN push. גם אם תוקף צילם מסך, ה-QR הופך למיושן תוך דקה. אנו מיישמים זאת באמצעות seed בצד השרת וקוד דמוי TOTP. לפי תיעוד PassKit, ברקוד מסתובב צריך להתעדכן לפחות כל 30 שניות לצורך אבטחה.
ברקוד מסתובב מפחית הונאות ב-95% בהשוואה ל-QR סטטי: קוד סטטי ניתן להעתיק ולמכור מחדש, בעוד שקוד דינמי משתנה כל חצי דקה. זה יעיל גם למארגנים וגם למבקרים.
איך מוסיפים מספר כרטיסים בנגיעה אחת?
אם הזמנה אחת כוללת מספר מושבים — כל כרטיס הוא barcode.message נפרד עם .pkpass משלו. לא ניתן לקבץ מספר מעברים לארכיון אחד. למשלוח בכמות, השתמשו ב-serialNumber:
let passes = ticketDataArray.compactMap { try? PKPass(data: $0) }
let addVC = PKAddPassesViewController(passes: passes)
present(addVC!, animated: true)הבקר מציג את כל הכרטיסים כרשימה — המשתמש מוסיף אותם בנגיעה אחת. זה נוח להופעות שבהן הזמנה אחת כוללת כרטיסים לקבוצה.
מה כלול
- ניתוח דרישות ועיצוב מבנה pass.json
- יצירת מעברים בצד השרת עם חתימת תעודת Apple
- ברקוד מסתובב ועדכוני push באמצעות הגדרת APN
- פיתוח API לאימות קוד QR
- שילוב PKAddPassesViewController באפליקציה הניידת
- בדיקות על מכשירים אמיתיים ועמידה בבדיקות App Store
- תיעוד תפעולי ותמיכה ל-30 יום
שלבי השילוב
| שלב | תיאור | משך |
|---|---|---|
| ניתוח דרישות | הגדרת מבנה הכרטיס, עיצוב הכרטיס, התאמה להנחיות Apple | יום אחד |
| יצירה בצד השרת | פיתוח מודול יצירת pass.json, חתימת תעודה, ברקוד מסתובב | 2-3 ימים |
| API לאימות | נקודת קצה לבדיקת QR, שילוב עם מסד נתוני ההזמנות | יום אחד |
| שילוב באפליקציה הניידת | הוספת PKAddPassesViewController, טיפול בהתראות push, בדיקות | יומיים |
| בדיקות והשקה | בדיקות על מכשירים אמיתיים, עמידה בבדיקות App Store | 1-2 ימים |
לוחות זמנים ועלות
שילוב בסיסי אורך 4–7 ימים, כולל צד שרת ושילוב נייד. לוחות הזמנים מתארכים אם נדרש ברקוד מסתובב או לוגיקת שרת מותאמת אישית. העלות מחושבת באופן אישי לפי מורכבות. צרו קשר לייעוץ כדי לקבל הערכה מדויקת לפרויקט שלכם.
שילוב Apple Wallet הוא לא רק נוחות למשתמשים אלא גם הגנה מפני הונאות לעסק שלכם. פנו אלינו להצעה מסחרית.







