假设您实现电子邮件客户端应用程序。 收到新邮件时,应显示通知,应用应尽快提取新邮件。 当用户点击通知中心的通知时,应用程序应显示新邮件。 但是,如果他直接打开应用程序(而不是通过通知),他应该会看到已经用最新数据更新的邮件列表。
理想情况下,应用会在收到带有 {content-available:1} 的通知时调用一个回调来更新数据,并在用户点击通知时调用另一个回调。
但是,如果应用实现了 application:didReceiveRemoteNotification:fetchCompletionHandler:,则同一回调可能会被调用两次 - 一次是在通知到达时立即调用,另一次是在用户单击通知中心的通知时调用。
那么,当回调被触发时,应用程序应该如何知道它应该导航到新邮件(当用户点击通知时)还是获取数据(由系统调用)?
更新 - 我尝试根据此 answer 查询 applicationState .这无济于事,因为当用户打开控制中心并收到通知(但未点击)时,应用程序处于非事件状态,与用户点击通知时的状态相同。
最佳答案
我同意为“background-fetch”和“user-did-tap-on-notification”调用相同的方法是相当奇怪和不方便的。
您应该能够使用应用的 UIApplicationState 对通知采取操作,无论是通过触发后台获取还是呈现 UI。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
switch ([UIApplication sharedApplication].applicationState) {
case UIApplicationStateBackground: {
// Fetch data in background
// TODO
break;
}
case UIApplicationStateInactive:
// User Tapped Notification
// If needed:
// Store the Notification, to be presented when app becomes active.
self.notificationToPresentWhenActive = userInfo;
completionHandler(UIBackgroundFetchResultNoData);
break;
case UIApplicationStateActive:
// App was open
// Present the in-app Notification UI
[self presentNotification:userInfo];
completionHandler(UIBackgroundFetchResultNoData);
break;
}
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
if (self.notificationToPresentWhenActive) {
[self presentNotification:self.notificationToPresentWhenActive];
self.notificationToPresentWhenActive = nil;
}
}
Update - I tried querying the applicationState according to this answer. This doesn't help as when the user opens the control center and a notification is received (but not tapped), the application is in inactive state, same as it is when the user taps the notification.
我无法使用控制中心(底部)或通知中心(顶部)重现此问题 (iOS 9.0.2)。也许它已在 iOS 9 或其中一个测试版中修复?
关于ios - 识别 iOS 远程通知回调的触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31941560/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
请帮助我理解范围运算符...和..之间的区别,作为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)是
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务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
我正在学习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
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我有一个rubyonrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题: