接続されているネットワークのSSIDを確認する完全に正当な理由がある商用アプリがあります:サードパーティのハードウェアデバイスのアドホックネットワークに接続されている場合は、それが異なる場合に機能する必要がありますインターネットに接続されています。
SSIDの取得について確認したことはすべて、Apple80211を使用する必要があることを示しています。Apple80211はプライベートライブラリであることを理解しています。また、プライベートライブラリを使用すると、Appleはアプリを承認しません。
Appleと難しい場所に挟まれていますか、それともここに足りないものがありますか?
IOS 7またはiOS 8では、これを行うことができます。これにより、ARCとモジュールが利用され、必要なフレームワークに自動的にリンクされます。
@import SystemConfiguration.CaptiveNetwork;
/** Returns first non-empty SSID network info dictionary.
* @see CNCopyCurrentNetworkInfo */
- (NSDictionary *)fetchSSIDInfo
{
NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces());
NSLog(@"%s: Supported interfaces: %@", __func__, interfaceNames);
NSDictionary *SSIDInfo;
for (NSString *interfaceName in interfaceNames) {
SSIDInfo = CFBridgingRelease(
CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName));
NSLog(@"%s: %@ => %@", __func__, interfaceName, SSIDInfo);
BOOL isNotEmpty = (SSIDInfo.count > 0);
if (isNotEmpty) {
break;
}
}
return SSIDInfo;
}
(これはiOS 4.1以降用に記述されたコードサンプルの最新版です。唯一の変更点は、より明確な変数名を導入し、ARCおよびモジュールを採用することでした。)
出力例:
2011-03-04 15:32:00.669 ShowSSID[4857:307] -[ShowSSIDAppDelegate fetchSSIDInfo]: Supported interfaces: (
en0
)
2011-03-04 15:32:00.693 ShowSSID[4857:307] -[ShowSSIDAppDelegate fetchSSIDInfo]: en0 => {
BSSID = "ca:fe:ca:fe:ca:fe";
SSID = XXXX;
SSIDDATA = <01234567 01234567 01234567>;
}
シミュレータではifがサポートされていないことに注意してください。デバイスでテストします。
4.1より前のバージョンでは、システム構成ディクショナリに運があったかもしれません。たとえば、私のMacでscutil
を使用する場合:
$ scutil
> show State:/Network/Interface/en1/AirPort
<dictionary> {
Power Status : 1
SecureIBSSEnabled : FALSE
BSSID : <data> 0xcafecafecafe
SSID_STR : XXXX
SSID : <data> 0x012345670123456701234567
Busy : FALSE
CHANNEL : <dictionary> {
CHANNEL : 1
CHANNEL_FLAGS : 10
}
}
> exit
機能からのWiFi情報へのアクセスを有効にする必要があります。
重要この機能をiOS 12以降で使用するには、XcodeでアプリのWiFi情報へのアクセス機能を有効にします。この機能を有効にすると、XcodeはAccess WiFi情報の資格を資格ファイルとApp IDに自動的に追加します。 ドキュメントリンク
Swift 4.2
func getConnectedWifiInfo() -> [AnyHashable: Any]? {
if let ifs = CFBridgingRetain( CNCopySupportedInterfaces()) as? [String],
let ifName = ifs.first as CFString?,
let info = CFBridgingRetain( CNCopyCurrentNetworkInfo((ifName))) as? [AnyHashable: Any] {
return info
}
return nil
}
@elsurudoのコードに基づいて、クリーンアップされたARCバージョンを以下に示します。
- (id)fetchSSIDInfo {
NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfaces();
NSLog(@"Supported interfaces: %@", ifs);
NSDictionary *info;
for (NSString *ifnam in ifs) {
info = (__bridge_transfer NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
NSLog(@"%@ => %@", ifnam, info);
if (info && [info count]) { break; }
}
return info;
}
これは(シミュレータではなく)デバイス上で動作します。システム構成フレームワークを必ず追加してください。
#import <SystemConfiguration/CaptiveNetwork.h>
+ (NSString *)currentWifiSSID {
// Does not work on the simulator.
NSString *ssid = nil;
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *ifnam in ifs) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info[@"SSID"]) {
ssid = info[@"SSID"];
}
}
return ssid;
}
このコードはSSIDを取得するためにうまく機能します。
#import <SystemConfiguration/CaptiveNetwork.h>
@implementation IODAppDelegate
@synthesize window = _window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CFArrayRef myArray = CNCopySupportedInterfaces();
CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
NSLog(@"Connected at:%@",myDict);
NSDictionary *myDictionary = (__bridge_transfer NSDictionary*)myDict;
NSString * BSSID = [myDictionary objectForKey:@"BSSID"];
NSLog(@"bssid is %@",BSSID);
// Override point for customization after application launch.
return YES;
}
そして、これが結果です:
Connected at:{
BSSID = 0;
SSID = "Eqra'aOrange";
SSIDDATA = <45717261 27614f72 616e6765>;
}
IOS 12を実行している場合は、追加の手順を実行する必要があります。私はこのコードを機能させるのに苦労しており、最終的にAppleのサイトでこれを見つけました。アクセスWiFi情報の資格を資格ファイルとアプリIDに追加します。」 https://developer.Apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
CaptiveNetworkのCNCopyCurrentNetworkInfoを参照してください: http://developer.Apple.com/library/ios/#documentation/SystemConfiguration/Reference/CaptiveNetworkRef/Reference/reference.html 。
これは、短くて甘いSwiftバージョンです。
フレームワークをリンクしてインポートすることを忘れないでください:
import UIKit
import SystemConfiguration.CaptiveNetwork
メソッドを定義します。
func fetchSSIDInfo() -> CFDictionary? {
if let
ifs = CNCopySupportedInterfaces().takeUnretainedValue() as? [String],
ifName = ifs.first,
info = CNCopyCurrentNetworkInfo((ifName as CFStringRef))
{
return info.takeUnretainedValue()
}
return nil
}
必要なときにメソッドを呼び出します。
if let
ssidInfo = fetchSSIDInfo() as? [String:AnyObject],
ssID = ssidInfo["SSID"] as? String
{
println("SSID: \(ssID)")
} else {
println("SSID not found")
}
他の場所で述べたように、これはiDeviceでのみ機能します。 WiFi以外の場合、メソッドはnilを返します。したがって、オプションです。