只需宣布服务,就像tc。下面已经说了 https://stackoverflow.com/q/3845920/39974:
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
然而,在 iOS5 中,默认情况下禁用我们称之为“蓝牙 Bonjour”的功能,因此您必须使用在<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
您可以像在 OS X 上一样轻松地在 iOS 上使用它。要使 iOS 5 蓝牙 P2P 正常工作,请将调用更新为DNSServiceQueryRecord()
通过kDNSServiceFlagsIncludeP2P
as the interfaceIndex
. (NOTE!OS X 10.8 文档集中似乎不存在此示例。它可以在 10.6 和 10.7 文档集中找到。 10.8 中有 DNSSDObjects 示例,但我没有具体了解它的作用。)
- WiTap - 只要您实际上并不关心 iOS 5 上的蓝牙支持,只需查看名为 WiTap 的示例,它不仅演示了漂亮的 Objective-C API,还演示了如何使用 CFSocket API 创建服务器(瘦) BSD 套接字的包装器)。即使您使用 SRVResolver 来了解如何使用基于 C 的 API,您也需要查看此内容
<dns_sd.h>
.
宣布或解决您的服务后,您可以使用常规 BSD 套接字来侦听或连接。在编写服务器时,您甚至可能想首先listen()
在端口 0(零)上,然后查询分配给您的随机可用端口。查询后,宣布该端口而不是固定端口。这正是 WiTap 示例正在做的事情(但使用 CFSocket API 而不是 BSD 套接字 API)。
有关 BSD 套接字的更多信息,只需 Google 一下即可找到教程。
注:有关iOS 5的信息来自Apple技术问答 QA1753 http://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315.