我搜索了一段时间并没有看到任何相关的答案,所以我必须打开一个新问题。请指出它是否重复。
当用户触摸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秒,以模拟操作处理。
通过上述设置,我采取了以下步骤:
之后,我发现action3的completionHandler NEVER 被调用,这意味着action3 从不 dealed。
我在iOS 9中发现了这个,不确定其他iOS版本。 这是为什么?我该怎么办才能修复它?感谢。
答案 0 :(得分:1)
最后,我将completionHandler执行和异步执行代码放在这个配对API的中间:
- beginBackgroundTaskWithExpirationHandler:
和
- endBackgroundTask
确保可以在我的序列中调用completionHandler,并且当app运行到后台模式时不会挂起。
它有效。 ^ _ ^