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

我在收到的消息通知中添加了“文本输入操作”,它按预期运行。

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

无论我如何将NSURLSessionDataTask设置为POSTuserText的输入响应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:并实现了所需的Delegate方法,该操作也无法正常工作。

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

我怀疑我的后台网络出了点问题,但是我无法解决这个问题,在我所寻找的地方都找不到答案。这里的文档也很稀疏。

最佳答案

对于将来遇到这个问题的人:我可以通过将content-available:1添加到推送通知有效内容中来解决此问题。我仍然在这里使用数据任务和共享的URL session 。对于有兴趣的人,也没有代表与完成块一起工作。

最初我认为这行不通,添加内容可用标记实际上还有另一个原因,因此很好地解决了我遇到的最初问题。为什么我认为这行不通?容易,因为如果我们认为文档可用,那么可用的内容会向应用程序指示可以下载的内容。有一种特殊的应用程序委托方法专门用于这种情况:
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
响应用户对通知的操作的方法也有更多的时间来处理,这是一个很好的副作用。

整洁的好处:我还发现,无需添加内容可用标志,Apple Watch即可进行快速回复,因为我猜想,该操作系统允许应用程序在响应Apple请求时执行更长的后台操作看。

09-16 20:44