在应用程序完全加载之前处理应用程序启动时的通知

Posted

技术标签:

【中文标题】在应用程序完全加载之前处理应用程序启动时的通知【英文标题】:handling notifications on app launch before the app fully loads 【发布时间】:2013-03-20 17:11:33 【问题描述】:

我的应用启动时的加载顺序有些问题。

当应用处于非活动状态时,我的设备正在接收远程通知。我在 didFinishLaunchingWithOptions 中处理这个问题。我从 launchOptions 获得通知,然后生成 NotificationCenter 通知,该通知在我的视图控制器中处理。

在视图控制器中,处理通知的方法是对ui进行一些更改,包括修改一些组件的布局和调用加载到UIWebView中的javascript

最后一部分永远不会发生,因为需要修改多个项目,包括将页面加载到 UIWebView 中发生在我的 viewDidLoad 中,它在处理通知的方法之后被调用。

在加载 UIWebView 或直到 viewDidLoad 完成执行之前,有什么方法可以暂停处理通知的方法的执行?

谢谢。

【问题讨论】:

为什么不在视图初始化后调用通知处理程序?通知应该在 viewDidLoad 完成后注册,以便仅在加载视图后调用。 我该怎么做?我在 awakeFromNib 中分配通知处理程序。你是说如果我在viewDidLoad中分配了notification handler,那么在viewDidLoad发生后通知会被转发给handler? 我尝试在 viewDidLoad 中分配处理程序,但它不起作用,因为通知是在 didFinishLaunchingWithOptions 中生成的,此时 viewDidLoad 还没有运行,所以处理程序不会处理生成的通知。 所以——当applicationDidFinishLaunching,你已经知道你有一个通知,对吧?那么,为什么要使用 NotificationCenter 呢?也许我不理解你原来的问题。 当 applicationDidFinishLaunching 时,我可能并不总是有通知。只有当此人从通知消息中启动应用程序时,我才会收到通知。如果该人正常启动应用程序,则 applicationDidFinishLaunching 将被调用,但我不想处理通知。当我收到通知时,我想在控制器中运行代码,这就是我使用通知中心的原因。工作流程:通知 -> 点击启动 -> applicationDidFinishLaunching -> 生成存在 pushNotification 的通知 -> 在 vi​​ewController 中执行代码 【参考方案1】:

实现 UIWebViewDelegate 并将 UIWebView 委托设置为 self。

- (void)webViewDidFinishLoad:(UIWebView *)webView

 //handle notification here


webViewDidFinishLoad

在网络视图完成加载框架后发送。

- (void)webViewDidFinishLoad:(UIWebView *)webView

【讨论】:

如何处理 webViewDidFinishLoad 中的通知?通知发布在 didFinishLaunchingWithOptions 中,因此: [[NSNotificationCenter defaultCenter] postNotificationName:@"pushNotificationAnswerCall" object:nil userInfo:remoteNotification];并且在 awakeFromNib 中分配了通知处理程序,因此: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callAnswered:) name:@"pushNotificationAnswerCall" object:nil];

以上是关于在应用程序完全加载之前处理应用程序启动时的通知的主要内容,如果未能解决你的问题,请参考以下文章

应用程序未运行时的 iOS 10 远程通知

首次启动应用程序时的 iPhone 通知

应用程序尚未启动时的 Apple 推送通知委托方法

Angular SSR 应用启动时的一些保护措施

在后台处理应用程序时的 iOS 推送通知

应用程序关闭时的本地通知处理