У меня была такая же проблема, и кажется, что данные будут отправляться только в том случае, если они помещаются в буфер сетевого стека (это объясняет, почему они работают на симуляторе, где буфер предположительно намного больше, чем на устройстве).
Обходной путь, который у нас был для этого, состоял в том, чтобы отложить планирование потока производителя. Используя performSelector:withObject:afterDelay:
, мы вызвали метод, который планирует выходной поток в цикле выполнения через 1 секунду, что оставляет URL-соединению достаточно времени для открытия потока.