打开应用时检索 APNS 的通知
Posted
技术标签:
【中文标题】打开应用时检索 APNS 的通知【英文标题】:Retrieve the APNS's notification when open app 【发布时间】:2015-10-26 10:04:31 【问题描述】:不知道有没有人经历过这种情况,但是是这样的:
我已经完成了 APNS,应用确实收到了通知。当我从通知(调用appDidReceiveRemoteNotification:
)打开应用程序时,它运行良好。
奇怪的是,当应用程序处于后台时,它会收到通知(显示在通知框中)。当我通过点击图标(不是通知)打开应用程序时,调试器并没有停在appDidReceiveRemoteNotification:
或appDidFinishLaunchWithOption:
,所以我的通知没有保存。当我再次拉下通知框并点击通知时,调试器按预期停止在appDidReceiveRemoteNotification:
。如何通过在应用图标上打开应用来更新通知?
** 编辑 **
感谢 abhinav,我意识到我误用了该方法。我应该使用任何一个
- (void)applicationWillEnterForeground:(UIApplication *)iApplication // Or
- (void)applicationDidBecomeActive:(UIApplication *)iApplication.
但是,我的应用程序设计显示服务器可以向用户发送消息(关于更新、新闻......)。代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//....
if (launchOptions)
NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary)
[Message saveMessage:dictionary];
NSLog(@"Launched from push notification: %@", dictionary);
//....
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
// Save message to coredata.
[Message saveMessage:userInfo];
// Perform seggue, showing inbox viewcontrollers here.
但是从后台打开应用程序时使用的两种方法都没有提供通知字典,而且我的老板要求我在从后台打开应用程序时更新核心数据,我该怎么做?或者我应该告诉我的老板不能被收购?我们不希望用户错过有关更新的通知。
【问题讨论】:
请展示您的代码块appDidReceiveRemoteNotification:
或 appDidFinishLaunchWithOption:
当您的应用来自后台时,永远不会被调用。进入前台时,applicationWillEnterForeground:
或 applicationDidBecomeActive:
代表将通知您。如果你想更新通知徽章,那么你可以在这里做。
【参考方案1】:
你到底想做什么?如果你想更新你的应用程序的徽章计数,那么你只需要在 applicationDidBecomeActive 中将应用程序徽章计数设置为 0:
要清除通知面板中的通知,请使用以下代码:-
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
【讨论】:
【参考方案2】:您在这里对通知案例没有做任何不同的事情。当应用程序处于后台并且用户点击应用程序图标时,无论是否收到推送通知,您都会收到以下方法的回调。
- (void)applicationWillEnterForeground:(UIApplication *)iApplication
- (void)applicationDidBecomeActive:(UIApplication *)iApplication
application:didFinishLaunchingWithOptions:
是在应用程序启动时调用的方法 - 首次触发或通知触发。当应用程序通过通知点击唤醒时,appDidReceiveRemoteNotification:
会被调用。
所以,回答您的问题 - 您正在体验自然的 iOS 行为!!!
编辑:
如果我是你,我会去找我的老板解释 ios 的工作方式。并礼貌地告诉他不可能。在后台时,除非用户打算查看传递的通知,否则 iOS 不允许您获取详细信息。
【讨论】:
但是我如何更新那里的通知,因为它没有像application:didFinishLaunchingWithOptions:
这样的选项?另外,我应该使用哪一个? appDidBecomeActive
或 appWillEnterForeground
?
还有一个问题,如果我按照你说的方法检索到了通知,如何删除通知框中的通知?
applicationWillEnterForeground:
中的更新通知是什么意思?我不认为你这样做 - 因为用户的意图是启动应用程序而不是对通知做任何事情。如果用户想查看通知,他们需要在收到通知时进行拦截,或者正如您在问题中提到的那样,将其从通知中心拉出。
请查看我的更新@Eddie。不幸的是,如果您从应用程序的行为角度考虑,您正在寻找的东西是不可能的,而且是正确的。
我对这个答案不满意,但可能这是唯一的答案。我希望有人对此有解决方案。以上是关于打开应用时检索 APNS 的通知的主要内容,如果未能解决你的问题,请参考以下文章
再次打开设备或 Internet 后,iOS 未收到待处理的 APNs 推送通知