Уведомление IOS, когда приложение закрыто

У меня есть приложение iOS, которому я отправляю удаленное уведомление при отправке уведомления с сервера. Я устанавливаю content -available = 1 и sound = "" Когда на устройстве IOS я с использованием

приложение(didReceiveRemoteNotification:fetchCompletionHandler:)

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

приложение(didReceiveRemoteNotification:fetchCompletionHandler:)

Мой обработчик в этом методе

        let userInfoDic = userInfo as NSDictionary as? [String: Any]
        let cato = userInfoDic?["cato"] as? String
if cato == "message" {
            let state: UIApplicationState = UIApplication.shared.applicationState
            if state == .active{
                print("Application is Active Socket IO will Handle This")
            }else{
                let apnMessage = userInfoDic?["apnMessage"] as? [String: Any]
                if (apnMessage == nil){
                    print("Error Fetching Message")
                }else{
                let count = UserDefaults.standard.integer(forKey:"TotalUnredMessage")

                    DispatchQueue.main.async {
                        UIApplication.shared.applicationIconBadgeNumber = count + 1
                    }
                    UserDefaults.standard.set(count, forKey: "TotalUnredMessage")
          }
}

Итак, что я должен изменить, чтобы эти методы работали, даже когда приложение закрыто

Спасибо


person Santhosh S Kashyap    schedule 12.07.2017    source источник


Ответы (3)


Метод didReceiveRemoteNotification не будет вызываться при закрытии приложения.

Но вы можете проверить launchOptions, чтобы узнать, было ли приложение запущено из уведомления или нет, в методе didFinishLaunchingWithOptions в appdelegate и выполнить свою задачу соответствующим образом.

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

     if launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] != nil {
    // Do your task here
    }

}
person Prakash Shaiva    schedule 12.07.2017
comment
Что произойдет, если пользователь напрямую коснется значка приложения и не получит уведомление, или я смогу увидеть все уведомления, полученные при закрытии приложения? Спасибо за ответ. - person Santhosh S Kashyap; 12.07.2017
comment
если пользователь не открывает приложение, нажав на уведомление, нет возможности получить информацию об уведомлении. В этом случае вы должны проверить свой сервер на наличие непрочитанных уведомлений. - person Prakash Shaiva; 12.07.2017
comment
Все мое требование состоит в том, чтобы увеличить количество значков, которые я пытался отправить +1 в значке, я не работаю - person Santhosh S Kashyap; 12.07.2017
comment
Push-уведомления обрабатываются iOS, и в вашем приложении вы не можете изменить значок приложения при получении push-уведомления, когда приложение закрыто. Но вы можете рассчитать номер значка и отправить номер значка в полезной нагрузке push-уведомления с вашего сервера. - person Prakash Shaiva; 12.07.2017
comment
мы можем получить userInfo здесь ?? - person Rashid KC; 26.09.2018

Вы должны указать в конфигурации, что ваше приложение должно быть разбужено удаленным уведомлением. Проверьте этот комментарий: https://stackoverflow.com/a/29231395/2732896

person DoN1cK    schedule 12.07.2017

Чтобы завершить Prakash Shaiva, показав, как получить уведомление userIn didFinishWithLaunchOptions

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

     if let launchOptions = launchOptions,
            let userInfo =  launchOptions[.remoteNotification] as? [AnyHashable: Any] {
            //some code here and post when needed like below
            NotificationCenter.default.post(name: NSNotification.Name("your notification name"),  object: nil)
        }
}
person Napster Scofield    schedule 02.06.2020