<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>ishwt::tracking &#187; SystemConfiguration.framework</title>
	<atom:link href="http://ishwt.net/blog/tag/systemconfiguration-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://ishwt.net</link>
	<description>人 間 万 事 塞 翁 が 馬</description>
	<lastBuildDate>Sat, 05 Nov 2011 15:36:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ishwt.net/blog/tag/systemconfiguration-framework/feed/" />
		<item>
		<title>SystemConfiguration.framework でネットワークの変化を知る</title>
		<link>http://ishwt.net/blog/2010/02/10/catch-network-state-change-with-systemconfiguration-framework/</link>
		<comments>http://ishwt.net/blog/2010/02/10/catch-network-state-change-with-systemconfiguration-framework/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 13:52:29 +0000</pubDate>
		<dc:creator>ishwt</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[SystemConfiguration.framework]]></category>

		<guid isPermaLink="false">http://ishwt.net/?p=2836</guid>
		<description><![CDATA[前回、SystemConfiguration.framework の DynamicStore からネットワークの状態を得る方法を書きましたが、今回はさらにその変化を検出して処理を行う方法です。すぐ次のエントリで書こうと [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/">前回</a>、SystemConfiguration.framework の DynamicStore からネットワークの状態を得る方法を書きましたが、今回はさらにその変化を検出して処理を行う方法です。すぐ次のエントリで書こうと思っていたのに遅くなってしまいました。</p>
<p><img src="http://ishwt.net/wp-content/uploads/2010/02/sc-catch-title.png" title="sc-catch-title" width="468" height="132" class="aligncenter size-full wp-image-2969" /></p>
<p><span id="more-2836"></span></p>
<p>ネットワーク環境の変化は、コンピュータの名称が変わったり、ネットワークの接続環境が変わったり、ということが考えられます。前者はシステム環境設定での変更によるものですし、後者はイーサネットケーブルが抜けたり、無線 LAN の ON / OFF や弱電界での切断、ノートタイプの場合のスリープ復帰などなど、結構あります。</p>
<p>ネットワークを利用するアプリケーションでは、動作中にネットワークの環境が変わったら、アプリケーションとしてそれに応じた振る舞いや動作の変化をさせるのが望ましく、今回の説明はそのためにネットワーク状況の変化を検出する方法です。</p>
<p>Cocoa (Objective-C) ではよく NSNotificationCenter にオブザーバとして登録して通知を受けます。C言語で実装するものの、それと同様の方式で取得します。</p>
<p>サンプルなソースの全体像はこんな感じ。エラー処理と終了時のお片付け処理は省略してあるので脳内補完してください。</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">DynamicStore 通知サンプル</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw4">static</span> <span class="kw4">void</span> _CallbackFunc<span class="br0">&#40;</span>SCDynamicStoreRef store, CFArrayRef changedKeys, <span class="kw4">void</span> <span class="sy0">*</span>info<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@interface</span> NetTest</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreRef &nbsp; scDynStore;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreContext &nbsp; scContext;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRunLoopSourceRef&nbsp; runLoopSource;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setupSC;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>updateSC<span class="sy0">:</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a><span class="sy0">*</span><span class="br0">&#41;</span>changedKeys;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@implementation</span> NetTest</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setupSC</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef keys<span class="br0">&#91;</span>2<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFArrayRef&nbsp; keyArray;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/memset.html"><span class="kw3">memset</span></a><span class="br0">&#40;</span><span class="sy0">&amp;</span>scContext, 0, <a href="http://www.opengroup.org/onlinepubs/009695399/functions/sizeof.html"><span class="kw3">sizeof</span></a><span class="br0">&#40;</span>scContext<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; scContext.info&nbsp; <span class="sy0">=</span> self;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; scDynStore&nbsp; <span class="sy0">=</span> SCDynamicStoreCreate<span class="br0">&#40;</span><span class="kw2">NULL</span>, <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span class="kw5">NSBundle</span></a> mainBundle<span class="br0">&#93;</span> bundleIdentifier<span class="br0">&#93;</span>, _CallbackFunc, <span class="sy0">&amp;</span>amp;scContext<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; runLoopSource &nbsp; <span class="sy0">=</span> SCDynamicStoreCreateRunLoopSource<span class="br0">&#40;</span><span class="kw2">NULL</span>, scDynStore, 0<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; keys<span class="br0">&#91;</span>0<span class="br0">&#93;</span> &nbsp; &nbsp; <span class="sy0">=</span> SCDynamicStoreKeyCreateHostNames<span class="br0">&#40;</span><span class="kw2">NULL</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; keys<span class="br0">&#91;</span>1<span class="br0">&#93;</span> &nbsp; &nbsp; <span class="sy0">=</span> SCDynamicStoreKeyCreateNetworkGlobalEntity<span class="br0">&#40;</span><span class="kw2">NULL</span>, kSCDynamicStoreDomainState, kSCEntNetIPv4<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; keyArray&nbsp; &nbsp; <span class="sy0">=</span> CFArrayCreate<span class="br0">&#40;</span><span class="kw2">NULL</span>, <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">void</span><span class="sy0">**</span><span class="br0">&#41;</span>keys, 2, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreSetNotificationKeys<span class="br0">&#40;</span>scDynStore, keyArray, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRunLoopAddSource<span class="br0">&#40;</span>CFRunLoopGetCurrent<span class="br0">&#40;</span><span class="br0">&#41;</span>, runLoopSource, kCFRunLoopDefaultMode<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>keyArray<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>keys<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>keys<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>updateSC<span class="sy0">:</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a><span class="sy0">*</span><span class="br0">&#41;</span>changedKeys</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">unsigned</span> i;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i <span class="sy0">=</span> <span class="nu0">0</span>; i &lt; <span class="br0">&#91;</span>changedKeys count<span class="br0">&#93;</span>; i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span> key <span class="sy0">=</span> <span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a><span class="sy0">*</span><span class="br0">&#41;</span><span class="br0">&#91;</span>changedKeys objectAtIndex<span class="sy0">:</span>i<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;SystemConfiguration key[%d] '%@' is changed!&quot;</span>, i, key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">// 各種処理</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">// （キーの値を取り出したり、画面の表示を更新したり）</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">@end</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> _CallbackFunc<span class="br0">&#40;</span>SCDynamicStoreRef&nbsp; &nbsp; store, CFArrayRef changedKeys, <span class="kw4">void</span> <span class="sy0">*</span>info<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NetTest <span class="sy0">*</span>self <span class="sy0">=</span> <span class="br0">&#40;</span>NetTest<span class="sy0">*</span><span class="br0">&#41;</span>info;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#91;</span>self updateSC<span class="sy0">:</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a><span class="sy0">*</span><span class="br0">&#41;</span>changedKeys<span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol></div></div></div>
<p>まず、前回と異なるのは DynamicStore を作る <code>SCDynamicStoreCreate()</code> 関数の第三引数に、 <code>NULL</code> ではなくコールバック関数 <code>_CallbackFunc</code> を設定しています。 <code>_CallbackFunc</code> は先頭のプロトタイプ宣言のとおり、DynamicStore と、変更があったキーの一覧、そしてコンテキストの情報が渡ってきます。最後のコンテキスト情報 (<code>info</code>) は、パラメタで渡している <code>context.info</code> が設定されることになっていて、DynamicStore はその内容を関知していません。コールバック関数で利用するために、<code>self</code> を設定しておきます。</p>
<p>続いて、実際に変更があったらコールバックを呼び出すための設定処理をしています。<br />
監視したいキーを CFArrayRef にして登録します。キーは前回みたとおり、<code>scutil</code> で確認した中から、必要なものを選んで監視するとよいと思います。RunLoopSource まわりの手続はおまじないと思っておけばいいかと。</p>
<p>これで、登録しておいたキー項目に変化があると、コールバック関数が呼ばれるようになります。コールバック関数は、<code>NetTest</code> クラスのメンバではない単なる C の関数ですので、コールバック関数の <code>info</code> に設定しておいたクラスのインスタンスをキャストしてそのメソッドを呼び出して処理させます。</p>
<p>実際の処理は、ループして変化したキーをチェック、キーの値を DynamicStore から取り出して、適切な処理や GUI への操作を行う、ということになります。</p>
<p>まとめると以下でしょうか。</p>
<ul>
<li>コールバック関数を登録する</li>
<li>監視したいキーのリストを用意して登録する</li>
<li>RunLoopSourceを追加する</li>
<li>コールバック関数から処理メソッドを呼び出す</li>
<li>処理メソッド内でキーを判定して応じた処理をする</li>
</ul>
<p>ちょっと駆け足でしたが、こんな感じです。</p>
]]></content:encoded>
			<wfw:commentRss>http://ishwt.net/blog/2010/02/10/catch-network-state-change-with-systemconfiguration-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ishwt.net/blog/2010/02/10/catch-network-state-change-with-systemconfiguration-framework/" />
	</item>
		<item>
		<title>SystemConfiguration.framework でネットワークの情報を得る</title>
		<link>http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/</link>
		<comments>http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 19:56:36 +0000</pubDate>
		<dc:creator>ishwt</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[SystemConfiguration.framework]]></category>

		<guid isPermaLink="false">http://ishwt.net/?p=2771</guid>
		<description><![CDATA[Mac アプリのプログラミングで、SystemConfiguration.framework の DynamicStore を利用すると、ネットワーク関連の現在状態や設定値を取得できます。ネットワーク以外にもいくつか取得 [...]]]></description>
			<content:encoded><![CDATA[<p>Mac アプリのプログラミングで、SystemConfiguration.framework の DynamicStore を利用すると、ネットワーク関連の現在状態や設定値を取得できます。ネットワーク以外にもいくつか取得できたりします。</p>
<p><img src="http://ishwt.net/wp-content/uploads/2010/01/SC_capture.png" title="SC_capture" width="468" height="160" class="aligncenter size-full wp-image-2775" /></p>
<p>SystemConfiguration.framework は C 言語の API が用意されており、Objective-C の API はありません。関数等の接頭詞は &#8220;SC&#8221; です。</p>
<p><span id="more-2771"></span></p>
<h3>キー。</h3>
<p>DynamicStore は名前からも分かるとおり現在のダイナミック（動的）な設定情報・状態値を保持していて、URI 形式のキーで値を取得することができます。<br />
<code>State:/Network/Global/DNS</code><br />
といった表記でキーが表されます。キーは多岐にわたりますし、特定の文法で記載されるので、簡単にキーを取得するためのユーティリティ関数が用意されています。</p>
<p><code>SCDynamicStoreKey.h</code></p>
<p><code> </code></p>
<p><code></p>
<ul>
<li>SCDynamicStoreKeyCreateConsoleUser()</li>
<li>SCDynamicStoreKeyCreateHostNames()</li>
<li>SCDynamicStoreKeyCreateLocation()</li>
<li>SCDynamicStoreKeyCreateNetworkGlobalEntity()</li>
<li>SCDynamicStoreKeyCreateNetworkInterface()</li>
<li>SCDynamicStoreKeyCreateNetworkInterfaceEntity()</li>
<li>SCDynamicStoreKeyCreateNetworkServiceEntity()</li>
<li>SCDynamicStoreKeyCreateProxies()</li>
</ul>
<p></code><br />
また、各関数にキーの可変部をパラメタとして渡す場合の定数が、SCSchemaDefinitions.h に多数記載されています。<br />
ただ、上記の関数リファレンスやヘッダを見ても、実際にどのようなキーがあり、上記のユーティリティ関数に与えるパラメタも、結果として得られるキーも、いまひとつ具体的に分かりません。<br />
そこで役に立つのが <code>scutil</code> というコマンド。</p>
<pre class="console">$ scutil
&gt;
&gt; list
  subKey [0] = Plugin:IPConfiguration
  subKey [1] = Plugin:InterfaceNamer
  subKey [2] = Setup:
  subKey [3] = Setup:/
  subKey [4] = Setup:/Network/BackToMyMac
  subKey [5] = Setup:/Network/Global/IPv4
  subKey [6] = Setup:/Network/HostNames
  subKey [7] = Setup:/Network/Interface/en1/AirPort
  subKey [8] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41
  subKey [9] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/IPv4
  subKey [10] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/IPv6
  subKey [11] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/Interface
  subKey [12] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/Modem
  subKey [13] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/PPP
  subKey [14] = Setup:/Network/Service/17252794-5272-4263-8436-93458EA29A41/Proxies
  subKey [15] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA
  subKey [16] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/IPv4
  subKey [17] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/IPv6
  subKey [18] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/Interface
  subKey [19] = Setup:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/Proxies
  subKey [20] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396
  subKey [21] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396/IPv4
  subKey [22] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396/IPv6
  subKey [23] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396/Interface
  subKey [24] = Setup:/Network/Service/9EAEE8A7-60C3-44EF-98F6-FA7E0D2E3396/Proxies
  subKey [25] = Setup:/System
  subKey [26] = State:/IOKit/LowBatteryWarning
  subKey [27] = State:/IOKit/Power/CPUPower
  subKey [28] = State:/IOKit/PowerAdapter
  subKey [29] = State:/IOKit/PowerManagement/Assertions
  subKey [30] = State:/IOKit/PowerManagement/CurrentSettings
  subKey [31] = State:/IOKit/PowerManagement/SystemLoad
  subKey [32] = State:/IOKit/PowerManagement/SystemLoad/Detailed
  subKey [33] = State:/IOKit/PowerSources/InternalBattery-0
  subKey [34] = State:/IOKit/SystemPowerCapabilities
  subKey [35] = State:/Network/BackToMyMac
  subKey [36] = State:/Network/Global/DNS
  subKey [37] = State:/Network/Global/IPv4
  subKey [38] = State:/Network/Global/Proxies
  subKey [39] = State:/Network/Interface
  subKey [40] = State:/Network/Interface/en0/Link
  subKey [41] = State:/Network/Interface/en1/AirPort
  subKey [42] = State:/Network/Interface/en1/IPv4
  subKey [43] = State:/Network/Interface/en1/IPv6
  subKey [44] = State:/Network/Interface/en1/Link
  subKey [45] = State:/Network/Interface/lo0/IPv4
  subKey [46] = State:/Network/Interface/lo0/IPv6
  subKey [47] = State:/Network/Interface/vmnet1/IPv4
  subKey [48] = State:/Network/Interface/vmnet8/IPv4
  subKey [49] = State:/Network/MulticastDNS
  subKey [50] = State:/Network/PrivateDNS
  subKey [51] = State:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/DHCP
  subKey [52] = State:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/DNS
  subKey [53] = State:/Network/Service/6C67FE3C-C7EC-4885-9250-307B8EBA5DEA/IPv4
  subKey [54] = State:/Users/ConsoleUser
  subKey [55] = com.apple.DirectoryService.NotifyTypeStandard:DirectoryNodeAdded
  subKey [56] = com.apple.network.identification
&gt;</pre>
<p><code>scutil</code> は起動するとプロンプトになりコマンドが入力できます。<code>help</code>で利用出来るコマンドが表示されますので見てみてください。そこそこいろいろ出来ます。<br />
今回は、<code>list</code>と言うコマンドで、利用出来るキーの一覧を表示しています。なお、キーは常に一定ではなく、ネットワークの状況によって増減します。</p>
<h3>値。</h3>
<p>DynamicStore から取得できる値は NSDictionary ( CFDictionary ) で、実際の個別の設定値はさらにその中に規定のプロパティ名で格納されています。これは <code>scutil</code> の <code>show</code> コマンドで確認することができます。</p>
<pre class="console">&gt; show State:/Network/Global/IPv4
&lt;dictionary&gt; {
  PrimaryInterface : en1
  PrimaryService : 6C67FE3C-C7EC-4885-9250-307B8EBA5DEA
  Router : 192.168.1.1
}
&gt; show State:/Network/Interface/en1/Link
&lt;dictionary&gt; {
  Active : TRUE
}
&gt; show State:/Network/Interface/en1/IPv4
&lt;dictionary&gt; {
  Addresses : &lt;array&gt; {
    0 : 192.168.1.102
  }
  BroadcastAddresses : &lt;array&gt; {
    0 : 192.168.1.255
  }
  SubnetMasks : &lt;array&gt; {
    0 : 255.255.255.0
  }
}
&gt;</pre>
<div id="_mcePaste">このように、PrimaryInterface（優先されるネットワーク）が &#8220;en1&#8243; （無線 LAN）で、無線 LAN の リンク状態、IP アドレス、ブロードキャストアドレス、サブネットマスクなどが分かります。</div>
<h3>コード例。</h3>
<p>さて、これをプログラム上ではどう取得するかですが、結構簡単です。</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">利用サンプル</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ishwt.net/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://ishwt.net/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><div class="objc" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="co1">#import &lt;Cocoa/Cocoa.h&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">#import &lt;SystemConfiguration/SCDynamicStoreKey.h&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">#import &lt;SystemConfiguration/SCSchemaDefinitions.h&gt;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>test</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreRef &nbsp; store;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SCDynamicStoreContext &nbsp; context;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef &nbsp; &nbsp; key;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFDictionaryRef &nbsp; &nbsp; val;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef &nbsp; &nbsp; host;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef &nbsp; &nbsp; primIF;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFArrayRef&nbsp; &nbsp; &nbsp; addrs;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFStringRef &nbsp; &nbsp; addr;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co2">// DynaimcStore生成</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/memset.html"><span class="kw3">memset</span></a><span class="br0">&#40;</span><span class="sy0">&amp;</span>context, 0, <a href="http://www.opengroup.org/onlinepubs/009695399/functions/sizeof.html"><span class="kw3">sizeof</span></a><span class="br0">&#40;</span>context<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; context.info&nbsp; &nbsp; <span class="sy0">=</span> self;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; store &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> SCDynamicStoreCreate<span class="br0">&#40;</span><span class="kw2">NULL</span>, <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span class="kw5">NSBundle</span></a> mainBundle<span class="br0">&#93;</span> bundleIdentifier<span class="br0">&#93;</span>, <span class="kw2">NULL</span>, <span class="sy0">&amp;</span>context<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co2">// コンピュータ名取得</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; key <span class="sy0">=</span> SCDynamicStoreKeyCreateHostNames<span class="br0">&#40;</span><span class="kw2">NULL</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; val <span class="sy0">=</span> <span class="br0">&#40;</span>CFDictionaryRef<span class="br0">&#41;</span>SCDynamicStoreCopyValue<span class="br0">&#40;</span>store, key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; host&nbsp; &nbsp; <span class="sy0">=</span> <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span>CFDictionaryGetValue<span class="br0">&#40;</span>val, kSCPropNetLocalHostName<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;HostName is %@.&quot;</span>, host<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>val<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co2">// PrimaryInteaface取得</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; key <span class="sy0">=</span> SCDynamicStoreKeyCreateNetworkGlobalEntity<span class="br0">&#40;</span><span class="kw2">NULL</span>, kSCDynamicStoreDomainState, kSCEntNetIPv4<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; val <span class="sy0">=</span> <span class="br0">&#40;</span>CFDictionaryRef<span class="br0">&#41;</span>SCDynamicStoreCopyValue<span class="br0">&#40;</span>store, key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; primIF&nbsp; <span class="sy0">=</span> <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span>CFDictionaryGetValue<span class="br0">&#40;</span>val, kSCDynamicStorePropNetPrimaryInterface<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;PrimaryInterface is %@.&quot;</span>, primaryIF<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRetain<span class="br0">&#40;</span>primIF<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>val<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co2">// IPアドレス取得</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; key <span class="sy0">=</span> SCDynamicStoreKeyCreateNetworkInterfaceEntity<span class="br0">&#40;</span><span class="kw2">NULL</span>, kSCDynamicStoreDomainState, primIF, kSCEntNetIPv4<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; val <span class="sy0">=</span> <span class="br0">&#40;</span>CFDictionaryRef<span class="br0">&#41;</span>SCDynamicStoreCopyValue<span class="br0">&#40;</span>store, key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; addrs &nbsp; <span class="sy0">=</span> <span class="br0">&#40;</span>CFArrayRef<span class="br0">&#41;</span>CFDictionaryGetValue<span class="br0">&#40;</span>val, kSCPropNetIPv4Addresses<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; addr&nbsp; &nbsp; <span class="sy0">=</span> <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span>CFArrayGetValueAtIndex<span class="br0">&#40;</span>addrs, 0<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;IP Address is %@&quot;</span>, addr<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>val<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>key<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CFRelease<span class="br0">&#40;</span>primIF<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol></div></div></div>
<p>上記サンプルはエラー処理をしていませんが、値を階層的に取得しているので、エラーチェックは処理の都度行う必要があります。</p>
<p><code>scutil</code> で欲しいキーを確認すれば、別のキーでも取得の方法は同じ要領です。ネットワークの設定や諸情報、ネットワーク以外にも電源（電池）の状態などもわかったり、結構面白いです。</p>
<p>実は、DynamicStore を使うと今回取得したような値の変化（ネットワーク状態の変化、システム環境設定での変更）を検出することもできますが、それは次回に。</p>
]]></content:encoded>
			<wfw:commentRss>http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ishwt.net/blog/2010/01/19/get-network-state-from-systemconfiguration-framwework/" />
	</item>
	</channel>
</rss>

