当初被Catalina能够和pad共享屏幕所吸引,所以Catalina刚发布就更新了。然而更新以后发现连不上学校的网了,只能连edu。被这个问题困扰了很久,尝试了网上能找到的方法也还是没有解决,更新了两次系统这个问题也还是存在。今天终于找到了解决方案,所以想搬运过来,希望能够对碰到这个问题的人有些帮助。
https://poweruser.blog/macos-catalina-wifi-issue-captive-portal-broken-45610cc016b5
为了方便大家,顺手翻译一下。
升级到macOS Catalina可能会中断与带有强制门户的WiFi网络的连接。这是一种解决方法。
macOS Catalina的初始版本有漏洞的声誉。在我的Macbook上升级到macOS 10.15时* Catalina断开了连接到任何需要通过强制门户进行确认或登录的WiFi网络的功能(如今,从星巴克到机场,几乎所有公共热点都是这种情况)。
*(精确到最新PATCHLEVEL截至记者发稿:10.15.0
与从10月15日- 2019补充更新。10.15.1
还没有出来**)。
**(更新10月31日- 2019:该10.15.1
更新已经被释放,但-至少在我的机器上-在安装它并没有。解决这个问题我还需要使用下面的解决方法)。
问题
当连接到具有强制门户功能的WiFi网络(用户必须先登录或确认使用条款才能访问Internet的网页)时,我注意到以下行为:
- 实际的WiFi连接有效(WiFi状态显示为已连接,并且ifconfig和netstat -nr通过DHCP正确设置了WiFi接口上的IP和默认网关)
然而:
- 无法访问强制门户来解锁Internet:没有出现通常的macOS强制门户检测弹出窗口(浏览器中也没有强制门户)
- 所有DNS名称都是无法解析的(
nslookup
->server
表示DNS服务器设置为localhost而不是DHCP中的一个)。 - 本地子网外部的流量未路由。A
ping 8.8.8.8
会导致no route to host
错误消息(即使netstat -nr
显示正确设置的默认网关,也可以ping通)。
故障排除
有趣的是,每次尝试连接时,此错误消息都会出现在日志中(使用控制台应用程序):
Non-fatal error enumerating at <private>, continuing: Error Domain=NSCocoaErrorDomain Code=260 "The file “PlugIns” couldn’t be opened because there is no such file." UserInfo={NSURL=PlugIns/ -- file:///System/Library/CoreServices/Captive%20Network%20Assistant.app/Contents/, NSFilePath=/System/Library/CoreServices/Captive Network Assistant.app/Contents/PlugIns, NSUnderlyingError=0x7fbd655325e0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
实际上,PluginIns
in /System/Library/CoreServices/Captive Network Assistant.app/Contents
中的子文件夹不存在。我尝试创建文件夹(由于macOS系统分区是只读的,因此需要在恢复模式下完成)。这使错误消息消失了,但是并没有解决问题。显然,该文件夹中的所有内容也将丢失。
但是,我注意到可以Captive Network Assistants
通过上述路径手动打开应用程序(通过在Finder中双击应用程序包)。连接到门户网站锁定的WiFi网络后,它会执行预期的操作:它显示了门户网站侦测弹出窗口。登录到强制门户后,上述网络限制消失,一切正常。
解决方法的想法
我们可以安装LaunchDaemon来监视WiFi网络的更改,并在发生此类事件时启动Captive Network Assistants应用程序。
我们可以通过该文件掌握WiFi网络的任何更改/Library/Preferences/SystemConfiguration/com.apple.airport.preferences
。操作系统似乎会使用当前使用的无线电频道定期更新此文件。
LaunchDaemon可以将WatchPaths
声明作为事件触发器。可以监视文件和文件夹的更改。观看文件时,相应的文件可能永远不会删除-否则“观看”会自动结束。不幸的是,此文件是这种情况(它似乎没有被覆盖,但已删除并重新创建),这就是为什么我们必须监视父文件夹(可以的,即使它可能更贵)也是如此。
解决方案
安装
首先,我们创建一个文件,my.shim.catalina.captivenetworkassistant.plist
在其中定义新的LaunchDaemon:
(此文件可以放置在任何地方,但是一个好的位置是~/Library/LaunchDaemons/
-我们可能需要创建该文件夹)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>my.shim.catalina.captivenetworkassistant.plist</string>
<key>LowPriorityIO</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>open</string>
<string>/System/Library/CoreServices/Captive Network Assistant.app</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Library/Preferences/SystemConfiguration</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
然后,我们从以下文件安装并启动LaunchDaemon:
launchctl load my.shim.catalina.captivenetworkassistant.plist
launchctl start my.shim.catalina.captivenetworkassistant
(注意:LaunchDaemon是按用户安装的。以上内容应以交互式登录的用户身份执行-而不是sudo / as root )
测试中
我们可以通过连接到任何启用了强制门户的WiFi进行测试。强制门户弹出窗口应自动出现,类似于以前在macOS版本上的弹出窗口。
卸载
我非常确定,此错误将在以后的macOS更新中得到修复。在这种情况下,我们可以通过以下方式删除我们的LaunchDaemon:
launchctl stop my.shim.catalina.captivenetworkassistant
launchctl unload my.shim.catalina.captivenetworkassistant.plist