当前位置: 首页 > 知识库问答 >
问题:

iOS11 swift silent push(后台获取,didReceiveRemoteNotification)不再工作

东方嘉佑
2023-03-14

我希望iOS11版本能够解决静音推送的问题,这个问题出现在最新的betas和GM版本的iOS中。

目前我很难理解,为什么我没有收到任何静默推送消息,这些消息实际上应该唤醒我的应用程序,在后台执行一些需要的任务。

在iOS 10中,我只使用后台提取功能,并在AppDelegate中实现了“唤醒代码”,如下所示。

在iOS 11中,注册代码仍然运行良好,我的后端也将推送通知发送到Apples DEV服务器(沙箱)和PROD服务器(生产版本)。不幸的是,静默推送通知从不调用函数 Void)/code>。

null

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  // .. some variables here ...

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

       // register silent push notification in backend
       application.registerForRemoteNotifications()

       // ... some code here ... 


       // Set Background Fetch Intervall for background services / terminated app
       UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)

       // ... some code here ... 

       return true
   }

   func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
       let tokenParts = deviceToken.map { data -> String in
           return String(format: "%02.2hhx", data)
       }
       let token = tokenParts.joined()
       logger.log.debug("Device Token: \(token)")

       let realm = RealmController()
       let user = realm.getLoggedInUserObject()

       // Send push token to server
       if let user = user {
           let email = user.email!

           let serverController = ServerController.serverController
           serverController.sendPushToken(token: token, email: email) { status in
               if status == 201 {
                // ... some code here ...
               } else {
               // ... some code here ...
               }
           }
       }
   }
   func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
       logger.log.debug(error)
   }
   func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
       logger.log.debug(userInfo)

       let aps = userInfo["aps"] as! [String: AnyObject]
       if aps["content-available"] as? Int == 1 {
          // .... some silent push tasks here ....
       }
   }
}

共有2个答案

姬雪松
2023-03-14

你所经历的实际上是一个有充分记录的行为,而不是一个bug。

Apple's文档中写道:“系统将静默通知视为低优先级。你可以使用静默通知刷新你的应用程序内容,但系统并不保证它们的传递。此外,如果静默通知的总数过多,可能会限制静默通知的传递。系统允许的静默通知的实际数量取决于当前条件,但不要尝试每小时发送超过两到三个静默通知。”

总而言之,静默通知并不能保证唤醒你的应用程序。为什么?用户设备上后台的应用程序被唤醒的次数越多,电池消耗就越高。

根据IBM的声明,“随着iOS 11的问世,苹果在处理某些类型推送消息的方式上做了一些改变。这样做是为了提高电池续航时间,但这是以用户体验为代价的,很可能会影响你的应用程序。”你可以在这里找到更多的细节。

柳逸春
2023-03-14

最终更新2017-10-31

苹果刚刚在万圣节正式发布了iOS11.1

更新2017-10-09

苹果今天发布了iOS11.1测试版2。他们在释放说明中再次提到以下说明:

已解决的通知问题

静默推送通知的处理频率更高。(33278611)

我将再次测试这个beta 2版本并更新这个答案以供参考。

更新测试-&>;经过不同场景的一些测试,这个bug似乎在最新的iOS11.1beta2版本中得到了修复。现在只能等待官方发布了。在一些论坛上,他们假设苹果将在10月下旬发布iOS11.1。

较旧的帖子

上周我调查了很多时间来寻找关于这个问题的答案。在阅读了苹果发布说明(包括已弃用,更改和新增功能)后,我测试了以下情况:

我在 中添加了空函数,现在静默推送在前台和后台都能正常工作:

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        logger.log.debug("Perform Fetch with completion handler TEST")
    }

我不确定此“变通方法”是否与以下 hashable:any],fetchcompletionhandler="" completionhandler:@escaping(uibackgroundfetchresult)-&=""> Void)/code>未在IOS11中调用有关。

不过,如果你发现了同样的行为,你可以试一试并给我反馈。

更新2017-09-25

在我的案例中,“静默推送”现在可以在前台和后台模式下工作,但如果应用程序被用户或操作系统挂起,就不行了。所以这个问题仍然是开放的,没有修复-任何帮助感谢!欲知更多信息,请参见此线程:iOS 11上的静默推送未交付给应用程序

更新2017-10-05

苹果日前发布了iOS11.1测试版。他们在释放说明中提到:

已解决的通知问题br>静默推送通知的处理频率更高。(33278611)

一些开发人员说这个问题已经在这个测试版中解决了,其他开发人员说这个问题在某些情况下仍然存在。现在,苹果推出iOS11.1将是一件有趣的事情。

 类似资料:
  • 问题内容: 我希望iOS11版本能够解决无提示推送问题,该问题已在最新的Beta和GM版本的iOS中出现。 目前,我一直在努力理解为什么我没有收到任何静默的推送消息,这实际上应该唤醒我的应用程序以在后台执行一些所需的任务。 在iOS 10中,我仅使用后台获取功能,并在AppDelegate中实现了“唤醒代码”,如以下代码所示。 在iOS 11中,注册代码仍然可以正常工作,我的后端还向Apple D

  • 我正试图通过后台获取从url获取数据。My func尝试获取数据,如果有新数据,它会发送本地通知。当我最小化应用程序时,背景提取在大约10-20分钟后工作。但当我关闭应用程序(双击home按钮并关闭应用程序)时,它就不起作用了。我等了大约一个小时,但没有成功。我正在Android系统中使用后台服务,它正在成功运行。当应用程序关闭时,有没有办法从url获取数据并发送本地通知?我使用的是Xcode 6

  • cmf_get_admin_style() 功能 获取当前后台风格名称 参数 无 返回 string 风格名称

  • 我最近更新了我的自制Python 3.8安装。2至3.8。3.做完后,我跑了 以检查是否有任何更新。它更新了我从20.0安装的。2至20.1。1,并且自从我运行该命令以来,在我尝试使用它的任何时候都会抛出一个错误。以下是错误: 升级过程中似乎出现了一些问题,未能更改代码中的版本检查。我看到了类似的问题,但公认的答案对我来说并不适用。如何使再次可用?

  • cmf_get_admin_style() 功能 获取当前后台风格名称 参数 无 返回 string 风格名称

  • 我有一个奇怪的问题,每天我的AJAX请求一个网站不再工作。 我现在正在努力使它工作,但找不到问题。 这是我的JavaScript:基本上它非常简单,它检索ip adres并将其发送到存储它的站点。 在服务器上,我现在添加了这一项,以避免使用通配符 当我只使用 头('access-control-allow-origin:');我得到错误:Cross-Origin-request blocked:C