ネットワークがイーサネットから無線LAN(または無線LANからイーサネット)に変更されたときを検出します。私はこの変化について私に通知するためにオブザーバーを持っていたい。イーサネット/無線LANネットワークの変更を検出しました
到達可能性が十分ではありません。どちらの場合も常にReachableViaWiFiが返されます。
PS - あり前に、このトピックに関するいくつかの質問があったが、それらのどれも良い答えを持っていないし、これらの質問は、歳以上になので、多分誰かがすでにそれ
ネットワークがイーサネットから無線LAN(または無線LANからイーサネット)に変更されたときを検出します。私はこの変化について私に通知するためにオブザーバーを持っていたい。イーサネット/無線LANネットワークの変更を検出しました
到達可能性が十分ではありません。どちらの場合も常にReachableViaWiFiが返されます。
PS - あり前に、このトピックに関するいくつかの質問があったが、それらのどれも良い答えを持っていないし、これらの質問は、歳以上になので、多分誰かがすでにそれ
あなたを行う方法を見つけますbash
というスクリプトをlaunchd
の下で実行して、関心のあるインターフェイスを監視し、変更されたときに何かを起動することができます。 、あなたがSystemConfiguration
モジュールを介して、システムのネットワーク設定にアクセスすることができますnetmon
として
./netmon en0
保存このスクリプトをして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
ありがとう、私はあなたのアプリでwifi /イーサネットの検出を含めるので、ユーザーがアプリケーションを実行すると、アプリケーションはインターフェイスの変更に関する通知を取得し、 。 – Roee84
スクリプトを実行してその出力を読み、それに応じて動作する新しいスレッドを開始してください。 –
とそれを実行可能にします。
は、実行可能性、あなたの有線接続がen0
であると言いますこれは、現在デフォルトの場所/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
をまたはコールバックを持つダイナミックストアを作成し、設定した通知キーが毎回主要ネットワークサービスとして通知を受信するには、通知が火に起こっている変化し
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)
ありがとうございますが、私は自分のアプリにwifi/ethernetの検出機能を追加したいので、ユーザーがアプリを実行すると、アプリはインターフェースの変更に関する通知を受け取り、何らかのアクションを行います。 – Roee84
@ Roee84通知の例を含めるように答えを更新しました:) – Legendecas
両方に接続している場合はどうなりますか? – Sulthan
あなたがmacOSでプログラミングしている場合、CoreWLANフレームワークを検討することができます – frank