处理前一个时收到另一个远程通知操作

Posted

技术标签:

【中文标题】处理前一个时收到另一个远程通知操作【英文标题】:Receive another remote notification action when handling the previous one 【发布时间】:2015-12-01 03:57:37 【问题描述】:

我搜索了一段时间,没有看到任何相关的答案,所以我必须打开一个新问题。如有重复请指出。

当用户触摸 ios 通知操作时,会向应用委托发送以下方法:

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler

根据文档,当应用程序处理完动作后,应该调用completionHandler。所以如果进程是异步的,那么委托方法可能是这样的:

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        sleep(5);
        dispatch_async(dispatch_get_main_queue(), ^
            NSLog(@"completed with notification %@", userinfo);
            completionHandler();
        );
    );

这里,全局队列休眠 5 秒以模拟动作处理。

通过上面的设置,我采取了以下步骤:

    执行操作1 执行action2 之前调用action1的completionHandler。 action2的completionHandler被调用后,执行action3

之后发现action3的completionHandlerNEVER被调用,也就是说action3被NEVER处理了。

我在 iOS 9 中发现了这个,不确定其他 iOS 版本。 这是为什么?我能做些什么来修复它?谢谢。

【问题讨论】:

【参考方案1】:

最后,我把completionHandler执行和异步执行代码放在这对API的中间:

- beginBackgroundTaskWithExpirationHandler:

- endBackgroundTask

确保completionHandler可以按我的顺序调用,并且在应用程序运行到后台模式时不会被挂起。

而且它有效。 ^_^

【讨论】:

以上是关于处理前一个时收到另一个远程通知操作的主要内容,如果未能解决你的问题,请参考以下文章

应用程序未运行时处理远程通知时崩溃

为啥我收到远程通知时没有发送本地通知?

在后台处理远程通知

远程通知中的自定义声音 iOS 10,swift 3

iOS 在收到静默远程通知后发送本地通知

未运行状态下的远程通知处理