web-dev-qa-db-ja.com

iOS 11.0-近くのSSID(WiFi)を定期的にスキャンします

Wi-Fiネットワークの近くのSSIDを定期的に(接続せずに)スキャンし、SSIDフィルター(1つまたは複数)を実装したいと思います。一致するものが見つかると、バックエンドAPI呼び出しが開始されます。

iOS10のHotspotHelperフレームワークについて簡単な調査を行いましたが、これらのAPIは私が特定した用途向けに設計されていないことがわかりました。

iOS 11では、アプリがWi-Fi構成をプログラムで管理できるようになりました。 Appleホットスポットの構成方法とプロパティのネットワーク拡張機能を追加しました。変更を確認するには ここをクリック してください。

ここでの私の質問は、新しくiOS 11ホットスポット構成クラスを介して目標を達成できるかどうかです。または、これは既知のネットワークまたは現在接続されているネットワークのSSIDを提供しますか?

これに関するどんな助けも大歓迎です。

11
Shamsudheen TK

残念ながら、iOSではこれを実現できません。

NEHotspotConfiguration について知ったとき、このプロセスを自動化できることを望んでいたので、最初は興奮していました。ただし、現在利用可能なSSIDのリストを取得する方法がないようです。そのため、 NEHotspotConfiguration のユースケースではあまり役に立ちません。

10
Shamsudheen TK

ありえない。

NEHotspotHelper権限があり、デモアプリを試してみました。 Apple許可を与える場合でも、アプリでWi-Fiリストを毎回取得するには、[設定]-[WiFi]ページを開いて近くのWiFiリストを取得する必要があります。このAPIは[〜#〜] not [〜#〜]定期的に言うまでもなく、バックグラウンドで近くのWiFiリストをスキャンする機能を提供します。

開発者にとっては残念ですが、APIの使用を厳しく制限することでプライバシーと安全性を保護することは、iOSユーザーにとっては良いことだと思います。

1
陈健 Mark

私の理解によると、次のコードを使用してこれを達成できます

      let targetSsid = getCurrentSSID()
    let targetAnnotation: String = targetSsid!

    //let options: [String: NSObject] = [kNEHotspotHelperOptionDisplayName : targetAnnotation as NSObject]
    //let queue: DispatchQueue = DispatchQueue(label: "com.myapp.appname", attributes: DispatchQueue.Attributes.concurrent)

    NSLog("Started wifi list scanning.")


    let options: [String: NSObject] = [
        kNEHotspotHelperOptionDisplayName: targetAnnotation as NSString
    ]

    let queue = DispatchQueue(label: "com.example.test")

    let isAvailable = NEHotspotHelper.register(options: options, queue: queue) { (command) in
        switch command.commandType {
        case .evaluate,
             .filterScanList:
            let originalNetworklist = command.networkList ?? []
            let networkList = originalNetworklist.compactMap { network -> NEHotspotNetwork? in
                print("networkName: \(network.ssid); strength: \(network.signalStrength)")
                if network.ssid == targetSsid {
                    network.setConfidence(.high)
                    //network.setPassword(targetPassword)
                    return network
                }
                return nil
            }
            let response = command.createResponse(.success)
            response.setNetworkList(networkList)
            response.deliver()
        default:
            break
        }
    }

唯一の問題は、利用可能なすべてのSSIDとその信号強度のリストを取得するには、wifi設定ページにアクセスする必要があることです。

0
Dinesh