Как я могу обработать уведомление Pu sh, когда приложение не запущено? - PullRequest
0 голосов
/ 20 апреля 2020

Я добавил свой сигнал в свой проект для отправки любого уведомления о новостях, чтобы показать им подробный вид, когда они нажимали на уведомление. Он работает хорошо, когда приложение находится на переднем плане или в фоновом режиме, но не работает, когда приложение не запущено.

Я исследовал его, и они сказали, что метод didRecieve не вызывается, когда приложение не было запущено. Итак, я должен обработать уведомление в методе didFinishLaunchingWithOptions, я попробовал его, но то же самое.

AppDelegate.swift

import UIKit
import CoreData
import Firebase
import OneSignal
import GoogleMobileAds
import UserNotifications
import SDWebImageWebPCoder

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var shortcutItemToProcess: UIApplicationShortcutItem?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        FirebaseApp.configure()

        GADMobileAds.sharedInstance().start(completionHandler: nil)

        let onesignalInitSettings = [kOSSettingsKeyAutoPrompt: false]
        OneSignal.initWithLaunchOptions(launchOptions,
        appId: "xxxxxxxxxxxxxxxxxxx",
        handleNotificationAction: nil,
        settings: onesignalInitSettings)
        OneSignal.inFocusDisplayType = OSNotificationDisplayType.notification
        OneSignal.promptForPushNotifications(userResponse: { accepted in
        })

        let WebPCoder = SDImageWebPCoder.shared
        SDImageCodersManager.shared.addCoder(WebPCoder)

        registerForPushNotifications()

        return true
    }

    func registerForPushNotifications() {

        let notificationCenter = UNUserNotificationCenter.current()
        notificationCenter.delegate = self

        let readAction = UNNotificationAction(identifier: "read", title: "Read", options: [.foreground])
        let closeAction = UNNotificationAction(identifier: "close", title: "Close", options: [])

        let category = UNNotificationCategory(identifier: "etkilesim", actions: [readAction, closeAction], intentIdentifiers: [], options: [])

        notificationCenter.setNotificationCategories([category])

        notificationCenter.requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            guard granted else { return }
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    }

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.

        // Grab a reference to the shortcutItem to use in the scene
        if let shortcutItem = options.shortcutItem {
            shortcutItemToProcess = shortcutItem
        }

        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

}

extension AppDelegate: UNUserNotificationCenterDelegate {

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

        completionHandler([.alert, .sound])
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        var postId:String = ""
        var postType:String = ""

        if let custom = response.notification.request.content.userInfo["custom"] as? NSDictionary{
            if let a = custom["a"] as? NSDictionary{
                if let id = a["id"] as? String{
                    postId = id
                }
                if let type = a["rights"] as? String{
                    postType = type
                }
            }
        }

        if response.actionIdentifier == "read" {
            if postId != ""{
                NotificationCenter.default.post(name: NSNotification.Name("Detail"), object: nil, userInfo: ["id": postId, "type": postType])
            }
        }else if response.actionIdentifier == "close" {
            print("KAPAT")
        } else {
             if postId != ""{
                NotificationCenter.default.post(name: NSNotification.Name("Detail"), object: nil, userInfo: ["id": postId, "type": postType])
            }
        }
        completionHandler()
    }

}

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы должны добавить фоновые режимы -> Удаленные уведомления к возможностям вашего приложения, чтобы получить полный доступ к таким методам делегирования, как: didReceiveRemoteNotification.

. Я бы порекомендовал хранить удаленные узлы на стороне сервера, связанные каждому пользователю / устройству и немедленно извлекайте их при каждом запуске приложения. Это единственный способ обеспечить согласованность данных.

Пожалуйста, отметьте этот вопрос .

0 голосов
/ 22 апреля 2020

лол. Я завернул свой код в asyn c, теперь он работает хорошо.

if response.actionIdentifier == "read" {
            if postId != ""{
                DispatchQueue.main.async(execute: {
                    NotificationCenter.default.post(name: NSNotification.Name("Detail"), object: nil, userInfo: ["id": postId, "type": postType])
                })
                completionHandler()
            }
        }else if response.actionIdentifier == "close" {
            print("CLOSE")
            completionHandler()
        } else {
            if postId != ""{
                DispatchQueue.main.async(execute: {
                    NotificationCenter.default.post(name: NSNotification.Name("Detail"), object: nil, userInfo: ["id": postId, "type": postType])
                })
                completionHandler()
            }
        }
...