Как вы говорите, вы не можете ожидать, что пользователи будут вручную открывать порты на своем брандмауэре, но вы не можете ожидать, что их брандмауэры разрешат это в первую очередь.
Я бы посоветовал вам лучше всего использовать uPNP и настроить совместимые маршрутизаторы для переадресации портов, аналогично BitTorrent. Мне повезло с фреймворком TCMPortMapper , и он используется в таких приложениях, как subethaedit . Чтобы бесстыдно вырвать из документации, открыть порт так же просто, как это:
TCMPortMapper *pm = [TCMPortMapper sharedInstance];
[pm addPortMapping:
[TCMPortMapping portMappingWithLocalPort:1337 # local port iPhone listens on
desiredExternalPort:13337 # remote port you want router to listen on
transportProtocol:TCMPortMappingTransportProtocolTCP
userInfo:nil]];
[pm start];
Имейте в виду:
- Вышеуказанное должно работать непрерывно (что блокирует основной поток), чтобы порт оставался открытым. Вы хотите запустить его в фоновом режиме и зарегистрироваться для уведомлений. Прочитайте документацию для более подробных примеров.
- uPNP просто «запрашивает», чтобы маршрутизатор открыл данный порт. Он может отказаться, или он может не поддерживать его в первую очередь. Там нет никакого способа гарантировать, что это будет успешно, хотя вы можете уведомить пользователя, если это не так. Ваше приложение должно обслуживать это.