ios - 没有收到从 FCM 到 iOS Swift 3 的推送通知

标签 ios swift firebase swift3 firebase-cloud-messaging

我正在构建一个带有 FCM 推送通知的 iOS 应用。我遵循了 Google Firebase 文档和其他教程,但我的 AppDelegate 从未执行函数 didReceiveRemoteNotification,因此当我从我的 Firebase 控制台发送通知时,它什么也不做。

我现在有这个:

AppDelegate.swift

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        application.registerForRemoteNotifications()            
        FIRApp.configure()
        connectToFcm()

        return true
    }

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print("<-TOKEN->")
    print(token)
}

func connectToFcm() {
    FIRMessaging.messaging().connect { (error) in
        if (error != nil) {
            print("Unable to connect with FCM. \(error)")
        } else {
            print("Connected to FCM.")
        }
    }
}

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

    // Print message ID.
    print("Message ID: \(userInfo["gcm.message_id"]!)")

    // Print full message.
    print("%@", userInfo)
}
  • 我还在我的 CocoaPods 文件上安装了 Firebase。
  • 我在 Firebase 控制台中使用相同的构建 ID 注册了该应用。
  • 我有“必需的后台模式 -> 应用下载内容作为响应 在我的 info.plist 文件中推送通知”
  • 我已经创建了我的 APNS 证书并将其上传到我在 Firebase 控制台中的设置。

当我启动应用程序时,它会成功构建,并在控制台上打印我的:

[Firebase/Analytics][I-ACS023012] Firebase Analytics enabled
2017-05-29 12:10:56.101 incidenciasSifu[1811] <Notice> [Firebase/Analytics][I-ACS023012] Firebase Analytics enabled
Optional(Error Domain=com.google.fcm Code=2001 "FIRMessaging is already connected" UserInfo={NSLocalizedFailureReason=FIRMessaging is already connected})
<-TOKEN->
Optional("03545fbbb986e2ffdfa50ac9e3eb6fe07e6fe4694cdfd000d673a0bf5ea53f6a")
Connected to FCM.

我是 Swift 的新手,我不知道我是否忘记在 AppDelegate 或其他地方添加一些代码。

请帮忙!我在这上面花了太多时间:(

最佳答案

在注册推送通知之前,您需要请求用户授予您必要的权限。 在您的 didFinishLaunchingWithOptions 方法中尝试此代码:

if #available(iOS 10.0, *) {
    UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { (granted, error) in
        if granted {
            application.registerForRemoteNotifications()
        }
    }
} else {
    let notificationTypes: UIUserNotificationType = [.alert, .badge, .sound]
    let settings = UIUserNotificationSettings(types: notificationTypes, categories: nil)
    application.registerUserNotificationSettings(settings)
    application.registerForRemoteNotifications()
}

此外,检查应用程序启动的原因也很有用。在该方法中添加如下代码:

if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] {
    self.application(application, didReceiveRemoteNotification: remoteNotification as! [AnyHashable : Any])
}

此外,您可以添加 didFailToRegisterForRemoteNotificationsWithError 方法来了解可能出错的原因:

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print ("Eror: \(error.localizedDescription)")
}

关于ios - 没有收到从 FCM 到 iOS Swift 3 的推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44240271/

相关文章:

ios - 创建一个具有非可选值的常量元组,并与另一个具有可选值的元组进行比较

ios - View Controller 加载时的插页式广告

swift - 为什么我的 endUpdates 抛出错误(当它在同一个函数中工作时)

arrays - 结构体参数 - 数组

javascript - 从 firebase 链接应用程序中的 .val() 对象读取值?

firebase - 如何在 firebase 中创建必填字段验证

firebase - 在 React native 应用程序中实现 Firebase Crashlytics - Android

ios - NSDateFormatter中 'YYYY'和 'yyyy'的区别

swift - 类不符合协议(protocol)。为什么?

iphone - 删除在 UItextfield 中输入的最后一个字符