我已经实现了静默推送通知,但我注意到一些奇怪的行为。静默推送通知通过以下方式处理:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
静默推送消息似乎仅在设备正在充电(即连接电缆)和/或我的应用程序处于前台时才会收到。
如果我断开设备与充电器(或 Mac)的连接,则不再接收静默推送通知除非应用程序在前台。
在这两种情况下,我通常都会收到非静默推送通知。
如果我再次插入 USB 数据线,那么无论应用是在前台还是后台,我都会收到预期的行为和静默推送通知。
我正在使用 UILocalNotification,所以我知道收到了什么。
在连接的设备上它一切正常的事实表明我的静默推送通知配置正确并且应用程序在 plist 等中设置了正确的背景模式。
此行为在运行 IOS 8 或 8.1 的 iPhone 5s、6 和 iPad 2 上可重复。
有没有人遇到过这种情况?它应该很容易重现。为什么将设备插入充电器这一简单操作会改变接收静默推送通知的能力?
最佳答案
我们遇到过相同的行为,并且一直在努力理解为什么 iOS 决定提供一些通知而不是其他通知。
到目前为止我们已经解决的问题是:
与蜂窝数据相比,使用 wifi 时在后台更可靠地接收消息。事实上,在蜂窝网络(3g/4g)上,如果你的信号强度不够强,iOS 会收到推送消息,但不会唤醒你的应用程序。我们在苹果论坛上发布了关于它的信息:https://devforums.apple.com/message/1069814#1069814 .我们还打开了一张支持票,支持团队告诉我们将其作为错误报告提交,我们几周前就这样做了,现在仍在等待回复。
当您收到推送消息时,您需要尽快调用 fetchCompletionHandler。从技术上讲,你有 30 秒的时间来执行后台处理,但 iOS 有一个公式,你发送推送消息的频率越高,并且根据你在将应用程序返回挂起状态之前处理这些消息所花费的时间,iOS 可以减少数量您的应用在未来被唤醒的次数。
从这里查看 Apple didReceiveRemoteNotification:fetchCompletionHandler:文档:
As soon as you finish processing the notification, you must call the block in the handler parameter or your app will be terminated. Your app has up to 30 seconds of wall-clock time to process the notification and call the specified completion handler block. In practice, you should call the handler block as soon as you are done processing the notification. The system tracks the elapsed time, power usage, and data costs for your app’s background downloads. Apps that use significant amounts of power when processing push notifications may not always be woken up early to process future notifications.
在我们的测试中,我们一直在向我们的应用程序发送频繁的静默推送通知(每 10 - 30 秒)。在我们让它重新进入休眠状态之前,该应用程序会唤醒大约 3 秒钟。随着时间的推移,我们确实注意到我们的应用程序被唤醒的频率下降到 iOS 只会每 15 - 30 分钟唤醒一次应用程序。因此,似乎存在某种衰减/节流公式,但我们找不到有关其具体工作原理的任何文档。我们已向 apple 请求此公式和变量作为支持请求,但他们说“您请求的信息不公开”,并再次要求我们提交错误报告。
那么,希望这对您有所帮助?我们仍在尝试自己学习更多,这就是为什么我发现了这个问题:)
关于ios - 静默推送通知仅在设备正在充电和/或应用程序处于前台时发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26959472/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty