Запуск определенного действия, когда приложение выходит на передний план из локального уведомления в iOS? (использование swift)

Я создаю приложение iOS, используя новый язык Swift. Теперь это приложение HTML5, которое отображает содержимое HTML с помощью UIWebView. Приложение имеет локальные уведомления, и то, что я хочу сделать, это вызвать определенный метод javascript в UIWebView, когда приложение выходит на передний план, нажав (коснувшись) локального уведомления.

Я посмотрел на это вопрос, но это, похоже, не решает мою проблему. Я также сталкивался с этим вопрос что говорит мне об использовании UIApplicationState, что хорошо, так как это поможет мне узнать, что приложение выходит на передний план из уведомления. Но когда приложение возобновляется и как вызвать метод в viewController представления, который отображается при возобновлении приложения?

что я хотел бы сделать, это получить экземпляр моего ViewController и установить в нем свойство true. Что-то вроде:

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

и в моем AppDelegate у меня есть метод

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;


}

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

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

где я должен поместить код для логики, чтобы вызвать JavaScript из браузера? будет ли это метод viewDidLoad или один из методов делегата webView? я попытался поместить этот код в метод viewDidLoad, но значение boolean execute установлено в его начальное значение, а не в набор значений в делегате, когда приложение выходит на передний план.

2 ответов


если я хочу, чтобы контроллер вида был уведомлен, когда приложение возвращается на передний план, я мог бы просто зарегистрироваться для .UIApplicationWillEnterForeground уведомление (полностью минуя метод делегата приложения):

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)
        }
    }
}

Примечание, В завершение закрытия, я включаю [unowned self] чтобы избежать сильного ссылочного цикла, который предотвращает освобождение контроллера вида, если вы ссылаетесь self внутри блока (что, по-видимому, вам нужно будет сделать, если вы собираетесь обновлять класс переменная или сделать практически что-нибудь интересное).

кроме того, если вы не хотите использовать уведомление на основе блока, вы можете использовать старый подход на основе селектора:

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)
    }
}

в Swift 3 он заменяет и генерирует следующее.

    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
    }