Muju
Muju

Reputation: 989

How to do single user Login in SwiftUI using Silent push notification

can I do Single user login in SwiftUI?

My postman code is like this

{
  "to": "Token",
  "apns-priority": 5,
  "content_available":true,
  "data": {
    "category": "100"
  }
}

enter image description here

My SwiftUI Code

     @main
        struct UpRignt: App {
            @UIApplicationDelegateAdaptor private var appDelegate: AppDelegate
        
            var body: some Scene {
                WindowGroup {
                    ContentView()
                }
            }
        }
    
    class AppDelegate: NSObject, UIApplicationDelegate {
        let gcmMessageIDKey = "gcm.message_id"
        
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
            
            FirebaseApp.configure()        
                    
            if #available(iOS 10.0, *) {
                // For iOS 10 display notification (sent via APNS)
                UNUserNotificationCenter.current().delegate = self
                
                let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
                UNUserNotificationCenter.current().requestAuthorization(
                    options: authOptions,
                    completionHandler: {_, _ in })
            } else {
                let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
                application.registerUserNotificationSettings(settings)
            }
            
            application.registerForRemoteNotifications()
            
            Messaging.messaging().delegate = self
            
            
            print("Documents Directory: ", FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last ?? "Not Found!")
            
            return true
        }
        
        func application(_ application: UIApplication,
                         didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                         fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
            if let messageID = userInfo[gcmMessageIDKey] {
                print("Message ID: \(messageID)")
            }
            print(userInfo)
            let category = userInfo[AnyHashable("gcm.notification.category")] as? String ?? ""

            if category == "100"{
              logout()
            }

            completionHandler(UIBackgroundFetchResult.newData)
        }
    }
    
    extension AppDelegate: MessagingDelegate {
        func messaging(_ messaging: Messaging,
                       didReceiveRegistrationToken fcmToken: String?) {
            let deviceToken:[String: String] = ["token": fcmToken ?? ""]
            print(deviceToken) // This token can be used for testing notifications on FCM
            let newFcmToken = deviceToken["token"]
            print(newFcmToken ?? "")
            UserDefaults.standard.set(newFcmToken, forKey: "fcmdeviceToken")
        }
    }
    
    @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
            
            if let messageID = userInfo[gcmMessageIDKey] {
                print("Message ID: \(messageID)")
            }
    
            print(userInfo)

       let category = userInfo[AnyHashable("gcm.notification.category")] as? String ?? ""

        if category == "100"{
          logout()
        }
            // Change this to your preferred presentation option
            completionHandler([[.banner, .badge, .sound]])
        }
        
        func application(_ application: UIApplication,
                         didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        }
        
        func application(_ application: UIApplication,
                         didFailToRegisterForRemoteNotificationsWithError error: Error) {
        }
        
        func userNotificationCenter(_ center: UNUserNotificationCenter,
                                    didReceive response: UNNotificationResponse,
                                    withCompletionHandler completionHandler: @escaping () -> Void) {
            let userInfo = response.notification.request.content.userInfo
            
            if let messageID = userInfo[gcmMessageIDKey] {
                print("Message ID from userNotificationCenter didReceive: \(messageID)")
            }
            
            print(userInfo)   
     
            let category = userInfo[AnyHashable("gcm.notification.category")] as? String ?? ""

            if category == "100"{
              logout()
            }
            completionHandler()
        }
    }

I am able to received notification when I replace data to notification. But I want to received notification without alerting user. With this code it was possible in Swift. I am not able to do so in SwiftUI I don't know why. Can anybody suggest me what I am doing wrong?

Upvotes: 0

Views: 61

Answers (0)

Related Questions