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



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

当用户触摸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. 执行操作1
  2. perform action2BEFORE调用action1的completionHandler
  3. 调用action2的completionHandler后,执行action3

之后,我发现action3的completionHandler被调用了NEVER,这意味着action3被NEVER处理。

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

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

- beginBackgroundTaskWithExpirationHandler:

- endBackgroundTask

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

它是有效的。^_^

最新更新