これが私がiOS5-7で使用するものです
void* library = dlopen("/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration", RTLD_LAZY);
int (*apple80211Open)(void*) = (int(*)(void*))dlsym(library, "Apple80211Open");
int (*apple80211Bind)(void*, NSString*) = (int(*)(void*, NSString*))dlsym(library, "Apple80211BindToInterface");
int (*apple80211Close)(void*) = (int(*)(void*))dlsym(library, "Apple80211Close");
int (*apple80211Scan)(void*, NSArray**, void*) = (int(*)(void*, NSArray**, void*))dlsym(library, "Apple80211Scan");
void *airport = NULL;
apple80211Open(&airport);
apple80211Bind(airport, @"en0");
NSArray* networks = nil;
apple80211Scan(airport, &networks, [NSDictionary dictionary]);
//"networks" is an array of NSDictionary objects for all the visible Wi-Fi networks
apple80211Close(airport);
dlclose(library);
IPConfiguration
ファットバイナリではありません。デバイスに一致するアーキテクチャが 1 つだけ含まれています。したがって、arm64 デバイスのサポートを計画している場合は、コードを arm64 用にもコンパイルする必要があります。32 ビット アプリケーションは 64 ビットの dylib をロードできません。最新のすべてのデバイスには、armv7 と arm64 で十分です。
アップデート
残念ながら、このコードはジェイルブレイクされたデバイスでも通常の iOS アプリでは機能しません。ジェイルブレイクはサンドボックスをオフにしないため、コードが機能しません。このコードを機能させるに/var/mobile/Applications
は、サンドボックスの制限が適用されていないディレクトリの外にアプリケーションを配置する必要があります。/Applications
ディレクトリ内のデーモン、微調整、または GUI アプリケーションである可能性があります。そのディレクトリ内のアプリケーションには、既定では制限がなく、任意のプライベート API にアクセスできます。