Déclencher une action spécifique lorsque l'application entre en avant-plan à partir d'une notification locale dans iOS? (en utilisant swift)

Je construis une application iOS en utilisant la nouvelle langue Swift. Maintenant, il s'agit d'une application HTML5 qui affiche du contenu HTML à l'aide de UIWebView. L'application a des notifications locales, et ce que je veux faire est de triggersr une méthode javascript spécifique dans le UIWebView lorsque l'application entre au premier plan en cliquant sur (toucher) la notification locale.

J'ai jeté un coup d'oeil à cette question , mais cela ne semble pas résoudre mon problème. J'ai également rencontré cette question qui me parle de l'utilisation de UIApplicationState, ce qui est bien car cela m'aiderait à savoir que l'application entre en premier plan à partir d'une notification. Mais quand l'application reprend et comment puis-je invoquer une méthode dans le viewController de la vue qui s'affiche lorsque l'application reprend?

Qu'est-ce que je voudrais faire est d'get une instance de mon ViewController et définissez une propriété à true. Quelque chose comme suit

class FirstViewController: UIViewController,UIWebViewDelegate { var execute:Bool = false; @IBOutlet var tasksView: UIWebView! } 

Et dans mon AppDelegate j'ai la méthode

 func applicationWillEnterForeground(application: UIApplication!) { let viewController = self.window!.rootViewController; let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("FirstView") as FirstViewController setViewController.execute = true; } 

donc ce que je voudrais faire est quand l'application entre à nouveau au premier plan, je veux regarder la variable d'exécution et exécuter la méthode comme suit,

 if execute{ tasksView.ssortingngByEvaluatingJavaScriptFromSsortingng("document.getElementById('sample').click()"); } 

Où devrais-je mettre le code pour la logique pour triggersr le javascript à partir du webview? serait-il sur la méthode viewDidLoad, ou l'une des methods de délégation webView? J'ai essayé de mettre ce code dans la méthode viewDidLoad mais la valeur de l'exécutable boolean est définie sur sa valeur initiale et non sur la valeur définie dans le délégué lorsque l'application entre au premier plan.

Si je souhaite qu'un controller de vue soit averti lorsque l'application est ramenée au premier plan, je peux simplement m'inscrire à la notification .UIApplicationWillEnterForeground (en .UIApplicationWillEnterForeground entièrement la méthode de délégué de l'application):

 class ViewController: UIViewController { private var notification: NSObjectProtocol? override func viewDidLoad() { super.viewDidLoad() notification = NotificationCenter.default.addObserver(forName: .UIApplicationWillEnterForeground, object: nil, queue: .main) { [unowned self] notification in // do whatever you want when the app is brought back to the foreground } } deinit { // make sure to remove the observer when this view controller is dismissed/deallocated if let notification = notification { NotificationCenter.default.removeObserver(notification) } } } 

Notez, dans la fermeture d'achèvement, que [unowned self] pour éviter un cycle de reference fort qui empêche le view controller d'être désaffecté s'il vous arrive de referencer self dans le block (ce que vous devrez probablement faire si vous allez être mettre à jour une variable de class ou faire pratiquement n'importe quoi intéressant).

Sinon, si vous ne souhaitez pas utiliser la notification basée sur les blocs, vous pouvez utiliser l'ancienne approche basée sur le sélecteur:

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground(_:)), name: .UIApplicationWillEnterForeground, object: nil) } func willEnterForeground(_ notification: NSNotification!) { // do whatever you want when the app is brought back to the foreground } deinit { // make sure to remove the observer when this view controller is dismissed/deallocated NotificationCenter.default.removeObserver(self) } } 

Dans Swift 3, il remplace et génère ce qui suit.

  override func viewDidLoad() { super.viewDidLoad() foregroundNotification = NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationWillEnterForeground, object: nil, queue: OperationQueue.main) { [unowned self] notification in // do whatever you want when the app is brought back to the foreground }