Сломанный канал AsyncUDPSocket после блокировки телефона с приложением, приостановленным в фоновом режиме

Я использую стороннюю библиотеку AsyncUDPSocket в своем приложении для iPhone, и по большей части она работает. отличный. У меня есть одноэлементный экземпляр AsyncUDPSocket, который я использую для всего своего сетевого трафика. Мое приложение зарегистрировано для отслеживания местоположения в фоновом режиме и будет просыпаться и отправлять пакеты обновления местоположения по сети во время работы в фоновом режиме. Все это отлично работает в фоновом режиме, на переднем плане, телефон заблокирован или разблокирован, за исключением случаев, когда я делаю следующее:

  1. Запустить мое приложение
  2. Отключить отслеживание местоположения в настройках моего приложения (чтобы фон не просыпался)
  3. Нажмите кнопку «Домой» (приложение переходит в фоновый режим, розетка «замораживается» вместе с остальной частью приложения)
  4. Заблокировать телефон
  5. Разблокировать телефон
  6. Возобновить приложение
  7. Попытка перезапустить отслеживание и отправить что-то из сокета. Как только я пытаюсь, я получаю сообщение об ошибке SIGPIPE/EPIPE, и приложение вылетает.

Я решил, что лучший способ справиться с этим — закрывать и освобождать сокет всякий раз, когда приложение завершает работу, а фоновое отслеживание не включено, но когда я пытаюсь выполнить [socket close] или [socket release] на AsyncUDPSocket, я получаю различные EXC_BAD_ACCESS ошибки. Я сообщил об ошибке команде разработчиков, но мне было интересно, может ли кто-нибудь здесь дать несколько идей о том, как полностью избежать ошибки SIGPIPE или о других способах поддержания сокета в рабочем состоянии, не освобождая его. Спасибо.


person Kongress    schedule 16.06.2011    source источник


Ответы (2)


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

Идеи о том, как с этим справиться здесь: Сбой SIGPIPE при переключении фоновой задачи ( он либо устанавливает игнорирование SIGPIPE для всего приложения, либо для сокета, либо предоставляет для него обработчик)

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

person Nas Banov    schedule 26.11.2011

На всякий случай, если кому-то любопытно (что, судя по статистике этого вопроса, это не так), я не смог определить, что вызывало ошибку SIGPIPE, но в конце концов разобрался с моими проблемами управления памятью (которые были из-за ошибочной реализации из onUdpSocketDidClose в моем делегате), чтобы я мог повторно инициализировать сокет при каждом перезапуске приложения.

person Kongress    schedule 24.06.2011