如何在iOS上使用FCM在后台获取推送通知(Swift4) [英] How to get push notification with FCM in background on iOS (Swift4)

查看:127
本文介绍了如何在iOS上使用FCM在后台获取推送通知(Swift4)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在后台获取推送通知?我在Swift4 iOS 11中遇到一个问题,即只有在打开应用程序的情况下,FCM的推送通知才能在后台检索通知.

How to get push notification in background? I have a problem in Swift4 iOS 11 with push notifications with FCM unable to retrieve notifications in the background only when the application is opened.

这是我的编码:

AppDelegate.swift

AppDelegate.swift

    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
        
        var window: UIWindow?
        static var DEVICE_ID = String()
        
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            
            UIApplication.shared.statusBarStyle = .lightContent
            
            FirebaseApp.configure()
            
            if #available(iOS 10.0, *) {
                // For iOS 10 display notification (sent via APNS)
                UNUserNotificationCenter.current().delegate = self
                
                UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound], completionHandler: { (success, error) in
                    print(success)
                })
                
                Messaging.messaging().delegate = self
                
            } else {
                let settings: UIUserNotificationSettings =
                    UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
                application.registerUserNotificationSettings(settings)
            }
            
            application.registerForRemoteNotifications()
            
            return true
        }
        
        func connectToFcm() {
            Messaging.messaging().shouldEstablishDirectChannel = true
            
            if let token = InstanceID.instanceID().token() {
                AppDelegate.DEVICE_ID = token
                print("*********")
                print("Token Instance: \(token)")
                print("*********")
            }
        }
        
        func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
            
            completionHandler([.alert, .sound])
            
        }
        
        func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
            connectToFcm()
        }
        
        func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
            
            guard let data: [String: Any] = remoteMessage.appData as? [String: Any] else {
                return
            }
            
            print(data)
            
         
        }
        
        func applicationDidBecomeActive(_ application: UIApplication) {
            UIApplication.shared.applicationIconBadgeNumber = 0
            connectToFcm()
        }
        
        func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
            
            
            completionHandler(.newData)
            
        }
        
        
    }

示例:图片通过邮递员发送推送通知

推荐答案

AppDelegate.swift中的此源代码:

this source code in AppDelegate.swift:

import UIKit
import UserNotifications
import FirebaseCore
import FirebaseMessaging
import FirebaseInstanceID

struct DataNotif: Codable {
    var title: String?
    var body: String?

    private enum CodingKeys: String, CodingKey {
        case title
        case body
    }
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {

    var window: UIWindow?
    let gcmMessageIDKey = "message_id"

    static var DEVICE_ID = String()
    var msg_body = ""
    var msg_title = ""

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

        UIApplication.shared.statusBarStyle = .lightContent

        FirebaseApp.configure()

        Messaging.messaging().delegate = self

        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()

        return true
    }

    func connectToFcm() {
        Messaging.messaging().shouldEstablishDirectChannel = true
    }

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

        if let refreshedToken = InstanceID.instanceID().token() {
            AppDelegate.DEVICE_ID = refreshedToken
            print("*********")
            print("InstanceID token: \(refreshedToken)")
            print("*********")
        }else{
            print("Can't get token device")
        }

        connectToFcm()

    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Failed to register for remote notifications with error: \(error)")
    }

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

        print(userInfo)

        guard let data: [String: Any] = userInfo as? [String: Any] else {
            return
        }

        let listData = data["notification"] as! String
        let jsonData = listData.data(using: .utf8)
        do {
            let decoder = JSONDecoder()
            let dataJson = try decoder.decode(DataNotif.self, from: jsonData!)

            msg_body = dataJson.body!
            msg_title = dataJson.title!

            createNotification(title: msg_title, body: msg_body)

        }catch{
            print("error")
        }

        completionHandler(.newData)
    }

    // messaging
    func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {

        if let token = InstanceID.instanceID().token() {
            AppDelegate.DEVICE_ID = token
            print("*********")
            print("Token Instance: \(token)")
            print("*********")
        }

        connectToFcm()
    }

    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {

        print("Received data message: \(remoteMessage.appData)")

        guard let data: [String: Any] = remoteMessage.appData as? [String: Any] else {
            return
        }

        print(data)

        let listData = data["notification"] as! String
        let jsonData = listData.data(using: .utf8)
        do {
            let decoder = JSONDecoder()
            let dataJson = try decoder.decode(DataNotif.self, from: jsonData!)

            msg_body = dataJson.body!
            msg_title = dataJson.title!

            createNotification(title: msg_title, body: msg_body)

        }catch{
            print("error")
        }

    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        completionHandler([.alert, .badge, .sound])
    }

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

    func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

        if let vc = window?.rootViewController as? HomeController {
            vc.scheduleNotification()
        }

        completionHandler(.newData)

    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        Messaging.messaging().shouldEstablishDirectChannel = false
        print("Disconnect FCM")
    }

    func createNotification(title: String, body: String) {
        let content = UNMutableNotificationContent()
        content.title = NSString.localizedUserNotificationString(forKey: title, arguments: nil)
        content.body = NSString.localizedUserNotificationString(forKey: body, arguments: nil)
        content.sound = UNNotificationSound.default()
        content.badge = NSNumber(integerLiteral: UIApplication.shared.applicationIconBadgeNumber + 1)

        let request = UNNotificationRequest.init(identifier: "pushNotif", content: content, trigger: nil)

        let center = UNUserNotificationCenter.current()
        center.add(request)
    }

}

这篇关于如何在iOS上使用FCM在后台获取推送通知(Swift4)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆