web-dev-qa-db-ja.com

iPhoneはプライベートライブラリなしでSSIDを取得します

接続されているネットワークのSSIDを確認する完全に正当な理由がある商用アプリがあります:サードパーティのハードウェアデバイスのアドホックネットワークに接続されている場合は、それが異なる場合に機能する必要がありますインターネットに接続されています。

SSIDの取得について確認したことはすべて、Apple80211を使用する必要があることを示しています。Apple80211はプライベートライブラリであることを理解しています。また、プライベートライブラリを使用すると、Appleはアプリを承認しません。

Appleと難しい場所に挟まれていますか、それともここに足りないものがありますか?

149
Steve Reed Sr

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

iOS 12

機能からの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

}
182

@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;
}
60
esad

これは(シミュレータではなく)デバイス上で動作します。システム構成フレームワークを必ず追加してください。

#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;
}
28
Chris

このコードは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>;

}

10
Jameel

IOS 12を実行している場合は、追加の手順を実行する必要があります。私はこのコードを機能させるのに苦労しており、最終的にAppleのサイトでこれを見つけました。アクセスWiFi情報の資格を資格ファイルとアプリIDに追加します。」 https://developer.Apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo

9
Muvimotv
7
onnoweb

これは、短くて甘い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を返します。したがって、オプションです。

5
n.Drake