Запуск определенного действия, когда приложение выходит на передний план из локального уведомления в 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
}