一尘不染

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

swift

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

我已经看过这个问题,但似乎并不能解决我的问题。我也遇到了这个问题,它告诉我有关使用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()");
}

我应该在哪里放置逻辑代码,以从Webview触发javascript?它是在viewDidLoad方法上还是webView委托方法之一上?我试图将代码放入viewDidLoad方法中,但布尔执行的值设置为其初始值,而不是应用程序进入前台时在委托中设置的值。


阅读 241

收藏
2020-07-07

共1个答案

一尘不染

如果我希望在应用程序回到前台时通知视图控制器,我可以只注册该UIApplication.willEnterForegroundNotification通知(完全绕过应用程序委托方法):

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在块内引用时释放视图控制器的情况(如果要更新类变量或更新类变量,可能需要这样做)做几乎所有有趣的事情)。

还要注意,即使随意阅读removeObserver
文档可能导致不必得出结论,我也会删除观察者:

如果您的应用程序针对iOS 9.0和更高版本或macOS 10.11和更高版本,则无需在其dealloc方法中注销观察者。

但是,当使用此基于块的表示形式时,您确实确实需要删除通知中心观察者。至于文件addObserver(forName:object:queue:using:)说:

要取消注册观察值,请将此方法返回的对象传递给removeObserver(_:)。您必须调用removeObserver(_:)或,removeObserver(_:name:object:)然后再addObserver(forName:object:queue:using:)释放由其指定的任何对象。

2020-07-07