打开应用时检索 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: 这样的选项?另外,我应该使用哪一个? appDidBecomeActiveappWillEnterForeground? 还有一个问题,如果我按照你说的方法检索到了通知,如何删除通知框中的通知? applicationWillEnterForeground:中的更新通知是什么意思?我不认为你这样做 - 因为用户的意图是启动应用程序而不是对通知做任何事情。如果用户想查看通知,他们需要在收到通知时进行拦截,或者正如您在问题中提到的那样,将其从通知中心拉出。 请查看我的更新@Eddie。不幸的是,如果您从应用程序的行为角度考虑,您正在寻找的东西是不可能的,而且是正确的。 我对这个答案不满意,但可能这是唯一的答案。我希望有人对此有解决方案。

以上是关于打开应用时检索 APNS 的通知的主要内容,如果未能解决你的问题,请参考以下文章

再次打开设备或 Internet 后,iOS 未收到待处理的 APNs 推送通知

ios 应用更新后未收到 Firebase/APNS 通知

APNS:如果应用程序被强制退出,则接收静默远程通知

APNs:单击通知时如何执行转场以转到特定的 ViewController

检索应用在后台时收到的通知列表

应用程序删除和 APNS