[ios] iPhone은 개인 라이브러리없이 SSID를 얻습니다

네트워크의 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


답변