Невозможно получить доступ к viewcontroller из didFinishLaunchingWithOptions при запуске приложения - PullRequest
0 голосов
/ 06 января 2019

У меня проблема с тем, что я не могу получить доступ к функции в моем файле viewcontroller.swft, когда обедаю из убитого приложения в didFinishLaunchingWithOptions.

Я пытаюсь получить доступ к функции с помощью viewController?.loadRequestnotificationwaiting(for: url as! String) из AppDelegate, который я передаю данные в viewcontroller, где я могу сделать некоторые вещи. Но когда я помещаю предупреждение в функцию в viewcontroller loadRequestnotificationwaiting. Данные не передаются.

Теперь я использую этот же метод в других областях для передачи данных в viewcontroller из appdelegate, и они работают нормально. Кажется, не работает при использовании в didFinishLaunchingWithOptions

Контроллер представления еще не доступен при попытке доступа к нему из didFinishLaunchingWithOptions?

AppDelegate.swift

class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    weak var viewController : ViewController?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        ConnectionManager.sharedInstance.observeReachability()
        // Override point for customization after application launch.
        FirebaseApp.configure()
        registerForPushNotifications()

        // opened from a push notification when the app is closed
        if let userInfo = launchOptions?[.remoteNotification] as? [String : AnyObject] {
            if let object = userInfo["aps"] {
                let url = object["url"]

                viewController?.loadRequestnotificationwaiting(for: url as! String)
            }
        }
        return true
    }

}

ViewController.swift

class ViewController: UIViewController, WKNavigationDelegate {
    func loadRequestnotificationwaiting(for notification_url_wait : String) {
        notification_url_final_wait = notification_url_wait

        let url = URL(string: notification_url_final_wait!)
        let URLrequest = URLRequest(url: url!)
        self.webView.load(URLrequest)
    }
}

Ответы [ 2 ]

0 голосов
/ 07 января 2019
  1. если ваш контроллер представления является root, вы можете вызвать его по телефону UIApplication.shared.keyWindow!.rootViewController! или перезаписать его своим viewController
  2. вы можете подать уведомление с помощью -[NotificationCenter postNotificationName:object:userInfo:] и наблюдать это имя уведомления в View Controller
0 голосов
/ 06 января 2019

Вы полагаетесь на ваше свойство AppDelegate viewController, но вы устанавливаете это свойство в методе viewDidLoad вашего контроллера представления; Это хорошо, когда уведомление получено, когда ваше приложение уже запущено, поскольку свойство viewController уже установлено.

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

Предполагая, что контроллер представления, который вам нужен, является исходным контроллером представления из вашей раскадровки, вы можете получить корневой контроллер представления из свойства window участника вашего приложения;

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UNUserNotificationCenter.current().delegate = self
    ConnectionManager.sharedInstance.observeReachability()
    // Override point for customization after application launch.
    FirebaseApp.configure()
    registerForPushNotifications()

    // opened from a push notification when the app is closed
    if let userInfo = launchOptions?[.remoteNotification] as? [String : AnyObject] {
        if let object = userInfo["aps"],
            let url = object["url"] as? String,
            let viewController = self.window?.rootViewController as? ViewController {
                viewController.loadRequestnotificationwaiting(for: url)
        }
    }
    return true
}
...