// // ViewController.swift // PushNotifications // // Created by Apple on 17/10/2023. import UIKit import FirebaseMessaging import FirebaseAuth class ViewController: UIViewController { @IBOutlet weak var notificationLabel: UILabel! var fcmToken = "" override func viewDidLoad() { super.viewDidLoad() getFcmToken() } @IBAction func sendNotificationPressed(_ sender: Any) { sendNotification(fcmToken) } func getFcmToken() { if let token = Messaging.messaging().fcmToken { print("fcm : ", token) fcmToken = token self.notificationLabel.text = "Token Found : \(token)" } else { print("no token") self.notificationLabel.text = "no token" } } class func instantiateVC() -> ViewController { let storyboard = UIStoryboard(name: "Main", bundle: nil) let controller = storyboard.instantiateViewController(withIdentifier:"ViewController") as! ViewController return controller } @objc func didReceivePushNotification(_ notification: Notification) { if let userInfo = notification.userInfo, let message = userInfo["message"] as? String { // Update the UI with the received message notificationLabel.text = message } } deinit { // Remove the observer when the view controller is deallocated NotificationCenter.default.removeObserver(self) } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) { if let aps = userInfo["aps"] as? [String: Any], let message = aps["alert"] as? String { NotificationCenter.default.post(name: NSNotification.Name(rawValue: "PushNotificationReceived"), object: nil, userInfo: ["message": message]) } } func sendNotification(_ token : String) { // Define the FCM server URL let fcmURL = URL(string: "https://fcm.googleapis.com/fcm/send")! // Prepare the notification payload let notificationBody: [String: Any] = [ "notification": [ "title": "New Notification", "body": "Notfication Received", ], "to": token, // Replace with the target device token or topic ] // Convert the payload to JSON data guard let jsonData = try? JSONSerialization.data(withJSONObject: notificationBody) else { print("Error creating JSON data") return } // Create an HTTP request var request = URLRequest(url: fcmURL) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("key=AAAAu-cOuBM:APA91bGgioW1_SBuSGDRVT-iDaPdvDARJCADKdJLbQIo9NmwEXmHx4wA_NcpB9fV6iZWOWrxPN3jWHIfkXYmVwRqi6xsZH_SfVphkxHU9xTrbIZM_gZDmjc9TRrz8vigBPhG5IRUjQa2", forHTTPHeaderField: "Authorization") // Replace with your FCM server key // Set the request body with the JSON data request.httpBody = jsonData // Perform the request let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Error sending notification: \(error)") return } if let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) { print("Notification sent successfully") } else { print("Failed to send notification. Status code: \((response as? HTTPURLResponse)?.statusCode ?? -1)") } } task.resume() } } import UIKit import UserNotifications import Firebase import FirebaseCore import FirebaseMessaging @main class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? let gcmMessageIDKey: String = "gcm.message_id" func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() Thread.sleep(forTimeInterval: 0) self.registerForNotifications(application: application) UIApplication.shared.applicationIconBadgeNumber = 0 let uid = Auth.auth().currentUser?.uid ?? "" print("user ID :" ,uid) return true } public static func segueViewController(viewController: UIViewController, identifier: String) { viewController.performSegue(withIdentifier: identifier, sender: viewController) } public static func newViewController(identifier: String) { let storyboard = UIStoryboard(name: "Main", bundle: nil) let mainViewController = storyboard.instantiateViewController(withIdentifier: identifier) mainViewController.modalPresentationStyle = .popover let appDelegate = UIApplication.shared.delegate as! AppDelegate appDelegate.window!.rootViewController = mainViewController appDelegate.window!.makeKeyAndVisible() } public static func embed(_ viewController: UIViewController, inParent controller: UIViewController, inView view: UIView){ viewController.willMove(toParent: controller) view.addSubview(viewController.view) controller.addChild(viewController) viewController.didMove(toParent: controller) } func registerForNotifications(application: UIApplication) { // application.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum) //remote Notifications if #available(iOS 10.0, *) { UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (isGranted, err) in if err != nil { print("Error notification : ", err!) } else { print("no error in registerForNotifications") UNUserNotificationCenter.current().delegate = self Messaging.messaging().delegate = self DispatchQueue.main.async { application.registerForRemoteNotifications() if let token = Messaging.messaging().fcmToken { print("fcm : ", token) } else { print("no token") // self.notificationLabel.text = "no token" } } } } } if #available(iOS 10, *) { UNUserNotificationCenter.current().requestAuthorization(options: [.badge,.sound,.alert], completionHandler: { (granted, error) in DispatchQueue.main.async { UNUserNotificationCenter.current().delegate = self Messaging.messaging().delegate = self application.registerForRemoteNotifications() } }) } else { let notificationSettings = UIUserNotificationSettings(types: [.badge,.sound,.alert], categories: nil) DispatchQueue.main.async { UNUserNotificationCenter.current().delegate = self Messaging.messaging().delegate = self application.registerUserNotificationSettings(notificationSettings) application.registerForRemoteNotifications() } } } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { let controller = ViewController.instantiateVC() self.window?.rootViewController = controller self.window?.makeKeyAndVisible() Messaging.messaging().appDidReceiveMessage(userInfo) completionHandler(.noData) } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { print("Yay! Got a device token \(deviceToken)") // Messaging.messaging().setAPNSToken(deviceToken, type: .unknown) Messaging.messaging().setAPNSToken(deviceToken, type: .sandbox) Messaging.messaging().setAPNSToken(deviceToken, type: .prod) Messaging.messaging().setAPNSToken(deviceToken, type: .unknown) } } extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { let dataDict:[String:String] = ["token": fcmToken ?? ""] NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict) print("Firebase Notification Token: \(fcmToken ?? "")") } } @available(iOS 10, *) extension AppDelegate : UNUserNotificationCenterDelegate { // Receive displayed notifications for iOS 10 devices. func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { let userInfo = notification.request.content.userInfo // With swizzling disabled you must let Messaging know about the message, for Analytics Messaging.messaging().appDidReceiveMessage(userInfo) // Print message ID. NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: userInfo) //Messaging.messaging().shouldEstablishDirectChannel = true print("Notification Received") if let messageID = userInfo[gcmMessageIDKey] { print("Firebase Notification Message yes: \(messageID)") print("User Info: \(userInfo)") } completionHandler([.alert, .badge, .sound]) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { //If notification is tapped let userInfo = response.notification.request.content.userInfo // Print message ID. if let messageID = userInfo[gcmMessageIDKey] { print("Firebase Notification Message 2: \(messageID)") } //print(userInfo["title"]) //"body" let controller = ViewController.instantiateVC() self.window?.rootViewController = controller self.window?.makeKeyAndVisible() print(userInfo) Messaging.messaging().appDidReceiveMessage(userInfo) completionHandler() } }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter