Swift IOS: вызов определенной функции UIviewController при открытии приложения из уведомления - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу вызвать функцию onDidReceiveNotification, когда приложение открыто, нажав на уведомление.(ViewController - это контроллер первого вида, контроллер корневого представления)

Работает нормально, когда приложение открыто или в фоновом режиме, но когда приложение не открыто или находится в фоновом режиме (не в памяти), и нажмите, чтобыоткрытое приложение в это время onDidReceiveNotification функция не вызывается,

Что мне нужно сделать, чтобы вызвать onDidReceiveNotification функцию, когда приложение открыто с использованием нажатия на push-уведомление

ViewController.swift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        NotificationCenter.default.removeObserver(self, name: .didReceiveAlert, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.onDidReceiveNotification(_:)), name: .didReceiveAlert, object: nil)
    }

@objc func onDidReceiveNotification(_ notification:Notification) {
        print("Received Notification")
    }
}

AppDelegate.swift

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {            
    NotificationCenter.default.post(name: .didReceiveAlert, object: nil)       
}

Ответы [ 5 ]

0 голосов
/ 26 февраля 2019

Вы могли бы преодолеть этот случай, используя экземпляр контроллера вместо messagesObserver.

if let rootController = UIApplication.shared.keyWindow?.rootViewController{
        let controllerInstance = rootController.navigationController?.viewControllers[yourControllerIndex] as? ViewController
        controllerInstance.onDidReceiveNotification()
 }
0 голосов
/ 26 февраля 2019

Когда приложение открыто или в фоновом режиме в это время называется NotificationCenter.defalut.post и когда приложение закрывается / закрывается и открывается с использованием уведомлений в то время, получите экземпляр и вызовите функцию onDidReceiveAlert вручную, см. Следующий код.

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

    if application.applicationState == .background || application.applicationState == .active {
        NotificationCenter.default.post(name: .didReceiveAlert, object: nil)
    }else {
        let nav = window?.rootViewController as! UINavigationController
        let mainVC = nav.viewControllers.first as! ViewController
        mainVC.onDidReceiveAlert(nil)
    }
}

ИЛИ Просто получите ViewController экземпляр из стека UINavigationController и напрямую вызовите функцию ViewController (наблюдатель уведомлений не требуется)

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

    let nav = window?.rootViewController as! UINavigationController
    let mainVC = nav.viewControllers.first as! ViewController
    mainVC.onDidReceiveAlert(nil)       
}

Создайте функцию с необязательным параметром, используйтеследующий код.

@objc func onDidReceiveAlert(_ notification:Notification? = nil) {
    print("Received Notification")
}
0 голосов
/ 26 февраля 2019

В AppDelegate проверьте, получаете ли вы полезную нагрузку в didReceiveRemoteNotification.Оттуда вы можете написать код для перехода на конкретную страницу.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
    // Print full message.
    print(userInfo)
    pushToPage(data: userInfo)
}

func pushToPage(data:[AnyHashable : Any]){
    print("Push notification received: \(data)")
    if let aps = data["aps"] as? NSDictionary {
        print(aps)
    }
}
0 голосов
/ 26 февраля 2019

Когда приложение в неактивном состоянии и пользователь нажимает на уведомление.в этой ситуации только одна опция для управления уведомлениями.

Попробуйте это

Создайте переменную в глобальном классе, чтобы вы могли получить к ней доступ из любого места.

Ex Создайте переменную в AppDelegate

var isNotificationTap : Bool = false

После этого проверьте launchOptions и, если launchOptions доступно, установите флаг

if launchOptions != nil {
    if let userInfo = launchOptions?[UIApplication.LaunchOptionsKey.remoteNotification] as? [String : AnyObject] {
        if let dic = userInfo["body"] as? [String : AnyObject] {
            if let pushType = dic["push_type"] as? String {
                //Set Flag or any key in global file to identify that you tap on notification
                self.isNotifcaionTap = true
            }
        }
    }
}

Затем просто отметьте флаг вViewController.

class ViewController : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if self.isNotificationTap {

            print("Received Notification")
            //You can work with your notificaiton in inActive state
        }
    }

}
0 голосов
/ 26 февраля 2019

попробуйте следующий код

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    if let remoteNotif = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: Any] {
         //call your notification method from here
         NotificationCenter.default.post(name: .didReceiveAlert, object: nil)  
    }
}

надеюсь, вам просто нужно вызвать уведомление didReceiveAlert во всех случаях

...