FCM notification issue - swift3

297 views Asked by At

I have successfully added firebase and notification in my project. Using this Notifications are coming and I can access them by tapping on that notification. But the issue is if my app is closed, I got a notification, now without tapping on that I cleared that. Now no data inserted in my Db. How to keep all notifications on queue to access directly when app is opened next time. Thanks in advance.

class AppDelegate: UIResponder, UIApplicationDelegate , CLLocationManagerDelegate , FIRMessagingDelegate , UNUserNotificationCenterDelegate {

var window: UIWindow?
var locationManager = CLLocationManager()
var utill = FencingUtil()
var wrap = WrapperApi()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    if launchOptions != nil{
        let userInfo = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification]
        if userInfo != nil {
            self.handleUserInfo(userinfo: userInfo as! [AnyHashable : Any])
            // Perform action here
        }
    }
    self.locationManager.delegate = self
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.distanceFilter = 50.0; // Will notify the LocationManager every 100 meters
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    GMSServices.provideAPIKey("AIzaSyDNoFY_sbP9j-ObZx06B_rmjcCVrCM_ZP0")
    GMSPlacesClient.provideAPIKey("AIzaSyDNoFY_sbP9j-ObZx06B_rmjcCVrCM_ZP0")

    FIRApp.configure()
   // var db: SQLiteDatabase
    let dataStore = SQLiteDataStore.sharedInstance
            do {
                try dataStore.createTables()
            }
            catch _{}
    if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.current()
        center.delegate = self
        center.requestAuthorization(options: [.badge, .sound, .alert], completionHandler: {(grant, error)  in
            if error == nil {
                if grant {
                    application.registerForRemoteNotifications()
                } else {
                    //User didn't grant permission
                }
            } else {
                print("error: ",error)
            }
        })
        // For iOS 10 display notification (sent via APNS)

    } else {
        let settings: UIUserNotificationSettings =
        UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    }

    application.registerForRemoteNotifications()

    return true
}
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    print("Handle push from foreground")
    // custom code to handle push while app is in the foreground
    //print("\(notification.request.content.userInfo)")
    self.handleUserInfo(userinfo: notification.request.content.userInfo)
}

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    print("Handle push from background or closed")
    // if you set a member variable in didReceiveRemoteNotification, you will know if this is from closed or background

    self.handleUserInfo(userinfo: response.notification.request.content.userInfo)
}

func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage)
{
    print("%@", remoteMessage.appData)
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any])
{ self.application(application, didReceiveRemoteNotification: userInfo) { (UIBackgroundFetchResult) in }
    print ("dasdasd")

}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
 self.handleUserInfo(userinfo: userInfo)

}
 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.sandbox)
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.prod)



}
func tokenRefreshNotificaiton(_ notification: Foundation.Notification) {
    guard let refreshedToken = FIRInstanceID.instanceID().token()
        else {
            return
    }
    //refreshedToken = FIRInstanceID.instanceID().token()!

    print("InstanceID token: \(refreshedToken)")

    utill.tokenDefault.setValue(refreshedToken, forKey: "tokenId")
    // Connect to FCM since connection may have failed when attempted before having a token.
    connectToFcm()
}
// [START connect_to_fcm]
func connectToFcm() {
    FIRMessaging.messaging().connect { (error) in
        if (error != nil) {
            print("Unable to connect with FCM. \(String(describing: error))")
        } else {
            //print("Connected to FCM.")
        }
    }
}}
1

There are 1 answers

1
Pushpendra On

if you are launching your application then you can get you notification object in didFinishLaunchingWithOptions method try this. if you have not cleared notification from notification center.

        if (launchOptions != nil) {
        if let remoteNotification = launchOptions?
       [UIApplicationLaunchOptionsKey.remoteNotification]  {
          let objNotification = remoteNotification as! [AnyHashable : 
         Any]
          }
    }