快速回复:来自“userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:”的NSURLSessionDataTask

时间:2017-10-23 15:42:46

标签: ios objective-c push-notification background-process nsurlsession

我已成功为我的消息传递应用程序设置了远程通知,并且希望合并iOS的“快速回复”功能,现在更好地称为UNTextInputNotificationAction UNUserNotificationCenter

我将文本输入操作添加到我的传入消息通知中,并且它按预期工作。

我的问题在于UNUserNotificationCenterDelegate函数userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:

无论我如何设置NSURLSessionDataTask POST userText的输入回复UNTextInputNotificationResponse,请求总是超时。当我对应用程序位于前台时收到的通知进行“快速回复”时,它确实可以正常工作。

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {

    if ([response isKindOfClass:UNTextInputNotificationResponse.class]) {

        if ([response.actionIdentifier isEqualToString:@"REPLY_MESSAGE"]) {

            [ApiManager chatWithId:@"123456789abcdefg" postTextMessage:[(UNTextInputNotificationResponse *)response userText] completion:^(Message *message) {

                if (!message) {

                   NSLog(@"Sending failed");

                }

                completionHandler();
            }];
        }
    }

}

ApiManager中的数据任务是在[NSURLSession sharedSession]之上构建的 - 请注意,即使将其更改为backgroundSessionConfigurationWithIdentifier:并实现所需的委托方法,这也无效。

通过控制台可以看到日志“发送失败”,如果我检查DataTask的错误,则会显示“超时”错误。

我怀疑我的背景网络有问题,但我无法绕过它,我看不到任何答案。这里的文档非常稀少。

1 个答案:

答案 0 :(得分:1)

对于将来绊倒此问题的任何人:我能够通过将content-available:1添加到我的推送通知有效负载来解决此问题。我仍然在这里使用数据任务和共享URL会话。对于任何感兴趣的人,没有代表,使用完成块。

我最初认为这不会起作用,添加内容可用标志实际上有另一个原因,所以这很好解决了我遇到的初始问题。为什么我认为这不起作用?很容易,因为如果我们相信文档,可用的内容向应用程序指示有可供下载的内容。特别是在这种情况下,有一个特殊的应用程序委托方法被调用:

application(_:didReceiveRemoteNotification:fetchCompletionHandler:)

这是一个很好的副作用,响应用户对通知的操作的方法也有更多的时间来处理。

整洁的奖励:我还发现,在没有添加内容可用标志的情况下,快速回复可以在Apple Watch上运行,因为我认为操作系统允许应用在响应请求时执行更长时间的后台操作来自Apple Watch。