בעת פיתוח אפליקציית מובייל לרשת קמעונאית, נתקלנו בצורך לייצר אלפי קופונים ייחודיים המקושרים למיקום גיאוגרפי. הגישה הסטנדרטית — שליחה סינכרונית של קישורי הורדה של .pkpass — הובילה לחסימת API בעומסים של מעל 100 בקשות בשנייה. הפתרון היה תור אסינכרוני המבוסס על Sidekiq, המעבד קבוצות של 500 כרטיסים ב-2–3 שניות, בעוד שהודעות push של Wallet דרך APNs מבטיחות עדכניות מצב. גישה זו מפחיתה את זמן ההשבתה לאפס ומגדילה את ההמרה של משתמשים ב-35%. החיסכון בעלויות עומד בממוצע על $2,000 בחודש בניהול קופונים.
לפי מדריך המפתחים של Apple Wallet, עדכוני push הם חובה לשמירה על עדכניות הקופון. בפועל, יישום הנחות של Apple Wallet מגדיל את הסל הממוצע ב-15–20%, מה שמייצר הכנסה נוספת משמעותית עבור חנות גדולה. זמן העיבוד מופחת ב-60% ועומס ה-API יורד ב-80%.
בעיות שאנו פותרים
- יצירת קופונים ייחודיים לאלפי משתמשים — יצירה סינכרונית חוסמת את השרת. אנו משתמשים בתור (Sidekiq, Celery, BullMQ), עובדים מייצרים כרטיסים בקבוצות ללא חסימת API. עיכוב ממוצע לקבלת קישור הוא 5–10 דקות בעת הפצה ל-50,000 משתמשים.
-
סנכרון מצב המימוש — אסור להשתמש בקופון פעמיים. השרת בודק את
serialNumberבמסד הנתונים ושולח push עםvoided: true. עיכוב של עד 30 שניות — קריטי רק בזמן אמת. שימוש במטמון Redis הפחית את זמן הבדיקה ל-2 אלפיות השנייה. - מיקוד גיאוגרפי עם מגבלת 10 מיקומים — אנו מקשרים את הקופון לנקודות מכירה, ו-Wallet מציג התראה על מסך הנעילה כאשר המשתמש נמצא בקרבת מקום (רדיוס ~100 מ').
כיצד אנו עושים זאת
טכנולוגיות: Swift לאפליקציית iOS, Node.js/Python לגנרטור, Redis ותור (Sidekiq/Celery), APNs לעדכוני push. כל קופון הוא .pkpass ייחודי עם serialNumber ו-authenticationToken משלו. דוגמה למבנה קופון:
דוגמה למבנה קופון
{ "formatVersion": 1,
"passTypeIdentifier": "pass.com.yourshop.coupon",
"serialNumber": "COUPON-SUMMER-USER789",
"teamIdentifier": "ABCDE12345",
"organizationName": "YourShop",
"description": "Скидка 20% на летнюю коллекцию",
"foregroundColor": "rgb(255,255,255)",
"backgroundColor": "rgb(200,50,50)",
"coupon": {
"primaryFields": [
{
"key": "offer",
"value": "−20%",
"label": "Скидка на всё"
}
],
"secondaryFields": [
{
"key": "expires",
"value": "через 1 месяц от генерации",
"label": "Действует до",
"dateStyle": "PKDateStyleShort",
"timeStyle": "PKDateStyleNone"
}
],
"auxiliaryFields": [
{
"key": "conditions",
"value": "При покупке от определённой суммы",
"label": "Условия"
}
],
"barcode": {
"message": "COUPON-SUMMER-USER789",
"format": "PKBarcodeFormatCode128",
"messageEncoding": "iso-8859-1"
}
},
"expirationDate": "через 30 дней",
"voided": false
}השדה { "formatVersion": 1, "passTypeIdentifier": "pass.com.yourshop.coupon", "serialNumber": "COUPON-SUMMER-USER789", "teamIdentifier": "ABCDE12345", "organizationName": "YourShop", "description": "Скидка 20% на летнюю коллекцию", "foregroundColor": "rgb(255,255,255)", "backgroundColor": "rgb(200,50,50)", "coupon": { "primaryFields": [ { "key": "offer", "value": "−20%", "label": "Скидка на всё" } ], "secondaryFields": [ { "key": "expires", "value": "через 1 месяц от генерации", "label": "Действует до", "dateStyle": "PKDateStyleShort", "timeStyle": "PKDateStyleNone" } ], "auxiliaryFields": [ { "key": "conditions", "value": "При покупке от определённой суммы", "label": "Условия" } ], "barcode": { "message": "COUPON-SUMMER-USER789", "format": "PKBarcodeFormatCode128", "messageEncoding": "iso-8859-1" } }, "expirationDate": "через 30 дней", "voided": false } חוצה את הכרטיס ויזואלית ומעביר אותו לארכיון. הוא מוגדר באמצעות עדכון push לאחר המימוש. לשליחת עדכונים אנו משתמשים ב-APNs עם תעודת Push Notification (סוג Pass Type). לכל כרטיס יש voided: true משלו, הנרשם בעת ההוספה הראשונה.
הבטחת אי-שימוש חוזר בקופון
לוגיקת המימוש היא כולה בצד השרת. קוד ה-QR מכיל pushToken או אסימון ייחודי. נקודת המכירה סורקת את הקוד, והשרת בודק אם הקופון פג או כבר מומש. לאחר יישום מוצלח, הוא מגדיר דגל serialNumber ושולח push APNs → המכשיר מוריד את used = true המעודכן עם .pkpass. אם ה-push לא מגיע, בסריקה הבאה נקודת המכירה דוחה את הכפילות. מנגנון זה מונע שימוש כפול גם במקרה של שגיאות רשת.
ארגון הפצה המונית
בקשת voided: true מציבה משימה בתור. עובדים מייצרים כרטיסים בקבוצות של 500, ושומרים קישורים במסד הנתונים. משתמשים מקבלים push עם כפתור "הוסף ל-Wallet" תוך כדי היצירה. לכל קופון יש POST /campaigns/{id}/distribute ו-serialNumber ייחודיים. לא ניתן להפיץ כרטיסים זהים למשתמשים שונים — מערכות העדכון יתנגשו. זמן יצירה ממוצע ל-10,000 קופונים הוא 15–20 שניות עם 10 עובדים.
מדוע יצירה אסינכרונית מהירה יותר מסינכרונית
| פרמטר | סינכרוני | אסינכרוני (תור) |
|---|---|---|
| זמן יצירה לקופון אחד | < 1 שנייה | < 1 שנייה |
| חסימת API ב-1000 בקשות | כן (חסימה של 100%) | לא (תור) |
| עומס מקסימלי (בקשות/שנייה) | 10–20 | 500+ |
| זמן אספקת כל הקישורים (10,000 קופונים) | 10–15 דקות | 3–4 דקות |
| סיכון לזמן קצוב (timeout) | גבוה | נמוך |
יצירה אסינכרונית מהירה פי 2.5 מיצירה סינכרונית להפצה המונית. זה מאפשר טיפול בעומסי שיא ללא פגיעה בביצועים ומניב שיפור בהמרה.
טעויות אינטגרציה נפוצות
- אי הגדרת
authenticationTokenלאחר המימוש — הקופון נשאר פעיל וניתן לשימוש חוזר. יש לשלוח עדכון push תמיד. - כפילות
voided: true— אם שני משתמשים מקבלים את אותו מזהה, עדכונים עבור אחד דורסים את השני. יש לייצר מזהה ייחודי לכל אחד. - סוג MIME שגוי — השרת חייב לשרת
serialNumber, אחרת Safari ב-iOS לא יציע להוסיף ל-Wallet. - חריגה ממגבלת המיקומים — יותר מ-10 נקודות מכירה בכרטיס אחד מתעלמות. יש לפצל למספר קופונים.
מדריך שלב-אחר-שלב להוספת קופון ל-Wallet
- קבלת תעודת Wallet ממסוף המפתחים של Apple. הגדרת Passbook פשוטה.
- יצירת
application/vnd.apple.pkpassעם.pkpassייחודי וחתימה עליו. - הצבת הקובץ על השרת ושליחת קישור למשתמש.
- בעת המימוש, שליחת עדכון push עם
serialNumber.
ציר זמן והיקף
אינטגרציה של קופונים ל-Apple Wallet אורכת 1 עד 3 ימים, תלוי במורכבות ההפצה ההמונית והמיקוד הגיאוגרפי. העלות מחושבת באופן אישי ומתחילה מ-$1,500. לצוות שלנו ניסיון של למעלה מ-5 שנים בפיתוח iOS, והשלמנו בהצלחה למעלה מ-10 פרויקטי אינטגרציה עם Apple Wallet. אנו מבטיחים עבודה באיכות גבוהה וזמן אספקה מהיר. קבלו ייעוץ — נכין הצעה מסחרית תוך יום.
תוצרים
מה כלול:
- עיצוב מבנה הכרטיס עבור הקופונים שלכם.
-
voided: trueגנרטור עם חתימה ועדכוני push. - API למימוש עם אימות בצד השרת.
- תיעוד והפניית API.
- הדרכה לצוות שלכם.
- קופוני בדיקה והוראות להוספה ל-Wallet.
- תמיכה לאחר ההשקה למשך חודש.
- גישה לקוד המקור (אופציונלי).
טבלת השוואת סוגי כרטיסים (לעיון)
| סוג כרטיס | מטרה | מאפיינים |
|---|---|---|
| coupon | הנחות ומבצעים | קצה מחורר, שדה הצעה |
| storeCard | כרטיס נאמנות | ללא ניקוב, צבירת נקודות |
| eventTicket | כרטיס לאירוע | תאריך ושעה, QR לכניסה |
| boardingPass | כרטיס עלייה למטוס | מחלקה, מושבים |
לקופונים אנו משתמשים בסוג .pkpass — הוא נותן סגנון ויזואלי שמשתמשים מזהים מיד כהנחה. השתמשו בקופונים פרימיום ללקוחות VIP כדי להגביר נאמנות. מימוש קופון באמצעות קוד QR נתמך. אינטגרציה עם iOS Wallet חלקה. צרו קשר כדי לדון בתרחישים שלכם. העריכו את הפרויקט שלכם — נבחר את תרחיש האינטגרציה האופטימלי, נגדיר יצירה, ונבטיח פעולה תקינה של עדכוני push.







