네트워크의 SSID가 연결된 합법적 인 이유가있는 상용 앱이 있습니다. 타사 하드웨어 장치의 Adhoc 네트워크에 연결되어있는 경우 다른 방식으로 작동해야합니다. 인터넷에 연결되어 있습니다.
SSID를 얻는 것에 대해 내가 본 모든 것은 개인 라이브러리라는 것을 이해하는 Apple80211을 사용해야한다고 말합니다. 또한 개인 라이브러리를 사용하는 경우 Apple은 앱을 승인하지 않습니다.
나는 사과와 힘든 곳 사이에 갇혀 있습니까, 아니면 여기에 빠진 것이 있습니까?
답변
iOS 7 또는 8에서이 작업을 수행 할 수 있습니다 (아래에 표시된대로 iOS 12+에 대한 자격 필요).
@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;
}
출력 예 :
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가 지원되지 않습니다. 장치에서 테스트하십시오.
iOS 12
기능에서 wifi 정보에 액세스 할 수 있어야합니다.
중요 iOS 12 이상에서이 기능을 사용하려면 Xcode에서 앱의 WiFi 정보 액세스 기능을 활성화하십시오. 이 기능을 활성화하면 Xcode는 자동으로 Access WiFi Information 권한을 자격 파일 및 앱 ID에 추가합니다. 설명서 링크
스위프트 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;
}
답변
iOS 10 이상 업데이트
CNCopySupportedInterfaces는 iOS 10에서 더 이상 사용되지 않습니다. ( API Reference )
당신은 가져와야 에서 SystemConfiguration / CaptiveNetwork.h을 추가합니다 SystemConfiguration.framework을 (빌드 단계에서) 대상의 링크 라이브러리에.
다음은 신속한 코드 조각입니다 (RikiRiocma의 답변) .
import Foundation
import SystemConfiguration.CaptiveNetwork
public class SSID {
class func fetchSSIDInfo() -> String {
var currentSSID = ""
if let interfaces = CNCopySupportedInterfaces() {
for i in 0..<CFArrayGetCount(interfaces) {
let interfaceName: UnsafePointer<Void> = CFArrayGetValueAtIndex(interfaces, i)
let rec = unsafeBitCast(interfaceName, AnyObject.self)
let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)")
if unsafeInterfaceData != nil {
let interfaceData = unsafeInterfaceData! as Dictionary!
currentSSID = interfaceData["SSID"] as! String
}
}
}
return currentSSID
}
}
( 중요 : CNCopySupportedInterfaces는 시뮬레이터에서 nil을 리턴합니다.)
Objective-c의 경우 여기와 아래의 Esad의 답변을 참조하십시오
+ (NSString *)GetCurrentWifiHotSpotName {
NSString *wifiName = nil;
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *ifnam in ifs) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info[@"SSID"]) {
wifiName = info[@"SSID"];
}
}
return wifiName;
}
iOS 9 업데이트
iOS 9 현재 Captive Network는 더 이상 사용되지 않습니다 *. ( 소스 )
* iOS 10에서는 더 이상 사용되지 않습니다 (위 참조).
NEHotspotHelper ( source ) 를 사용하는 것이 좋습니다.
networkextension@apple.com으로 Apple에게 이메일을 보내고 자격을 요청해야합니다. ( 소스 )
샘플 코드 ( 내 코드 아님. Pablo A의 답변 참조 ) :
for(NEHotspotNetwork *hotspotNetwork in [NEHotspotHelper supportedNetworkInterfaces]) {
NSString *ssid = hotspotNetwork.SSID;
NSString *bssid = hotspotNetwork.BSSID;
BOOL secure = hotspotNetwork.secure;
BOOL autoJoined = hotspotNetwork.autoJoined;
double signalStrength = hotspotNetwork.signalStrength;
}
참고 사항 : 예, iOS 9에서는 CNCopySupportedInterfaces를 더 이상 사용하지 않고 iOS 10에서는 위치를 반대로했습니다. Apple 네트워킹 엔지니어와 대화를 나 and을 때 많은 사람들이 레이더를 제출하고 Apple Developer 포럼에서 문제에 대해 이야기했습니다.
답변
이것은 시뮬레이터가 아닌 장치에서 작동합니다. 시스템 구성 프레임 워크를 추가하십시오.
#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 사이트에서 이것을 발견했습니다. “중요 iOS 12 이상에서이 기능을 사용하려면 Xcode에서 앱의 WiFi 정보 액세스 기능을 활성화하십시오.이 기능을 활성화하면 Xcode가 자동으로 활성화됩니다 권한 파일 및 앱 ID에 Access WiFi Information 권한을 추가합니다. ”
https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
답변
CaptiveNetwork의 CNCopyCurrentNetworkInfo ( http://developer.apple.com/library/ios/#documentation/SystemConfiguration/Reference/CaptiveNetworkRef/Reference/reference.html)를 참조하십시오 .