我想检测网络何时从以太网变为wifi(或从wifi变为以太网).我希望有一位观察员通知我这一变化.
可达性不够好 - 对于这两种情况,它总是返回ReachableViaWiFi.
PS - 之前有一些关于这个话题的问题,但是没有一个问题有好的答案,而且由于这些问题已经超过一年了,也许有人已经知道如何去做
leg*_*cas 10
您可以通过SystemConfiguration模块访问系统网络首选项,这有助于您触摸当前驻留在默认位置的系统首选项存储/Library/Preferences/SystemConfiguration/preferences.plist.
从此,您可以收到通知SCDynamicStore通过SCDynamicStoreNotifyValue(_:_:)或检索值SCDynamicStoreCopyValue(_:_:).
直接查找当前主网络服务的示例:
var store = SCDynamicStoreCreate(nil, "Example" as CFString, nil, nil)
var global = SCDynamicStoreCopyValue(store, "State:/Network/Global/IPv4" as CFString)!
var pref = SCPreferencesCreate(nil, "Example" as CFString, nil)
var service = SCNetworkServiceCopy(pref!, global["PrimaryService"] as! CFString)
var interface = SCNetworkServiceGetInterface(service!)
SCNetworkInterfaceGetInterfaceType(interface!) /// Optional("IEEE80211") -> Wi-Fi
Run Code Online (Sandbox Code Playgroud)
或者使用回调创建动态存储并设置通知密钥以在每次主网络服务更改通知时触发通知:
var callback: SCDynamicStoreCallBack = { (store, _, _) in
/* Do anything you want */
}
var store = SCDynamicStoreCreate(nil, "Example" as CFString, callback, nil)
SCDynamicStoreSetNotificationKeys(store!, ["State:/Network/Global/IPv4"] as CFArray, nil)
Run Code Online (Sandbox Code Playgroud)
bash您可以在下面运行一个小脚launchd本来监视您感兴趣的界面并在它们发生变化时启动某些内容。
假设你的有线连接是en0,你可以运行:
./netmon en0
Run Code Online (Sandbox Code Playgroud)
将此脚本另存为netmon并使其可执行chmod +x netmon
#!/bin/bash
interface=$1
# Get current status of interface whose name is passed, e.g. en0
status(){
ifconfig $1 | awk '/status:/{print $2}'
}
# Monitor interface until killed, echoing changes in status
previous=$(status $interface)
while :; do
current=$(status $interface)
if [ $current != $previous ]; then
echo $interface now $current
previous=$current
fi
sleep 5
done
Run Code Online (Sandbox Code Playgroud)