Please implement -messaging:didReceiveRegistrationToken: to be provided with an FCM token

Viewed 604

I am trying to put iOS push notifications onto my app. But keep getting the error

The object <FancyDeliveryManager.ViewController: 0x101910170> does not respond to -messaging:didReceiveRegistrationToken:. Please implement -messaging:didReceiveRegistrationToken: to be provided with an FCM token.

My app delegate looks like:

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {

var window : UIWindow?

//private let pushNotificationHandler: PushNotificationHandler = PushNotificationHandler()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            
    FirebaseApp.configure()
    
    //notification delegates
    Messaging.messaging().delegate = self //enables recievieving of tokens
    UNUserNotificationCenter.current().delegate = self
          
    ///
    //set up nav controller
    let root: UIViewController = ViewController()
    let navigationController = UINavigationController(rootViewController: root)
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = navigationController
    window?.makeKeyAndVisible()
    
    return true
}

//MARK: Push Handling
func registerForPushNotifications() {
UNUserNotificationCenter.current()
  .requestAuthorization(options: [.alert, .sound, .badge]) {
    [weak self] granted, error in
    
    guard granted else { return }
    self?.getNotificationSettings()
}
}
    
//check the notification settings
func getNotificationSettings() {
    UNUserNotificationCenter.current().getNotificationSettings { settings in
        
        guard settings.authorizationStatus == .authorized else { return }
        DispatchQueue.main.async {
            UIApplication.shared.registerForRemoteNotifications()
        }
    }
}

// This method will be called when app received push notifications in foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
{
    completionHandler([.alert, .badge, .sound])
}

//called when user interacts with push notification
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    print("Launched from push notification")
    
    completionHandler()
}

// This callback is fired at each app startup and whenever a new token is created.
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    print("Firebase registration token: \(fcmToken)")
    
    saveFcmToken(token: fcmToken)

}


//save token in database
func saveFcmToken(token: String){
    var ref: DatabaseReference!
    ref = Database.database().reference()
    
    guard let userID = Auth.currentUser else { return }
    ref.child("WarehouseManagers/\(userID)/fcmToken").setValue(token)
}


func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
    //default to delegate method below
}

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

// [END receive_message]
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Unable to register for remote notifications: \(error.localizedDescription)")
}


func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("APNs token retrieved: \(deviceToken)")
    
    // With swizzling disabled you must set the APNs token here.
    // Messaging.messaging().apnsToken = deviceToken
}

func applicationDidBecomeActive(_ application: UIApplication) {
    UIApplication.shared.applicationIconBadgeNumber = 0
}

Is there something in the main ViewController that needs to be added here?

Any help would be greatly appreciated.

0 Answers
Related