草庐IT

ios - 在显示推送通知 VS 静默推送之前触发后台刷新的推送通知

coder 2023-07-25 原文

我想在收到推送时在我的应用程序中实现后台刷新功能。就在向用户显示推送通知之前,我想从我的后端 (Parse.com) 下载新消息并将它们保存到一个数组中。我正在关注这里的指南:http://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/

我不确定该指南的准确性。它指出:iOS 7(及更高版本)通过让应用程序有机会在通知用户之前在后台更新内容来扩展普通推送通知,以便用户可以打开应用程序并显示立即添加新内容。

所以我尝试像这样实现我的后台推送:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{


    if([[userInfo objectForKey:@"aps"] objectForKey:@"content-available"]){

        NSLog(@"Doing the background refresh");
        UINavigationController *navigationController=(UINavigationController *)[[[UIApplication sharedApplication] keyWindow] rootViewController];

        MyViewController *myViewController = (MyViewController *)[[navigationController viewControllers] objectAtIndex:1];

        [myViewController.currentUser refreshMessagesArrayWithCompletionHandler:^(BOOL successful, BOOL newMiaos) {

            NSLog(@"messages refreshed the array now has %lu messages",(unsigned long)[myViewController.currentUser.messages count]);
            handler(UIBackgroundFetchResultNewData);
        }];
    }
}

调用后台刷新并显示推送,但推送通知不会等待后台任务完成。它只是在收到后立即显示。这是正确的功能吗?上面的教程建议在后台任务完成之前不会显示通知。

然后我开始尝试静默通知,这会触发应用程序在收到推送但未显示通知时在后台下载消息。所以我通过在下载完成后触发本地通知来做到这一点。这真的是正确的做法吗? whatsapp 等传统应用程序是否会使用静默通知触发后台刷新,然后触发本地通知?似乎有点老套。当然,后台推送的想法是在显示通知之前准备好数据,但它并不像那样工作..

我注意到的另一件事是,静默通知是速率受限的,它们的优先级低于典型的推送通知,因此这肯定会影响应用程序的效率......

任何关于此的指示将不胜感激。如果我以正确的方式处理这个问题,我只是想弄清楚。一切看起来都很hacky...

最佳答案

我一直在为我的 messaging app 中的相同任务而苦苦挣扎。 .我们希望用户在用户点击通知之前看到消息。 我们面临的问题:

  • 负载大小限制。 iOS 7 只能有 256 字节的负载
  • 单个静默通知不会启动未运行的应用
  • content-available 没有警告正文的通知甚至可能不会传送到设备
  • 后台获取不受您的应用控制,因此您可能永远不会收到所需的信号,因此我们不能依赖此功能。但这可能有助于实现我们想要的目标
  • iOS 8 有大量空间用于负载 - 2KB
  • 如果您发送警报正文 content-available - 在大多数情况下它会被传送并且应用能够处理它

所以我们找到了唯一可以接受的解决方案:我们决定只在 ios8+ 中实现此功能。我们使用 content-available 键发送可见的推送通知,如果进程正在运行/卡住,我们可以处理通知有效负载,如果应用程序未运行,两者都能够显示通知。如果应用程序收到推送通知,它会获取警报文本正文并将其写入本地数据库,以便用户能够在对话中阅读它。根据我们的统计,消息的平均大小不超过 200 个符号,因此大多数时候不需要额外请求。如果消息超过 200 个符号,我们使用额外的参数扩展有效负载主体,该参数用于在推送通知处理中请求文本主体。用户将看到裁剪后的文本,但在完成请求后,我们会使用接收到的值在本地数据库中重写一条消息。

因此,该技术允许我们在大多数情况下立即向用户显示收到的消息 + 如果应用程序未运行,我们会向我们的服务器发出请求以在应用程序启动后立即获取丢失的消息。这是我们可以在 iOS 上获得的最快和最可接受的案例。希望我的经验能帮助您实现您想要的。

关于ios - 在显示推送通知 VS 静默推送之前触发后台刷新的推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761049/

有关ios - 在显示推送通知 VS 静默推送之前触发后台刷新的推送通知的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby-on-rails - Railstutorial : db:populate vs. 工厂女孩 - 2

    在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  6. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  7. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  8. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  9. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  10. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

随机推荐