Firebase - Push-уведомления - не совсем работает, как ожидалось - PullRequest
0 голосов
/ 29 ноября 2018

Чтобы опробовать Push-уведомления с Firebase, я следовал за этими тремя документами: Один , Два , Три и Четыре .

У меня есть один вопрос, но перед тем, как спросить;вот что я вижу:

Когда мое приложение находится на переднем плане и отправляется уведомление, вызывается только эта функция:

userNotificationCenter(_:willPresent:withCompletionHandler:)

Если я нажимаю на уведомление, то этоодно также называется:

userNotificationCenter(_:didReceive:withCompletionHandler:)

Когда мое приложение находится в фоновом режиме и отправляется уведомление, ничего не вызывается.

Если я нажимаю на уведомление, то это называется:

userNotificationCenter(_:didReceive:withCompletionHandler:)

В результате этой ситуации, без необходимости реагировать (нажав на уведомление);Я могу заставить приложение выполнять некоторые полезные действия, когда уведомление приходит на переднем плане, используя функцию userNotificationCenter (_: willPresent: withCompletionHandler:) .

С другой стороны, в то время как вВ фоновом режиме приложение может выполнять некоторые полезные действия при поступлении уведомления, если пользователь нажимает на уведомление.

Можно ли мне также заставить приложение выполнить какое-либо полезное действие, даже еслиу пользователя нет реакции?

Вот соответствующий код, который у меня есть на данный момент:

import UIKit
import Firebase
import UserNotifications
import FirebaseInstanceID
import FirebaseMessaging


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, 
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)

        UNUserNotificationCenter.current().delegate = self
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {
                granted, error in
                if error != nil {print("Error: \(error!)")}

                if granted {
                    DispatchQueue.main.async
                        {application.registerForRemoteNotifications()}
                }
        })

        FirebaseApp.configure()
        .......

        return true
    }


    func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
        print(#function)
        if let messageID = userInfo[gcmMessageIDKey] {
            print("Message ID: \(messageID)")
        }

        // Print full message.
        print(userInfo)
    }


    func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print(#function)
        if let messageID = userInfo[gcmMessageIDKey] {
            print("Message ID: \(messageID)")
        }

        // Print full message.
        print(userInfo)

        completionHandler(UIBackgroundFetchResult.newData)
    }
}

Для информации, я использую Xcode Version 10.1, iOS 12.1 и Swift 4.2.

1 Ответ

0 голосов
/ 29 ноября 2018

swift 4.2, Xcode 10.0, IOS 12.0

import UIKit
import Firebase
import UserNotifications
import FirebaseInstanceID
import FirebaseMessaging

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)

        if #available(iOS 10.0, *) {
            let center = UNUserNotificationCenter.current()
            center.requestAuthorization(options: [.badge, .alert , .sound]) { (granted, error) in
                let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
                let setting = UIUserNotificationSettings(types: type, categories: nil)
                UIApplication.shared.registerUserNotificationSettings(setting)
                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()
        }

        application.registerForRemoteNotifications()

        if(FIRApp.defaultApp() == nil){
            FIRApp.configure()
        }
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(self.tokenRefreshNotification(notification:)),
                                               name: NSNotification.Name.firInstanceIDTokenRefresh,
                                               object: nil)

        return true
    }


    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo as? NSDictionary
        _ = UIStoryboard(name: "Main", bundle: nil)
        let appdelegate = UIApplication.shared.delegate as! AppDelegate
        let aps = userInfo?["aps"] as! NSDictionary
    }

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .badge, .sound])
    }
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Convert token to string

    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print("Device Token", deviceTokenString)
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.unknown)
}

func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {
    let appdelegate = UIApplication.shared.delegate as! AppDelegate
    let aps = data["aps"] as! NSDictionary
    let state = UIApplication.shared.applicationState
    if state == .background {
    }
    if state == .active {
    }
}

//MARK: Notification Center Call
func callNotificationCenter(){
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "reloadData"), object: nil)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
}

// start firebase
@objc func tokenRefreshNotification(notification: NSNotification) {
    let refreshedToken = FIRInstanceID.instanceID().token()
    print(refreshedToken)
    connectToFcm()
}

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

        } else {
            print("Connected to FCM")
        }
    }
}
...