2598

Firebase Issues iOS 10.3 on Xcode 8.3 Swift 3 FCM notifications not working

Question:

I'm working on <strong>Xcode 8.3.2</strong> for <strong>iOS 10.3.2</strong> with <strong>Swift 3</strong>, my project use firebase cloud messaging, when my <em>p12</em> certificates expired, I updated my certificates <em>p12</em> to <em>p8</em> as suggested Firebase's documentation, but the push notifications stopped coming, yesterday when I used the console firebase to test, it was working but today no, the logs print me this as normal:

2017-05-30 10:13:23.932066-0400 lol[5576:1530669] WARNING: Firebase Analytics App Delegate Proxy is disabled. To log deep link campaigns manually, call the methods in FIRAnalytics+AppDelegate.h. 2017-05-30 10:13:23.949512-0400 lol[5576:1530669] Firebase automatic screen reporting is enabled. Call +[FIRAnalytics setScreenName:setScreenClass:] to set the screen name or override the default screen class name. To disable automatic screen reporting, set the flag FirebaseAutomaticScreenReportingEnabled to NO in the Info.plist 2017-05-30 10:13:24.368364-0400 lol[5576:1530669] [Crashlytics] Version 3.8.2 (118) 2017-05-30 10:13:24.397942-0400 lol[5576:1530669] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 2017-05-30 10:13:24.398433-0400 lol[5576:1530669] [MC] Reading from public effective user settings. initializeFCM Notification access accepted. 2017-05-30 10:13:24.679: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(null)" 2017-05-30 10:13:24.681: <FIRMessaging/INFO> FIRMessaging library version 1.2.0 2017-05-30 10:13:24.683213-0400 lol[5576:1530706] [Firebase/Crash][I-CRA000004] Successfully initialized 2017-05-30 10:13:24.683 lol[5576] <Notice> [Firebase/Crash][I-CRA000004] Successfully initialized 2017-05-30 10:13:24.685110-0400 lol[5576:1530706] <FIRAnalytics/INFO> Firebase Analytics v.3600000 started 2017-05-30 10:13:24.685 lol[5576:] <FIRAnalytics/INFO> Firebase Analytics v.3600000 started 2017-05-30 10:13:24.685438-0400 lol[5576:1530706] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled 2017-05-30 10:13:24.685 lol[5576:] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled "GCM TOKEN = Optional(\"it's working: PLEASE HELP STACKOVERFLOW\")" "didRegisterForRemoteNotificationsWithDeviceToken: DATA" "*** deviceToken: <66666666 it's working: PLEASE HELP STACKOVERFLOW 99999999>" 2017-05-30 10:13:24.837: <FIRInstanceID/WARNING> APNS Environment in profile: development "Firebase Token:" Optional("it's working: PLEASE HELP STACKOVERFLOW") 2017-05-30 10:13:24.932076-0400 lol[5576:1530727] <FIRAnalytics/INFO> Firebase Analytics enabled 2017-05-30 10:13:24.932 lol[5576:] <FIRAnalytics/INFO> Firebase Analytics enabled "Connected to FCM."

the new strange log is:

2017-05-30 10:13:24.679: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(null)"

my code is:

// // AppDelegate.swift // lol // // Created by Dennis Mostajo on 06/06/16. ---> 666 the number of the beast! O_O! // Copyright © 2016 Dennis Mostajo. All rights reserved. // import UIKit import FirebaseAnalytics import FirebaseInstanceID import FirebaseMessaging import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. self.initializeFCM(application) let token = FIRInstanceID.instanceID().token() debugPrint("GCM TOKEN = \(String(describing: token))") return true } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { debugPrint("didFailToRegisterForRemoteNotificationsWithError: \(error)") } func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { debugPrint("remoteMessage:\(remoteMessage.appData)") } func initializeFCM(_ application: UIApplication) { print("initializeFCM") //-------------------------------------------------------------------------// if #available(iOS 10.0, *) // enable new way for notifications on iOS 10 { let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.badge, .alert , .sound]) { (accepted, error) in if !accepted { print("Notification access denied.") } else { print("Notification access accepted.") UIApplication.shared.registerForRemoteNotifications(); } } } else { let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]; let setting = UIUserNotificationSettings(types: type, categories: nil); UIApplication.shared.registerUserNotificationSettings(setting); UIApplication.shared.registerForRemoteNotifications(); } FIRApp.configure() NotificationCenter.default.addObserver(self, selector: #selector(self.tokenRefreshNotificaiton), name: NSNotification.Name.firInstanceIDTokenRefresh, object: nil) } func registrationhandler(_ registrationToken: String!, error: NSError!) { if (registrationToken != nil) { debugPrint("registrationToken = \(String(describing: registrationToken))") } else { debugPrint("Registration to GCM failed with error: \(error.localizedDescription)") } } func tokenRefreshNotificaiton(_ notification: Foundation.Notification) { if let refreshedToken = FIRInstanceID.instanceID().token() { debugPrint("InstanceID token: \(refreshedToken)") } connectToFcm() } func connectToFcm() { // Won't connect since there is no token guard FIRInstanceID.instanceID().token() != nil else { return; } // Disconnect previous FCM connection if it exists. FIRMessaging.messaging().disconnect() FIRMessaging.messaging().connect { (error) in if (error != nil) { debugPrint("Unable to connect with FCM. \(String(describing: error))") } else { debugPrint("Connected to FCM.") } } } func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) { debugPrint("didRegister notificationSettings") if (notificationSettings.types == .alert || notificationSettings.types == .badge || notificationSettings.types == .sound) { application.registerForRemoteNotifications() } } func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { debugPrint("didRegisterForRemoteNotificationsWithDeviceToken: NSDATA") let token = String(format: "%@", deviceToken as CVarArg) debugPrint("*** deviceToken: \(token)") #if RELEASE_VERSION FIRInstanceID.instanceID().setAPNSToken(deviceToken as Data, type:FIRInstanceIDAPNSTokenType.prod) #else FIRInstanceID.instanceID().setAPNSToken(deviceToken as Data, type:FIRInstanceIDAPNSTokenType.sandbox) #endif debugPrint("Firebase Token:",FIRInstanceID.instanceID().token() as Any) } @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { //Handle the notification ON APP foreground debugPrint("*** willPresent notification") debugPrint("*** notification: \(notification)") } @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { //Handle the notification ON BACKGROUND debugPrint("*** didReceive response Notification ") debugPrint("*** response: \(response)") } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { debugPrint("didRegisterForRemoteNotificationsWithDeviceToken: DATA") let token = String(format: "%@", deviceToken as CVarArg) debugPrint("*** deviceToken: \(token)") #if RELEASE_VERSION FIRInstanceID.instanceID().setAPNSToken(deviceToken as Data, type:FIRInstanceIDAPNSTokenType.prod) #else FIRInstanceID.instanceID().setAPNSToken(deviceToken as Data, type:FIRInstanceIDAPNSTokenType.sandbox) #endif debugPrint("Firebase Token:",FIRInstanceID.instanceID().token() as Any) } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // If you are receiving a notification message while your app is in the background, // this callback will not be fired till the user taps on the notification launching the application. // TODO: Handle data of notification FIRMessaging.messaging().appDidReceiveMessage(userInfo) if let messageID = userInfo["gcm.message_id"] { debugPrint("Message ID: \(messageID)") } debugPrint("*** userInfo: \(userInfo)") // Print full message. completionHandler(.newData) } func application(_ application: UIApplication, didReceive notification: UILocalNotification) { if application.applicationState != UIApplicationState.active { if let gcmMessageType = GCMMessageType(rawValue: notificationType) { debugPrint("didReceiveLocalNotification") debugPrint("notification:\(notification)") } } //application.applicationIconBadgeNumber = 0 } func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. connectToFcm() } func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } }

I have made some mistake ?, or I need to configure something ?, something more that should increase for the difference between <strong>iOS 9</strong> and <strong>iOS 10.3</strong>, or add to firebase settings, thanks a lot for any help

//------------------------------------------------------------------------------------------------------------------------------//

<strong>EDIT:</strong>

Hi again, well I have updated Firebase to the latest version 4.0.0, doing these updates in my code:

func initializeFCM(_ application: UIApplication) { print("initializeFCM") //-------------------------------------------------------------------------// if #available(iOS 10.0, *) // enable new way for notifications on iOS 10 { let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.badge, .alert , .sound]) { (accepted, error) in if !accepted { print("Notification access denied.") } else { print("Notification access accepted.") UIApplication.shared.registerForRemoteNotifications(); } } } else { let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]; let setting = UIUserNotificationSettings(types: type, categories: nil); UIApplication.shared.registerUserNotificationSettings(setting); UIApplication.shared.registerForRemoteNotifications(); } //-------------------------------------------------------------------------// FirebaseApp.configure() Messaging.messaging().shouldEstablishDirectChannel = true NotificationCenter.default.addObserver(self, selector: #selector(self.tokenRefreshNotificaiton), name: NSNotification.Name.InstanceIDTokenRefresh, object: nil) } func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { debugPrint("didRegisterForRemoteNotificationsWithDeviceToken: NSDATA") let token = String(format: "%@", deviceToken as CVarArg) debugPrint("*** deviceToken: \(token)") Messaging.messaging().apnsToken = deviceToken as Data debugPrint("Firebase Token:",InstanceID.instanceID().token() as Any) } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { debugPrint("didRegisterForRemoteNotificationsWithDeviceToken: DATA") let token = String(format: "%@", deviceToken as CVarArg) debugPrint("*** deviceToken: \(token)") Messaging.messaging().apnsToken = deviceToken debugPrint("Firebase Token:",InstanceID.instanceID().token() as Any) } func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) { debugPrint("--->messaging:\(messaging)") debugPrint("--->didReceive Remote Message:\(remoteMessage.appData)") guard let data = try? JSONSerialization.data(withJSONObject: remoteMessage.appData, options: .prettyPrinted), let prettyPrinted = String(data: data, encoding: .utf8) else { return } print("Received direct channel message:\n\(prettyPrinted)") }

Several warnings logs disappeared but when I do the test in foreground and background way this logs print me:

2017-06-01 17:40:12.897916-0400 lol[8275:2217196] [Firebase/Messaging][I-FCM002019] FIRMessaging received data-message, but FIRMessagingDelegate's-messaging:didReceiveMessage: not implemented 2017-06-01 17:40:12.898 lol[8275] <Warning> [Firebase/Messaging][I-FCM002019] FIRMessaging received data-message, but FIRMessagingDelegate's-messaging:didReceiveMessage: not implemented "###> 1.2 AppDelegate DidEnterBackground" 2017-06-01 17:40:29.943006-0400 lol[8275:2217037] Could not signal service com.apple.WebKit.WebContent: 113: Could not find specified service 2017-06-01 17:40:29.944689-0400 lol[8275:2217037] Could not signal service com.apple.WebKit.Networking: 113: Could not find specified service 2017-06-01 17:40:30.000428-0400 lol[8275:2217203] dnssd_clientstub read_all(27) DEFUNCT "###> 1.3 AppDelegate DidBecomeActive" 2017-06-01 17:40:30.760941-0400 lol[8275:2217443] [Firebase/Messaging][I-FCM002019] FIRMessaging received data-message, but FIRMessagingDelegate's-messaging:didReceiveMessage: not implemented 2017-06-01 17:40:30.761 lol[8275] <Warning> [Firebase/Messaging][I-FCM002019] FIRMessaging received data-message, but FIRMessagingDelegate's-messaging:didReceiveMessage: not implemented

I tried this but it still shows those logs and it does not show any notifications: <a href="https://i.stack.imgur.com/lV76U.png" rel="nofollow"><img alt="enter image description here" class="b-lazy" data-src="https://i.stack.imgur.com/lV76U.png" data-original="https://i.stack.imgur.com/lV76U.png" src="https://etrip.eimg.top/images/2019/05/07/timg.gif" /></a><a href="https://i.stack.imgur.com/jDjre.png" rel="nofollow"><img alt="enter image description here" class="b-lazy" data-src="https://i.stack.imgur.com/jDjre.png" data-original="https://i.stack.imgur.com/jDjre.png" src="https://etrip.eimg.top/images/2019/05/07/timg.gif" /></a><a href="https://i.stack.imgur.com/yNwzB.png" rel="nofollow"><img alt="enter image description here" class="b-lazy" data-src="https://i.stack.imgur.com/yNwzB.png" data-original="https://i.stack.imgur.com/yNwzB.png" src="https://etrip.eimg.top/images/2019/05/07/timg.gif" /></a><a href="https://i.stack.imgur.com/FBv9O.png" rel="nofollow"><img alt="enter image description here" class="b-lazy" data-src="https://i.stack.imgur.com/FBv9O.png" data-original="https://i.stack.imgur.com/FBv9O.png" src="https://etrip.eimg.top/images/2019/05/07/timg.gif" /></a><a href="https://i.stack.imgur.com/H8ZGP.png" rel="nofollow"><img alt="enter image description here" class="b-lazy" data-src="https://i.stack.imgur.com/H8ZGP.png" data-original="https://i.stack.imgur.com/H8ZGP.png" src="https://etrip.eimg.top/images/2019/05/07/timg.gif" /></a>

is anything I'm missing?, Thanks for the answers!!

Answer1:

You need to add Push notification certificate to FCM Console in Cloud Messaging. Only then It'll be able to send notifications to your App. Also, make sure you've enabled Push notifications in Capabilities in your iOS App.

<strong>Update:</strong>

extension AppDelegate: MessagingDelegate { // Registering for Firebase notifications func configureFirebase(application: UIApplication) { FirebaseApp.configure() Messaging.messaging().delegate = self // Register for remote notifications. This shows a permission dialog on first run, to // show the dialog at a more appropriate time move this registration accordingly. // [START register_for_notifications] 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() print("-----firebase token: \(String(describing: Messaging.messaging().fcmToken)) ----") } //MARK: FCM Token Refreshed func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { // FCM token updated, update it on Backend Server } func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) { print("remoteMessage: \(remoteMessage)") } //Called when a notification is delivered to a foreground app. @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .badge, .sound]) } //Called to let your app know which action was selected by the user for a given notification. @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print("User Info = \(response.notification.request.content.userInfo)") completionHandler() } }

Call configureFirebase(application:) inside didFinishLaunchingWithOptions of your AppDelegate.

Recommend

  • Is XML Serialization in .Net case sensitive?
  • Google Sheets ARRAYFORMULA with nested if statements
  • Email clients ignoring internal style sheet
  • Variable Length Arguments without using stdarg.h
  • PyQT OSX Media Keys
  • reading a textfile from r.raw on android
  • Cosine similarity yields 'nan' values
  • DateTime alters timestamp during DST winter change
  • How to sort an array considering localization?
  • How does a GPU group threads into warps/wavefronts?
  • How does NodeAPI in Google Play Services work?
  • How to logout from facebook connect in asp.net?
  • HTTPS + gzip: Is it a security vulnerability if I only gzip non-sensitive files?
  • Image resources disappearing from react-native app
  • Route Audio song to blue-tooth programmatically?
  • Play youtube video in offline mode?
  • Connection between Node.JS and PHP via UNIX Socket - EPIPE write error
  • How to extract a plane from a 3D variable in FiPy (3D to 2D)
  • SSLRead() return error -9806/15958)
  • JOOQ nested condition
  • Multiple sockets for clients to connect to
  • R DataTable Join and constrain rows
  • How to unwind to the first view controller on a navigation stack
  • Getting zero results in search using elastic4s
  • Run script file on remote server
  • When executing an array of tasks asynchronously, shouldn't it take as long as the longest runni
  • Receiver has no segue with identifier“***”
  • New Firebase failed: First argument must be a valid firebase URL and the path can't contain “.”
  • Not able to aggregate on nested fields in elasticsearch
  • Avoid links criss cross / overlap in d3.js using force layout
  • Recording logins for password protected directories
  • Is there a javascript serializer for JSON.Net?
  • Incrementing object id automatically JS constructor (static method and variable)
  • Where to put my custom functions in Wordpress?
  • Buffer size for converting unsigned long to string
  • Free memory of cv::Mat loaded using FileStorage API
  • unknown Exception android
  • Binding checkboxes to object values in AngularJs