这不是一个典型的编程问题,但我认为这是测试基于 Bonjour 的代码的巨大障碍。
Bonjour 支持两种服务器通知客户端其存在的机制,首先是本地网络上的多播,其次是 DNS。
组播很容易使用,因为没有设置,可惜只能在同一个网络上使用。
DNS 可以跨路由器(互联网)工作,但它需要正确配置的名称服务器和使用该名称服务器的客户端。
我认为你只有两个选择。
- 在 WiFi 网络上宣传您的 bonjour 服务
- 配置您自己的 DNS
在第一种情况下,重要的是要认识到服务不一定必须由您自己在 Mac 上运行的应用程序来宣传。您可以使用实用程序dns-sd 将任何 IP 地址/端口注册为网络上的 Bonjour 服务。为此,您需要一台连接到 WiFi 的机器(Mac、Linux),并以与此类似的方式在那里运行 dns-sd:
dns-sd -P "Stack Overflow" _http._tcp . 80 stackoverflow.com 69.59.196.211
这会将名为“Stack Overflow”的“http”服务注册为 Bonjour 服务。检查一下 - 在终端中运行它并在 Bonjour 下的 Safari 的书签中检查它。注册应用程序的方式相同。
不幸的是,您需要在连接到 WiFi 网络的机器上运行它。这意味着您的 Mac 应用程序将在其自己的以太网网络上做广告,dns-sd 在 WiFi 上做广告。
第二个选项有点吓人,但如果你愿意参与一些管理,这没什么大不了的。
同样,您不需要在 DNS 中动态注册服务。您可以在 DNS 配置中简单地硬编码您的 Mac 名称和应用程序的端口。这些只是需要添加到区域文件(DNS 配置文件)中的 4 行。
b._dns-sd._udp IN PTR @ ; b = browse domain
lb._dns-sd._udp IN PTR @ ; lb = legacy browse domain
_icool._tcp PTR iCool\ App\ Service._http._tcp
iCool\ App\ Service._http._tcp SRV 0 0 8888 macpro.domain.com.
前两行告诉客户端(在您的情况下为 iOS 设备)Bonjour 已为此域启用。第三行告诉客户有一个icool 类型的服务“iCool App Service”可用。第四行告诉客户端当前服务的地址和端口。
客户端将为其配置的(或通过 DHCP 获取的)“搜索域”查找 DNS 条目。检查您的网络设置。
您可以在 Mac、某些 Linux 机器上运行名称服务器,也可以使用 dyndns.com 等服务。
希望这会有所帮助。