web-dev-qa-db-ja.com

CaptiveNetworkが廃止され、Wifi名の呼び出しが既にブロックされた後にiOS9でWifi SSIDを取得する方法

今日まで、CaptiveNetwork Interfaceを使用して、現在接続されているWifiの名前を表示しました。 iOS 9プレリリースのリファレンスでは、CaptiveNetworkのメソッドは現在実用化されていませんが、最初はまだ機能していると述べています。

最新バージョンではAppleはすでにこの呼び出しをブロックしているようです(プライバシーの問題による可能性がありますか?)。

現在のWifiの名前を取得する他の方法はありますか?

これは私が今日までSSIDを取得した方法ですが、あなたは今だけnilを取得します:

#import <SystemConfiguration/CaptiveNetwork.h>

NSString *wifiName = nil;  
NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces(); 

for (NSString *name in interFaceNames) { 
    NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name); 

    if (info[@"SSID"]) { 
        wifiName = info[@"SSID"]; 
    } 
} 
35
Thyraz

IOS 9のGMでは、これは再び有効になっているようです。実際、オンラインドキュメントでは非推奨としてリストされていませんが、CaptiveNetworkヘッダーファイルには次のものがあります。

CNCopySupportedInterfaces (void) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_8, __MAC_NA, __IPHONE_4_1, __IPHONE_9_0, CN_DEPRECATION_NOTICE);

だから、iOS 9 GMで動作していますが、どれくらいの長さかはわかりません:)

10
lewiguez

アプリをホットスポットヘルパーとして登録します。

#import <NetworkExtension/NetworkExtension.h>  

NSArray * networkInterfaces = [NEHotspotHelper supportedNetworkInterfaces];  
NSLog(@"Networks %@",networkInterfaces);  

更新(2015年9月11日)

代わりに、最新バージョンのiOS 9で次のCaptive Network APIが再度有効になりました。

  • CNCopySupportedInterfaces
  • CNCopyCurrentNetworkInfo

更新(2015年9月16日)

それでもNetworkExtensionとAppleが資格を追加する許可を与えた場合)を使用する場合は、これを実行してwifi情報を取得できます。

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;
}

NetworkExtensionは、安全、自動結合、または信号強度などの追加情報を提供します。また、ユーザーがWi-Fiをスキャンするときに、バックグラウンドモードでWi-Fiに資格情報を設定することもできます。

31
Pablo A.

Abdullahselekによる答えは、Swift 4.1および4.2。

小さな注意点は、iOS 12では、アプリプロジェクトの機能セクションに移動し、WiFi情報へのアクセス機能を有効にする必要があることです。これにより、プロジェクトに資格エントリが追加され、CNCopyCurrentNetworkInfo関数呼び出しが適切に機能するようになります。

これを行わない場合、その関数は単にnilを返します。不足している資格に関するエラーまたは実行時の警告は表示されません。

詳細については、以下のAppleのドキュメントへのリンクを参照してください。

https://developer.Apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo

9
FerrousGuy

2017年4月27日に確認してください。CaptiveNetworkは引き続きSwift 3.1XCode 8.3

Swift> 3.の場合

func printCurrentWifiInfo() {
  if let interface = CNCopySupportedInterfaces() {
    for i in 0..<CFArrayGetCount(interface) {
      let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interface, i)
      let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
      if let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString), let interfaceData = unsafeInterfaceData as? [String : AnyObject] {
        // connected wifi
        print("BSSID: \(interfaceData["BSSID"]), SSID: \(interfaceData["SSID"]), SSIDDATA: \(interfaceData["SSIDDATA"])")
      } else {
        // not connected wifi
      }
    }
  }
}

Objective-Cの場合

NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();

for (NSString *name in interFaceNames) {
  NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);

  NSLog(@"wifi info: bssid: %@, ssid:%@, ssidData: %@", info[@"BSSID"], info[@"SSID"], info[@"SSIDDATA"]);
 }
8
nuynait

前述のとおり、CaptiveNetworkはXcode 8.3以降で正常に動作します。 SwiftSwift 4、およびObjective-Cの両方のコードスニペットを示します。

Swift 3および4

import SystemConfiguration.CaptiveNetwork

internal class SSID {

    class func fetchSSIDInfo() -> [String: Any] {
        var interface = [String: Any]()
        if let interfaces = CNCopySupportedInterfaces() {
            for i in 0..<CFArrayGetCount(interfaces){
                let interfaceName = CFArrayGetValueAtIndex(interfaces, i)
                let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
                guard let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString) else {
                    return interface
                }
                guard let interfaceData = unsafeInterfaceData as? [String: Any] else {
                    return interface
                }
                interface = interfaceData
            }
        }
        return interface
    }

}

Objective-C

#import <SystemConfiguration/CaptiveNetwork.h>

+ (NSDictionary *)fetchSSIDInfo
{
    NSArray *interFaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
    for (NSString *name in interFaceNames)
    {
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);
        return info;
    }
    return nil;
}
4
abdullahselek

CaptiveNetworkはまだ機能しています。多くのリクエストにより、AppleはAPIを復活させた可能性があります。

CaptiveNetworkを使用して、WiFiネットワークのSSIDを取得できます。 iOS 10でも動作します。

#import <SystemConfiguration/CaptiveNetwork.h>

NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)name);

出力は次のとおりです。

Printing description of info:
{
    BSSID = "5*:**:**:**:**:**";
    SSID = Cisco12814;
    SSIDDATA = <43697363 6f313238 3134>;
}
1
Ranjith

CaptiveNetworkはまだ機能しています。ただし、これを追加する必要があります。

entitlements.plist内のcom.Apple.developer.networking.wifi-info = true。

さらに、developer.Apple.comポータルのアプリID部分でWiFi情報へのアクセスを有効にする必要があります。

環境をクリーンにするために、アプリIDで[WiFi情報にアクセス]オプションを有効にした後、新しいプロビジョニングプロファイルを生成してください。

0
Tô Minh Tiến