当前位置: 首页 > 面试题库 >

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

易流觞
2023-03-14
问题内容

我正在使用新语言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方法中,但布尔执行的值设置为其初始值,而不是应用程序进入前台时在委托中设置的值。


问题答案:

如果我希望在应用程序回到前台时通知视图控制器,我可以只注册该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:)释放由其指定的任何对象。



 类似资料:
  • 我使用firebase在iOS中实现推送通知,目标为C。我有方法,根据其描述,当应用程序处于后台且用户点击通知时,以及当应用程序处于前台时,都应该触发该方法。问题是它只能在后台工作(或者当应用程序没有运行时)。我是不是忘了什么?

  • 我想在通知屏幕上显示通知,无论应用程序是在后台还是前台。我为寻找解决办法而疲惫不堪。非常感谢任何帮助。

  • 我遵循本教程在我的android设备上接收推送通知。 我可以从Firebase控制台发送推送通知-我还可以在logcat中看到Firebase事件,但我的永远不会被触发。我的应用程序在前台运行。 以下是我发送通知后logcat中的输出: MyFirebaseMessageService.java FirebaseIDService.java AndroidManifest.xml: build.g

  • 我想知道是否有可能在应用程序打开然后关闭时向设备发送本地通知。 当我的应用程序打开并在后台时,它已经工作了。 谢啦 编辑:我想我还不够清楚: 我想在给定时间发送本地通知,即使应用程序当时未运行。

  • 和分别用于: > 当应用程序在后台时用户点击通知时处理 当手机在前台时收到通知时进行处理。 但是,当应用程序在前台时,我们如何处理用户点击通知的事件?(例如,在点击通知时将用户带到相关的视图控制器)

  • 问题内容: 我正在尝试创建一个计时器,该计时器在用户设置好时间后触发本地通知。我遇到的问题是我无法找出一种方法来设置本地通知在晚上7:00发出。研究此问题时发现的几乎所有方法都涉及从当前日期起在一定时间范围内关闭本地通知。我试图允许用户选择7:00 PM,然后在该时间关闭通知。从逻辑上讲,这可以通过设置最终时间(用户选择的值)-当前时间来实现,这将为您带来时差。但是,我不确定如何执行此操作。 非常