שילוב התראות APNs: מפתחות, טוקנים, מסירה

הודעות Push ב-iOS עובדות לרוב בסביבת פיתוח אך נכשלות בייצור—הסיבה היא כמעט תמיד תצורה שגויה של מפתחות או סביבה. אנחנו מבצעים אינטגרציית APNs במפתח מלא, החל מבחירת שיטת האימות ועד למסירה אמינה במכשירים אמיתיים. הצוות שלנו מטפל בכל המחזור—ביקורת, תצורה, הטמעה ותמיכה שוטפת—כך שהודעות מגיעות באופן אמין.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
שילוב התראות APNs: מפתחות, טוקנים, מסירה
בינוני
מ- 1 יום עד 3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

שילוב התראות APNs: מפתחות, טוקנים, משלוח

לאחרונה, לקוח מתחום הפינטק נתקל בעיכובים במשלוח התראות push של עד 30 דקות עקב שימוש לא נכון ב-push שקט. תיקנו את המשלוח תוך יומיים. מקרים כאלה נפוצים: התראות push ב-iOS נראות פשוטות עד שהן עובדות בסימולטור אבל נכשלות במכשיר אמיתי, או עובדות בסביבת פיתוח אבל נעלמות בסביבת production. שורש הבעיה כמעט תמיד זהה: הגדרת תעודה שגויה או אי-התאמה בין סביבות (sandbox לעומת production). APNs מחמיר — כל אי-התאמה מובילה לאובדן שקט של התראות ללא שגיאה בצד הלקוח.

במשך יותר מחמש שנים, עזרנו לעשרות לקוחות להקים משלוח push יציב — מהתראות פשוטות ועד התראות עשירות עם תוכן מותאם אישית. הבעיות תמיד זהות: תעודות מיושנות, entitlements שנשכחו, מחזור חיים של טוקנים שלא טופל. בואו נעבור על מחזור השילוב המלא: מהפקת מפתח ועד טיפול בהתראות במצב foreground ו-background.

באיזו שיטת אימות לבחור: p8 או p12?

Apple תומכת בשתי שיטות אימות עבור APNs. בואו נשווה:

פרמטר מפתח אימות APNs (.p8) תעודת APNs (.p12)
סוג טוקן JWT תעודת SSL
תוקף קבוע (עד לביטול) שנה אחת
סביבות מפתח אחד ל-sandbox ו-production תעודות נפרדות
קישור כל החשבון Bundle ID ספציפי
מורכבות ניהול נמוכה (0 חידושים שנתיים) גבוהה (חידוש אחד בשנה)

מפתח p8 דורש בערך פי 3 פחות מאמץ תחזוקה מאשר p12: אין צורך להחליף אותו, אין צורך במעבר בין סביבות. עבור כל פרויקט חדש, אנחנו תמיד בוחרים ב-.p8 דרך Apple Developer Console → Certificates, Identifiers & Profiles → Keys.

הגדרת האפליקציה: מהרשמה ועד טיפול בטוקן

// AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UNUserNotificationCenter.current().delegate = self
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { granted, error in
        guard granted else { return }
        DispatchQueue.main.async {
            UIApplication.shared.registerForRemoteNotifications()
        }
    }
    return true
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    // Отправляем token на сервер
    NotificationService.shared.registerToken(tokenString)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("APNs registration failed: \(error)")
}

מפתחים רבים משמיטים את // AppDelegate.swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { granted, error in guard granted else { return } DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } return true } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() // Отправляем token на сервер NotificationService.shared.registerToken(tokenString) } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { print("APNs registration failed: \(error)") } — בלעדיו, כשלי הרשמה שקטים לא מתועדים. הקפידו ליישם אותו ולדווח על השגיאה לאנליטיקה שלכם.

ב-Xcode: Target → Signing & Capabilities → + Capability → Push Notifications. זה מוסיף את didFailToRegisterForRemoteNotificationsWithError ל-aps-environment. הגדירו אותו כ-.entitlements עבור debug, וכ-development עבור release. אי-התאמה כאן היא הגורם הנפוץ ביותר ל-BadDeviceToken. הוסיפו גם Background Modes → Remote notifications אם אתם צריכים עיבוד התראות ברקע.

טוקן המכשיר משתנה ב-100% מהמקרים לאחר התקנה מחדש של האפליקציה, בכ-20% לאחר שחזור מגיבוי, ובכ-10% לאחר עדכון iOS. השרת חייב לעדכן את הטוקן בכל קריאה ל-production. APNs מחזיר שגיאה 410 Gone בעת שליחה לטוקן מיושן — השרת חייב למחוק את הטוקן הזה ממאגר הנתונים. התעלמות משגיאה זו מובילה להצטברות של טוקנים מתים ולירידה באחוזי המשלוח.

סוגי התראות push

התראה סטנדרטית:

{
  "aps": {
    "alert": {
      "title": "Новое сообщение",
      "body": "Иван написал вам"
    },
    "badge": 3,
    "sound": "default"
  },
  "userId": "u123",
  "messageId": "m456"
}

לגודל המקסימלי של התראה סטנדרטית הוא 4096 בתים. לתוכן גדול יותר, השתמשו בהתראות עשירות.

Push שקט (עדכון רקע ללא ממשק משתמש):

{ "aps": { "content-available": 1 }, "syncType": "messages" } 

Push שקט דורש Background Modes → Remote notifications. ב-iOS 13 ומעלה, Apple מגביל push שקט ל-3 בשעה — אל תשתמשו בו כתחליף לבדיקות תקופתיות. משלוח APNs בדרך כלל מהיר פי 50 ממרווח בדיקה של 5 דקות.

איך לשנות התראות לפני הצגתן?

כדי לשנות התראות לפני הצגתן (פענוח, הורדת תמונה), השתמשו ב-Notification Service Extension. זהו target נפרד ב-Xcode שמטפל בהתראות עם didRegisterForRemoteNotificationsWithDeviceToken ב-payload:

class NotificationService: UNNotificationServiceExtension {
    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        guard let bestAttempt = request.content.mutableCopy() as? UNMutableNotificationContent,
              let attachmentURL = request.content.userInfo["imageUrl"] as? String,
              let url = URL(string: attachmentURL) else {
            contentHandler(request.content)
            return
        }
        // Загружаем изображение и прикрепляем
        downloadAttachment(from: url) { attachment in
            if let attachment {
                bestAttempt.attachments = [attachment]
            }
            contentHandler(bestAttempt)
        }
    }
}

ל-Extension יש timeout של 30 שניות. אם הוא לא מסיים בזמן, APNs מציג את ההתראה המקורית ללא שינוי. ה-payload הכולל להתראות עשירות יכול להגיע עד 5 MB (כולל הקובץ המצורף).

אפליקציה יכולה לקבל התראות במצב foreground, background, ומצב מסוים. כל מצב דורש טיפול שונה. במצב foreground, השתמשו ב-{ "aps": { "alert": { "title": "Новое сообщение", "body": "Иван написал вам" }, "badge": 3, "sound": "default" }, "userId": "u123", "messageId": "m456" } כדי להציג באנר או לעבד נתונים. במצב background ובמצב מסוים, ההתראות מוצגות אוטומטית על ידי המערכת, אבל אם אתם צריכים להריץ קוד, השתמשו ב-{ "aps": { "content-available": 1 }, "syncType": "messages" } או ב-push שקט.

ניפוי שגיאות ושגיאות נפוצות

  • סימולטור: APNs עובד רק על מכשירים פיזיים. לבדיקות, השתמשו בקבצי .apns או במכשיר אמיתי.
  • Console.app: סננו לפי תהליכי mutable-content: 1 ו-class NotificationService: UNNotificationServiceExtension { override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { guard let bestAttempt = request.content.mutableCopy() as? UNMutableNotificationContent, let attachmentURL = request.content.userInfo["imageUrl"] as? String, let url = URL(string: attachmentURL) else { contentHandler(request.content) return } // Загружаем изображение и прикрепляем downloadAttachment(from: url) { attachment in if let attachment { bestAttempt.attachments = [attachment] } contentHandler(bestAttempt) } } } — אלה מכילים לוגים של דמון APNs.
  • Instruments → Push Notifications: עקבו אחר המשלוח.

שגיאות APNs נפוצות:

סטטוס HTTP קוד שגיאה סיבה פתרון
400 BadDeviceToken טוקן לא תקין בדקו את הסביבה (sandbox/production) ואת טריות הטוקן
410 Unregistered טוקן מיושן הסירו את הטוקן ממאגר הנתונים
403 ExpiredProviderToken טוקן JWT פג תוקף (עבור p8) רעננו את המפתח או צרו טוקן חדש
429 TooManyRequests חריגה ממגבלת קצב הגדילו את המרווח בין שליחות

תהליך ולוח זמנים

  1. ניתוח: אנו לומדים את הארכיטקטורה שלכם ואת דרישות ה-push.
  2. עיצוב: בחירת שיטת אימות, הגדרת סוגי התראות.
  3. יישום: הגדרת תעודות, קוד אפליקציה וצד שרת.
  4. בדיקות: אימות משלוח במכשירים אמיתיים בכל המצבים.
  5. פריסה: פרסום ל-App Store, ניטור שגיאות.

שילוב APNs בסיסי עם התראות alert: יום אחד. עם התראות עשירות, push שקט, Extension ומחזור חיים מלא של טוקנים: 2–3 ימים.

מה כלול?

ההתקנה כוללת: יצירת מפתח אימות APNs (.p8), הוספת Capabilities ו-Entitlements, הרשמה ומחזור חיים מלא של טוקנים, טיפול במצבי foreground/background/מצב מסוים, Notification Service Extension להתראות עשירות, push שקט לסנכרון רקע, שילוב צד שרת לאחסון ושליחת טוקנים עם טיפול בשגיאות APNs.

השילוב שלנו מפחית עלויות פיתוח בעד 40% בהשוואה ליישום עצמאי. העלות האופיינית לשילוב מלא מתחילה ב-$2,500 (חיסכון של כ-$1,667 בהשוואה לפיתוח פנימי בהנחת תקורה של 40%). צרו קשר כדי לדון בפרטי הפרויקט שלכם — נעריך את המורכבות ואת לוח הזמנים. בקשו ייעוץ על שילוב APNs עוד היום — הניסיון שלנו עם יותר מ-50 פרויקטים מבטיח משלוח אמין.

פרטים נוספים: עלויות שילוב אופייניות
  • הגדרת התראות בסיסיות: $1,500
  • התראות עשירות עם Extension: $2,000
  • שילוב מלא עם push שקט: $2,500
  • חיסכון לעומת פיתוח פנימי: 30-40%

תיעוד מפתחים של Apple: UserNotifications