Подтвердить что ты не робот

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

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

Я посмотрел на этот question, но, похоже, он не решает мою проблему. Я также столкнулся с этим question, в котором рассказывается о том, как использовать 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 из webview? будет ли это методом viewDidLoad или одним из методов делегирования webView? Я попытался поместить этот код в метод viewDidLoad, но значение boolean execute установлено в его начальное значение, а не значение, установленное в делегате, когда приложение переходит на передний план.

4b9b3361

Ответ 1

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

class ViewController: UIViewController {

    private var observer: NSObjectProtocol?

    override func viewDidLoad() {
        super.viewDidLoad()

        observer = NotificationCenter.default.addObserver(forName: UIApplication.willEnterForeground, object: nil, queue: .main) { [unowned self] notification in
            // do whatever you want when the app is brought back to the foreground
        }
    }
}

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

Также обратите внимание, что в версиях iOS до 9.0 приходилось явно удалять наблюдателя, обычно в deinit, но это больше не требуется.

Ответ 2

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