1. ホーム
  2. ios

[解決済み] iPhoneでプライベートライブラリのないSSIDを取得する

2022-04-27 14:45:57

質問

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

SSIDの取得について調べたところ、Apple80211を使用しなければならないようです。これはプライベート・ライブラリであると理解しています。 また、プライベートライブラリを使用した場合、Appleはアプリを承認しないと書いてありました。

それとも、私が見逃しているものがあるのでしょうか?

解決方法は?

iOS 7または8の時点で可能です(以下のようにEntitlement for 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

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

<ブロッククオート

重要 iOS 12以降でこの機能を使用するには、XcodeでアプリのAccess WiFi Informationケイパビリティを有効にしてください。この機能を有効にすると、Xcode は自動的に Access WiFi Information のエンタイトルメントをエンタイトルメントファイルと 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

}