Swift / iOS - не удается ответить на уведомление - PullRequest
0 голосов
/ 11 мая 2019

Итак, я внедрил Удаленные push-уведомления (apn) для моего приложения, чтобы я мог отправлять уведомления с сервера на клиент.

Мое приложениеЭто своего рода мессенджер, такой как WhatsApp или Telegram, и поэтому я хочу, чтобы клиент мог отвечать на уведомления.Итак, я реализовал расширение NotificationService .

Если я нажму на уведомление, введите свое сообщение в появившееся текстовое поле и нажмите кнопку ответа (как мы все знаем изнаше любимое приложение для обмена сообщениями) Я хочу отправить сообщение обратно на мой сервер.

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
   // on reply
   if let url = URL(string: "myserver/send/text") {
       let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
         if let serverResult = data as? String {
           print("success")
         }
       }
       task.resume() 
   }
}

Этот метод иногда работает, но я заметил, что у меня возникают проблемы, если приложение закрыто или моеiphone заблокирован: URL-адрес не извлекается с этим кодом.

С помощью отладчика я нашел в журналах что-то очень интересное: Программное обеспечение вызвало прерывание соединения .

Как я могу решить эту проблему?Изменит ли это что-то, если я реализую сокеты?Почему это работает для клиентов, таких как telegram / whatsapp, но не для меня?Что в мире я делаю не так?: - (

1 Ответ

0 голосов
/ 13 мая 2019

Для этого вам потребуется использовать фоновую задачу данных сеанса, если вы хотите, чтобы загрузка / выгрузка продолжалась после того, как ваше приложение перестало быть на переднем плане.Основные ограничения фоновых сеансов изложены в Руководстве по программированию сеанса URL: Использование NSURLSession: соображения фоновой передачи , и по существу:

  1. Использование основанного на делегате URLSession с фоновым URLSessionConfiguration.
  2. Используйте только задачи загрузки и выгрузки без обработчиков завершения.
  3. Реализация application(_:handleEventsForBackgroundURLSession:completionHandler:) в делегате приложения, сохранение обработчика завершения и запуск фонового сеанса.
  4. Реализация urlSessionDidFinishEvents(forBackgroundURLSession:) в вашем URLSessionDelegate, вызывая сохраненный обработчик завершения, чтобы сообщить ОС, что вы закончили обработку завершения фонового запроса.

Также обратите внимание на тот факт, что задачи фоновой загрузки могут работать столько файлы.Они сразу же потерпят неудачу, если вы попытаетесь загрузить массив байтов в виде объекта данных из памяти.

...