【问题标题】:Is it possible to connect to WiFi automatically by capturing QR-Code?是否可以通过捕获二维码自动连接到 WiFi?
【发布时间】:2022-03-21 15:11:11
【问题描述】:

我是 iOS 开发 (SwiftUI) 的新手。

最近遇到一个通过二维码连接WiFi的问题。 我想知道是否有任何可能的解决方案可以使用 QR 码直接连接到 WiFi。 在我做了很多研究之后,我仍然找不到任何关于这个问题的参考资料。 有我的关键词:SwiftUI、Swift、QR-Code、Wi-Fi、iOS。

我现在有什么:

内容视图

struct ContentView: View {
    @State private var isShowingScanner = false
    @State private var resultOfScanning: String = "Result will be shown here..."
    var body: some View {
        VStack {
            Button(action: { self.isShowingScanner = true }, label: { Text("Scan Button") })
                .sheet(isPresented: self.$isShowingScanner) {
                    CodeScannerView(codeTypes: [.qr], simulatedData: "www.opgg.com", completion: self.handleScan)
            }
            Text("\(resultOfScanning)")
        }
    }

    func handleScan(result: Result<String, CodeScannerView.ScanError>) {
        self.isShowingScanner = false
        switch result {
        case .success(let code):
            let codeStr = code as! String
            self.resultOfScanning = codeStr
        case .failure(let error):
            print("Scanning failed")
        }
    }
}

CodeScannerView(参考:Paul Hudson 的文章)

我要构建什么: 我想使用这个应用程序,通过捕获二维码自动连接到特定的 WiFi(它包含 WiFi 的 SSID 和密码)。

我的问题是什么: 我找不到使用二维码自动连接到特定 WiFi 的方法。好像没有人讨论过这个问题。

有人知道如何解决上述问题吗?

感谢 cmets 和答案。

【问题讨论】:

  • 我找到了实现这个要求的方法。

标签: ios swift swiftui wifi qr-code


【解决方案1】:

我们有四个步骤来处理这个问题。

1.获取包含特定WiFi热点信息(SSID、密码、加密类型)的二维码。

2.将二维码的JSON数据转为字典

3.从前面提到的字典中获取SSID、密码和加密类型值。

4.使用Apple API的NEHotspotConfiguration设置我们的SSID、密码和加密类型并连接到特定的WiFi热点。

附言您的应用需要签名证书才能激活您的项目和 Apple API 的某些功能。

让我们看看我在这里做了什么:

func handleScan(result: Result<String, CodeScannerView.ScanError>) {
switch result {
case .success(let code):
    let data_code = code.data(using: .utf8)
    do {
        let dict_code = try JSONSerialization.jsonObject(with: data_code!, options: .allowFragments) as! [String : Any]
        let wifi_ssid = dict_code["S"] as! String
        let wifi_pwd = dict_code["P"] as! String
        let wifi_type = dict_code["T"] as! String

        let configuration = NEHotspotConfiguration.init(ssid: wifi_ssid, passphrase: wifi_pwd, isWEP: self.checkWifiType(type: wifi_type))
        configuration.joinOnce = true
        NEHotspotConfigurationManager.shared.apply(configuration) {
            (error) in
            if error != nil {
                if let errorStr = error?.localizedDescription {
                    print("Error Information:\(errorStr)")
                }
                if (error?.localizedDescription == "already associated.") {
                    print("Connected!")
                } else {
                    print("No Connected!")
                }
            } else {
                print("Connected!")
            }
        }

        print("Dict_Code:\(dict_code)")
    } catch (let error) {
        print("JSONSerial... Convert Error:\(error.localizedDescription)")
    }

case .failure(let error):
    self.connectionStatus = "Scanning failed!"
}
}

完成此操作后,我终于可以扫描自己的二维码并连接到特定的 WiFi 热点了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2019-10-10
    • 2012-02-08
    相关资源
    最近更新 更多