iPhone でWifiの情報を取得するにはプライベートAPIを使う必要があります.2.2.1ver.まではApple80211.framework が利用できましたが、3.0ver.からは「MobileWiFi.framework 」に変わっています.
実際に MobileWiFi.framework を指定して動作させてもエラーが起こるようになっています.動作が確認できたのは「WiFiManager.bundle 」を利用するものです.以下にWiFiManagerを呼び出す方法を記述します.

○(動作確認) libHandle = dlopen("/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager", RTLD_LAZY);

×(動作不可) libHandle = dlopen("/System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi", RTLD_LAZY);

他の追加物:
*.h
dlfcn.hをインポート
@interface内
NSMutableDictionary *networks; //Key: MAC Address (BSSID)

void *libHandle;
void *airportHandle;
int (*apple80211Open)(void *);
int (*apple80211Bind)(void *, NSString *);
int (*apple80211Close)(void *);
int (*associate)(void *, NSDictionary*, NSString*);
int (*apple80211Scan)(void *, NSArray **, void *);
*.m
 @implementation内
networks = [[NSMutableDictionary alloc] init];

libHandle = dlopen("/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager", RTLD_LAZY);

char *error;
if (libHandle == NULL && (error = dlerror()) != NULL) {
NSLog(@"APSearcher: Error %c",error);
exit(1);
}
apple80211Open = dlsym(libHandle, "Apple80211Open");
apple80211Bind = dlsym(libHandle, "Apple80211BindToInterface");
apple80211Close = dlsym(libHandle, "Apple80211Close");
apple80211Scan = dlsym(libHandle, "Apple80211Scan");

apple80211Open(&airportHandle);
apple80211Bind(airportHandle, @"en0");

これで、プロパティのnetworksにNSMutableDictionary型で入っているハズです.
中身は
"00:00:00:00:00:00" = {
AGE = 0;
"AP_MODE" = 2;
"BEACON_INT" = 10;
BSSID = "00:00:00:00:00:00";
CAPABILITIES = 1041;
CHANNEL = 7;
"CHANNEL_FLAGS" = 8;
NOISE = 0;
RATES = (
1,2,5,11,6,12,24,36,9,18,48,54
);
RSSI = -75;
SSID = <000c000d>;
"SSID_STR" = "NETWORK_NAME";
WEP = 1;
};
みたいな感じで入ってます.

注意:Privateframeworkは公式に利用していいAPIではないので、AppStoreで公開出来るかは不明です.(おそらく出来るでしょうが。)

2 Comments:

  1. Unknown さんのコメント...

    iPhone3.1.2実機で試してみましたが、networksに値が返ってきませんでした・・・

    コンソールには以下のメッセージが出力されてます。

    warning: Unable to read symbols for "/Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.1.2 (7D11)/Symbols/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager" (file not found).

    よくわからないのが「file not found」とコンソールに出力されるのにlibHandleには値が返り、apple80211Openやapple80211Bindでもエラーになりません(MobileWiFi.frameworkを使用するとハンドルが取得できないためapple80211Openで“EXC_BAD_ACCESS”のエラーログが出力されました)。  

  2. Unknown さんのコメント...

    >崇司 さん
    警告文は確かに出てきますが、本文に記述してあるNSDictionary型の返り値を得るには問題ないと思います.推測ですが,バンドルパッケージを探しているが実際に利用するバンドルファイルが指定され,読み込まれているのでApple80211関連を使うには問題ない,というわけではないでしょうか.

    MobileWiFi.frameworkについては記載に不備があり,わかりづらくなっていたと思われたので,修正しました.ご迷惑をおかけして申し訳ありません.