Просто объявите услугу, как tc. сказал ниже :
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
В iOS5, однако, по-умолчанию «Bluetooth Bonjour» отключен, поэтому вы должны использовать C API, объявленный в <dns_sd.h>
.
DNSServiceRef serviceRef;
DNSServiceRegister(&serviceRef, // sdRef
kDNSServiceFlagsIncludeP2P, // interfaceIndex
0, // flags
NULL, // name
"_http._tcp", // regtype
NULL, // domain
NULL, // host
1291, // port
0, // txtLen
NULL, // txtRecord
NULL, // callBack,
NULL // context
);
Это только часть объявления; разрешение немного сложнее. Я предлагаю вам взглянуть на следующие примеры от Apple:
- SRVResolver - демонстрирует, как вы можете искать службу, используя API, объявленный в
<dns_sd.h>
. Предназначен для OS X, но включает в себя класс SRVResolver
, который вы можете использовать на iOS так же легко, как на OS X. Для работы iOS 5 Bluetooth P2P обновите вызов до DNSServiceQueryRecord()
, чтобы передать kDNSServiceFlagsIncludeP2P
как interfaceIndex
. ( ПРИМЕЧАНИЕ! Этот образец, по-видимому, не существует в наборе документов OS X 10.8. Его можно найти в наборах документов 10.6 и 10.7. В 10.8 есть пример DNSSDObjects, но я не выглядел точно при чем это.)
- WiTap - пока вы на самом деле не заботитесь о поддержке Bluetooth в iOS 5, просто посмотрите на пример под названием WiTap, который демонстрирует не только красивый Objective-C API, но и то, как вы можете создать сервер с помощью CFSocket API (тонкие обертки вокруг BSD-сокетов). Вы захотите взглянуть на это, даже если вы используете SRVResolver, чтобы увидеть, как использовать API на основе C из
<dns_sd.h>
.
После объявления или разрешения вашего сервиса вы используете обычные BSD-сокеты для прослушивания или подключения. При записи на сервер вы можете даже сначала запросить listen()
на порту 0 (ноль), а затем запросить, какой случайный доступный порт был назначен вам. После запроса объявите этот порт вместо фиксированного. Это именно то, что делает пример WiTap (но с API-интерфейсом CFSocket вместо API-интерфейса BSD-сокета).
Для получения дополнительной информации о сокетах BSD, просто Google для обучения.
Примечание: информация об iOS 5 поступает от Apple Технические вопросы и ответы QA1753 .