利用可能な WiFi を iPhone アプリで表示する方法を探しています。これまでの私の研究では、次の結果が得られました。
- そのような機能を実装したアプリは AppStore から削除されました (つまり、AppStore 経由でアプリを展開することはできません)。
- Appleはスキャンに必要な機能をプライベートフレームワークに隠しており、「使い方」に関する説明/コメント/例を見つけることができません
- http://code.google.com/p/iphone-wirelessが最も有望なようです。とにかく、配信されたソースをコードに含めてデバイスで実行する方法がわかりません
htt ://code.google.com/p/iphone-wireless/issues/detail?id=26 で言及されている適応でさえ、望ましい結果が得られませんでした。最も進歩したのは、
dlopen エラー: dlopen(/System/Library/SystemConfiguration/Aeropuerto.bundle/Aeropuerto, 1): イメージが見つかりませんでした: __Apple80211Associate
デバイス (iPhone 3GS; iOS 3.1.3) でアプリを起動した後のメッセージ。
エラーを引き起こす使用済みソース コードは次のとおりです。
NSMutableDictionary *networks;
bool scanning;
void *libHandle;
void *airportHandle;
int (*open)(void *);
int (*bind)(void *, NSString *);
int (*close)(void *);
int (*scan)(void *, NSArray **, void *);
networks = [[NSMutableDictionary alloc] init];
// libHandle = dlopen("/System/Library/Frameworks/Preferences.framework/Preferences", RTLD_LAZY);
// libHandle = dlopen("/System/Library/PrivateFrameworks/Apple80211.framework/Preferences", RTLD_LAZY);
libHandle = dlopen("/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager", RTLD_LAZY);
open = dlsym(libHandle, "Apple80211Open");
bind = dlsym(libHandle, "Apple80211BindToInterface");
close = dlsym(libHandle, "Apple80211Close");
scan = dlsym(libHandle, "Apple80211Scan");
open(&airportHandle);
bind(airportHandle, @"en0");
NSLog(@"Scanning...");
scanning = true;
NSArray *scan_networks;
NSDictionary *parameters = [[NSDictionary alloc] init];
scan(airportHandle, &scan_networks, parameters);
bool changed;
for (int i = 0; i < [scan_networks count]; i++) {
if([networks objectForKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]] != nil
&& ![[networks objectForKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]] isEqualToDictionary:[scan_networks objectAtIndex: i]])
changed = true;
[networks setObject:[scan_networks objectAtIndex: i] forKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]];
}
if(changed) {
NSLog(@"NetworksUpdated");
}
scanning = false;
NSLog(@"Scan Finished...");
NSLog(@"Found %i networks: %@", [networks count], networks);
他のコメント行のいずれかを試しても機能しません: program received EXC_BAD_ACCESS and several
警告: check_safe_call: 現在のフレームを復元できませんでした
警告: 以前に選択したフレームを復元できません。
私が探しているのは、プロジェクトに iphone-wireless を含める方法と、指定されたコードを変更する方法のヒントですか? 別の方法は、環境内の WiFi をスキャンする方法に関するヒントです。
誰かが助けてくれたらいいのに。