Я не знаю много о NSNetService, но кажется, что он работает только в локальной сети.Если вы хотите установить p2p-соединение от iphone к другому, у вас всегда будет проблема с несколькими NAT (трансляторами сетевых адресов) на вашем маршруте.Как найти адрес и маршрут к пиру?И как пройти через все брандмауэры и NAT?
Я работаю над приложением, которое должно решить ту же проблему, и я ответил на аналогичный вопрос, перед которым я приведу здесь:
На самом деле это возможно.Возможно, вы захотите поискать в Google что-нибудь под названием «UDP дырокол» или «TCP дырокол».
Короче говоря, основной подход: если у вас есть что-то вроде сервера ретрансляции, то есть некоторый сервер в Интернете,общедоступный из любой частной локальной сети, подключенной к www.Нет, у вас есть два клиента A и B в (разных) частных локальных сетях, где происходит преобразование сетевых адресов (NAT), которые хотят установить одноранговое соединение.
Прежде всего оба сообщатсервер их IP-адрес и порт, который они имеют в своей локальной сети.В пакете UDP или TCP сервер найдет публичный адрес и порт устройства (или NAT (маршрутизатор)).Таким образом, сервер знает частный и общедоступный IP-адрес, а также порты.
Если теперь A хочет связаться с B, он просит сервер о помощи.Сервер отправит сообщение B, что A хочет связаться с ней, сообщив ей публичный и частный IP и порт A.A возвращает общедоступную и личную информацию B и порт.
Теперь здесь происходит волшебство.Теперь оба клиента отправляют пакеты для одновременного установления соединения с частными и общедоступными адресами другой стороны и, таким образом, помещают целое в свои NAT, чтобы входящие соединения не блокировались.Даже если пакеты для установления соединения одной из сторон будут поступать до того, как будет создано это целое, пакеты другой стороны дойдут до такой степени, что соединение может быть создано.
Остерегайтесь некоторых NAT, которые сканируют данные на предмет IP-адресов и переводят ихтакже, но если вы зашифруете свои данные или измените внешний вид адреса (дополните, ...), у вас все будет хорошо.
Теперь главный вопрос, как сервер может общаться с одним из клиентов без активного соединения.Ну, в этом случае вы можете использовать «обратное подключение» и «push-уведомления» от Apple.Используйте «push-уведомления» (pn), чтобы сообщить клиенту за NAT, что происходит что-то интересное и что он должен связаться с сервером.После того, как это сделано, соединение активно и может использоваться в описанном ранее порядке.
Я надеюсь, что это поможет некоторым людям, которые решают эту проблему, хотя сообщение довольно старое!
Теперь, если вы найдете это решение полезным и попытаетесь его реализовать, сообщите мне, если вам удалось получить общедоступный IP-адрес и порт соединения сервер-клиент на стороне сервера.Вы также можете ответить на мой вопрос по этому поводу на stackoverflow .