web-dev-qa-db-ja.com

CaptiveNetworkを使用して現在のWiFiホットスポット名を取得する方法

現在接続されているWi-Fiホットスポットの名前を取得する必要があります。 「BT OpenZone」

CaptiveNetwork 、具体的にはCNCopyCurrentNetworkInfoで実行できると言われています

これまでの私のコード:

#import <SystemConfiguration/CaptiveNetwork.h>
...

// Get the dictionary containing the captive network infomation
CFDictionaryRef captiveNtwrkDict = CNCopyCurrentNetworkInfo(kCNNetworkInfoKeySSID);

// Get the count of the key value pairs to test if it has worked
int count = CFDictionaryGetCount(captiveNtwrkDict);
NSLog(@"Count of dict:%d",count);

コードがWiFiホットスポットのデバイスで実行される場合、captiveNtwrkDictはnilです。

誰かがそれをうまく動かすことができましたか? CaptiveNetworksで多くのドキュメントやサンプルコードの例を見つけることができません...助けていただければ幸いです。

25
Robert

利用可能なネットワークを見つけて、CNCopyCurrentNetworkInfoに渡す必要があります。例えば:

CFArrayRef myArray = CNCopySupportedInterfaces();
CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));

...そして、返された辞書(myDict)のkCNNetworkInfoKeySSIDを使用して、SSIDを確認できます。メモリを適切に解放/管理することを忘れないでください。

27
lxt

IOS 12のアップデート、Swift 4.2

iOS 12

機能からWiFi情報にアクセスできるようにする必要があります。

重要iOS 12以降でこの機能を使用するには、XcodeでアプリのWiFi情報へのアクセス機能を有効にします。この機能を有効にすると、Xcodeは自動的にWiFiアクセス情報の資格を資格ファイルとアプリIDに追加します。 ドキュメントリンク

Swift4.2

public class SSID {
    class func fetchSSIDInfo() -> String {
        var currentSSID = ""
        if let interfaces = CNCopySupportedInterfaces() {
            for i in 0..<CFArrayGetCount(interfaces) {
                let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interfaces, i)
                let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
                let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString)
                if let interfaceData = unsafeInterfaceData as? [String: AnyObject] {
                    currentSSID = interfaceData["SSID"] as! String
                    let BSSID = interfaceData["BSSID"] as! String
                    let SSIDDATA = interfaceData["SSIDDATA"]
                    debugPrint("ssid=\(currentSSID), BSSID=\(BSSID), SSIDDATA=\(SSIDDATA)")
                }
            }
        }
        return currentSSID
    }
}

IOS 10向けのアップデート

CNCopySupportedInterfacesはiOS 10で非推奨ではなくなりました( APIリファレンス

SystemConfiguration/CaptiveNetwork.hをインポートしてSystemConfiguration.frameworkを追加する必要がありますターゲットのリンクライブラリに(ビルド段階で)。

これがSwiftのコードスニペットです ((RikiRiocma's Answer)

import Foundation
import SystemConfiguration.CaptiveNetwork

public class SSID {
    class func fetchSSIDInfo() ->  String {
        var currentSSID = ""
        if let interfaces:CFArray! = 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 )を使用することをお勧めします

Appleに[email protected]宛てにメールを送信し、資格をリクエストする必要があります。 ( ソース

サンプルコード( 私のコードではありません。PabloAの回答を参照してください ):

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ネットワーキングエンジニアと話しました。その反対は、非常に多くの人々がレーダーを提出し、Apple開発者フォーラム。

23

使いやすいコードスニペット(メソッド):

  • 追加SystemConfiguration.framework

  • インポート<SystemConfiguration/CaptiveNetwork.h>

  • 以下の方法を使用してください

    + (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);
    
            NSLog(@"info:%@",info);
    
            if (info[@"SSID"]) {
                wifiName = info[@"SSID"];
            }
        }
        return wifiName;
    }
    
8
Durai Amuthan.H

Xcode 10およびiOS 12では、「Access Wifi Information」機能を有効にする必要があることに注意してください。

ソース: https://openradar.appspot.com/43280182

2
Yuri Brigance