使用 Swift for iOS 处理来自关闭应用程序的推送通知,如何显示它然后返回关闭或暂停?

Posted

技术标签:

【中文标题】使用 Swift for iOS 处理来自关闭应用程序的推送通知,如何显示它然后返回关闭或暂停?【英文标题】:Using Swift for iOS to process push Notification from closed app, how to just show it then return to closed or suspended? 【发布时间】:2018-06-22 19:01:07 【问题描述】:

当应用程序关闭并收到推送通知时,我想快速处理通知并将其显示给用户,然后让应用程序重新关闭(或可能暂停)。相反,应用程序保持运行,甚至尝试加载根视图控制器。 我的代码注册后台工作,完成后取消注册。

    var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
    func registerBackgroundTask() 
      if backgroundTask == UIBackgroundTaskInvalid 
        backgroundTask = UIApplication.shared.beginBackgroundTask  [weak self] in
          self?.endBackgroundTask()
      
      assert(backgroundTask != UIBackgroundTaskInvalid)
      
    

func endBackgroundTask() 
  print("Background task ended.")
  UIApplication.shared.endBackgroundTask(backgroundTask)
  backgroundTask = UIBackgroundTaskInvalid

由于新的 APNs 推送通知,我可以使用 Xcode 测试我的代码,以便在我的应用程序启动时附加到它。通知处理完成后,应用程序仍处于活动状态。 我需要强制应用暂停吗? 我认为 ios 在完成通知处理后会关闭或暂停应用程序,然后我调用 endBackgroundTask。 此外,如果我关闭 Xcode 以使应用程序调试器停止,然后在我的设备上启动它,我会看到它正在运行并显示根视图控制器(尽管未完全初始化,因为该代码未针对此类启动运行)。 我错过了什么?

【问题讨论】:

【参考方案1】:

首先,调用 'registerBackgroundTask' 两次将导致 'backgroundTask' 被覆盖,您将失去结束最新任务以外的任务的能力。

相反,应用继续运行,甚至尝试加载根视图控制器。

其次,请确保您阅读了有关应用程序生命周期的内容:[1] 和委托方法 [2]。通常,您的应用程序将处于后台(无论是处于后台执行模式还是处于挂起状态),但推送通知也可以强制启动您的应用程序(以防它根本没有运行)。然后由您来优雅地处理它,并在不需要时不加载 UI。

1 - https://developer.apple.com/documentation/uikit/core_app/managing_your_app_s_life_cycle 2 - https://developer.apple.com/documentation/uikit/uiapplicationdelegate

【讨论】:

感谢您的回复。我只调用 registerBackgroundTask 一次。事实上,我的代码在调用 beginBackgroundTask 之前检查以确保 backgroundTask = UIBackgroundTaskInvalid。

以上是关于使用 Swift for iOS 处理来自关闭应用程序的推送通知,如何显示它然后返回关闭或暂停?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 如何为 For 循环 SKAction 使用完成处理程序

iOS 通知:WhatsApp 在强制关闭后如何接收通知和处理?

在 iOS SWIFT 2 中取消获取请求 [关闭]

在 iOS (Swift) 中使用后台位置更新的最佳方式 [关闭]

应用程序关闭之前/应用程序打开之前的 Swift iOS 9+ [重复]

iOS的通知:如何WhatsApp的接收通知,并强制关闭,即使他们以后的过程?