2017-01-11 9 views
8

ネットワークがイーサネットから無線LAN(または無線LANからイーサネット)に変更されたときを検出します。私はこの変化について私に通知するためにオブザーバーを持っていたい。イーサネット/無線LANネットワークの変更を検出しました

到達可能性が十分ではありません。どちらの場合も常にReachableViaWiFiが返されます。

PS - あり前に、このトピックに関するいくつかの質問があったが、それらのどれも良い答えを持っていないし、これらの質問は、歳以上になので、多分誰かがすでにそれ

+1

両方に接続している場合はどうなりますか? – Sulthan

+0

あなたがmacOSでプログラミングしている場合、CoreWLANフレームワークを検討することができます – frank

答えて

2

あなたを行う方法を見つけます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 
+0

ありがとう、私はあなたのアプリでwifi /イーサネットの検出を含めるので、ユーザーがアプリケーションを実行すると、アプリケーションはインターフェイスの変更に関する通知を取得し、 。 – Roee84

+0

スクリプトを実行してその出力を読み、それに応じて動作する新しいスレッドを開始してください。 –

5

とそれを実行可能にします。

は、実行可能性、あなたの有線接続が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) 
+0

ありがとうございますが、私は自分のアプリにwifi/ethernetの検出機能を追加したいので、ユーザーがアプリを実行すると、アプリはインターフェースの変更に関する通知を受け取り、何らかのアクションを行います。 – Roee84

+0

@ Roee84通知の例を含めるように答えを更新しました:) – Legendecas

関連する問題