ios - 当应用程序从 iOS 中的本地通知进入前台时触发特定操作? (使用 swift )

标签 ios uiwebview swift uilocalnotification

我正在使用新语言 Swift 构建一个 iOS 应用程序。现在它是一个 HTML5 应用程序,使用 UIWebView 显示 HTML 内容。该应用程序具有本地通知,我想要做的是在应用程序通过单击(触摸)本地通知进入前台时在 UIWebView 中触发特定的 javascript 方法。

我看过这个question ,但它似乎并没有解决我的问题。我也遇到过这个 question它告诉我有关使用 UIApplicationState 的信息,这很好,因为它可以帮助我了解应用程序从通知进入前台。但是当应用程序恢复时,我如何在应用程序恢复时显示的 View 的 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;


}

所以我想做的是当应用程序再次进入前台时,我想查看执行变量并按如下方式运行方法,

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

我应该把用于从 webview 触发 javascript 的逻辑代码放在哪里?它是在 viewDidLoad 方法上,还是在 webView 委托(delegate)方法之一上?我试图将该代码放在 viewDidLoad 方法中,但 bool 值 execute 的值设置为其初始值,而不是应用程序进入前台时在委托(delegate)中设置的值。

最佳答案

如果我希望在应用程序返回前台时通知 View Controller ,我可能只需注册 UIApplication.willEnterForegroundNotification 通知(完全绕过应用程序委托(delegate)方法):

class ViewController: UIViewController {

    private var observer: NSObjectProtocol?

    override func viewDidLoad() {
        super.viewDidLoad()

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

    deinit {
        if let observer = observer {
            NotificationCenter.default.removeObserver(observer)
        }
    }
}

请注意,在完成闭包中,我包含了 [unowned self] 以避免强引用循环,如果您碰巧在内部引用 self 会阻止 View Controller 被释放 block (如果您要更新类变量或做任何有趣的事情,您可能需要这样做)。

另请注意,我删除了观察者,即使是随意阅读 removeObserver documentation可能会让人得出结论是不必要的:

If your app targets iOS 9.0 and later or macOS 10.11 and later, you don't need to unregister an observer in its dealloc method.

但是,在使用这种基于 block 的再现时,您确实需要删除通知中心观察器。作为the documentation对于 addObserver(forName:object:queue:using:) 说:

To unregister observations, you pass the object returned by this method to removeObserver(_:). You must invoke removeObserver(_:) or removeObserver(_:name:object:) before any object specified by addObserver(forName:object:queue:using:) is deallocated.

关于ios - 当应用程序从 iOS 中的本地通知进入前台时触发特定操作? (使用 swift ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716012/

相关文章:

ios - 如何制作 .plist 文件

ios - 具有来自一个 API 源的多个部分的 RxDataSources tableView

ios - 如何创建专门的iOS书架应用程序?

ios - 在 UIWebView 中从 AVPlayer 获取视频 URL

objective-c - 优化扫描大文本并匹配单词或短语列表

ios - ITMS-90809 : Deprecated API Usage -- Apple will stop accepting submissions of apps that use UIWebView APIs

ios - UIWebView 最初不加载某些 URL

c++ - 在 Xcode 中诊断来自 Swift 的 iOS C++/Objective C++ 调用

ios - 在 iPhone X 中处理导航栏背景渐变

xcode - “重玩”按钮不起作用