How to Build Push Notifications with Swift iOS Step by Step

Complete step-by-step tutorial to build iOS push notifications in Swift, from Apple Developer Portal setup to APNs backend integration.

Published: March 08, 2026

Category: Tech & Development

Introduction

Building a complete push notification system for an iOS app involves coordinating Xcode capabilities, Apple Developer portal configuration, a backend server, and APNs. This step-by-step tutorial from GSoft Technologies brings it all together, guiding you through the complete implementation from zero to a working push notification pipeline for your Swift iOS app.

What is a Push Notification Pipeline for iOS?

A push notification pipeline for iOS consists of four components: your iOS app (Swift) that registers for notifications; Apple Push Notification Service (APNs) which routes notifications securely; your backend server that triggers notification requests; and the Apple Developer Portal where you configure app identifiers and APNs authentication keys.

Key Features / Why It Matters

  • User Retention: Timely notifications bring users back to your app, directly improving retention on iOS and Android.
  • Backend-Triggered Events: Your server pushes updates the moment something important happens.
  • Segmented Campaigns: Store device tokens with user metadata to send targeted notifications.
  • Secure Communication: APNs uses TLS/SSL to encrypt all notification traffic.

Step-by-Step: How to Build Push Notifications with Swift/iOS

Step 1 — Apple Developer Portal Setup

Log into developer.apple.com. Under Identifiers, select your App ID and enable Push Notifications. Go to Keys, create a new key, enable APNs, and download the .p8 file. Note your Key ID and Team ID.

Step 2 — Enable Push Notifications in Xcode

Select your app target → Signing & Capabilities → click + Capability → add Push Notifications. Also add Background Modes and check Remote notifications for silent pushes.

Step 3 — Request Permission & Register with APNs

import UIKitimport UserNotifications@mainclass AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {    func application(_ application: UIApplication,                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {        UNUserNotificationCenter.current().delegate = self        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in            guard granted else { return }            DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() }        }        return true    }}

Step 4 — Capture & Send Device Token to Backend

func application(_ application: UIApplication,                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {    let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()    var request = URLRequest(url: URL(string: "https://api.yourserver.com/devices/register")!)    request.httpMethod = "POST"    request.setValue("application/json", forHTTPHeaderField: "Content-Type")    request.httpBody = try? JSONEncoder().encode(["device_token": tokenString, "platform": "ios"])    URLSession.shared.dataTask(with: request).resume()}

Step 5 — Backend: Send Push via APNs (Node.js)

const apn = require('apn');const provider = new apn.Provider({  token: { key: './AuthKey.p8', keyId: 'YOUR_KEY_ID', teamId: 'YOUR_TEAM_ID' },  production: false});const notification = new apn.Notification();notification.alert = { title: 'Hello from GSoft!', body: 'Your notification system is working.' };notification.topic = 'com.yourcompany.yourapp';provider.send(notification, deviceToken).then(result => console.log(result));

Step 6 — Handle Notifications In-App

func userNotificationCenter(_ center: UNUserNotificationCenter,                             willPresent notification: UNNotification,                             withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {    completionHandler([.banner, .badge, .sound])}

Best Practices

  • Store Tokens Per User: A user may have multiple devices. Store all tokens per user ID.
  • Handle APNs Feedback: Remove stale or invalid tokens automatically from your backend.
  • Use Correct Environments: Dev builds use sandbox; App Store builds use production APNs.
  • Localize Content: Use loc-key and loc-args for localized notification strings.

Real-World Use Cases at GSoft Technologies

GSoft Technologies has built end-to-end push notification pipelines for e-commerce, healthcare, fintech, and media clients. Our backend team uses Node.js or Python with device tokens stored in PostgreSQL, integrated with real-time event streams. For a fintech client, we built multi-channel notifications via APNs for iOS, FCM for Android, and SMS fallback.

Conclusion

Building a complete push notification system for Swift iOS is manageable once you understand the pieces. Following this step-by-step guide gives you a production-ready foundation for any mobile app development project. Contact GSoft Technologies to build your next iOS project — our experts will guide you from setup to a fully integrated push notification system.

Back to Blog | Home | Services | Contact Us