我正在开发一个连接到网络服务的 iOS 应用程序。为了进行开发和测试,我们使用 Bonjour 查找本地网络上的服务器,并在登录期间应用程序提供连接到其中之一而不是生产站点的服务。
自从升级到 El Capitan 以来,我无法从模拟器连接到同一台 Mac 上运行的 Web 服务器。我能够使用模拟移动 Safari 和 OS X 中的 Python 附带的 Web 服务器来重现此问题。
python -m SimpleHTTPServer 8000
http://my-computer-name.local.:8000/
模拟移动 Safari 显示“Safari 无法打开页面,因为它无法连接到服务器。”
此外,每次我尝试加载 URL 时,控制台中都会出现以下消息:
assertiond[____]: assertion failed: 15A284 13A340: assertiond + 13207 [28CC4371-F3F9-3578-9436-310B23A2C638]: 0x1
其他可能相关的事实:
http://my-computer-name.local.:8000/
http://my-computer-name.local.:8000/
http://127.0.0.1:8000/
进行连接(不过,我需要它与 Bonjour 提供的主机名一起使用)。http://other-computer.local.:8000/
你能重现这个问题吗?我是不是错过了什么?
我通过向本地 OSX /etc/hosts 文件添加一个条目来解决这个问题:
在“localhost”后附加您的 FQDN:
127.0.0.1 本地主机 mymachine.mydomain.local
可能导致此问题的一个问题是,在某些时候,macOS 和 Safari 似乎开始默认使用 ipv6,因此,如果您尝试导航到
my-computer-name.local
,它将尝试访问 ::1
而不是 127.0.0.1
。但是 python -m SimpleHTTPServer
仅侦听所有 ipv4 接口,使用 0.0.0.0
:
$ python -m SimpleHTTPServer 8000
Serving HTTP on 0.0.0.0 port 8000 ...
因此这可能会导致连接问题。
这在 python3 中已修复(至少是 3.10.6),所以这应该工作得更好:
$ python3 -V
Python 3.10.6
$ python3 -m http.server 8000
Serving HTTP on :: port 8000 (http://[::]:8000/) ...
ipv6 的一个很好的功能似乎是,如果您使用
::
监听所有接口,您也也 监听所有 ipv4 接口,所以例如curl 127.0.0.1:8000
也有效。