【问题标题】:How to programmatically connect to a WiFi network given the SSID and password如何在给定 SSID 和密码的情况下以编程方式连接到 WiFi 网络
【发布时间】:2016-07-18 02:52:15
【问题描述】:

我正在尝试将我制作的现有 Android 应用程序复制到 iOS。在我的应用程序中,我应该能够连接到给定 SSID 和密码的 WiFi 网络。 SSID 和密码可以是硬编码的,也可以由用户输入。我正在通过互联网研究如何在 iOS 上完成此操作,但是,似乎非常不鼓励这种行为,并且无法使用不会让您的应用程序被应用程序拒绝的公共/文档库来执行此操作商店。

问题是我将亲自使用这个应用程序,我不打算将它提交到 App Store,所以如果我使用外部库也没关系。如果我的朋友想使用它,我可以导出一个企业版 ipa,并指导他们如何安装它。

经过搜索,MobileWifi.framework 似乎是一个不错的候选者。但是,在给定 SSID 和密码的情况下,似乎没有一种直接的方法可以使用此库连接到 WiFi 网络。

有没有人根据 SSID 和密码成功尝试连接到 Wifi 网络?

【问题讨论】:

    标签: ios wifi


    【解决方案1】:

    在 iOS 11 中,Apple 提供了公共 API,您可以使用它以编程方式加入 WiFi 网络,而无需离开您的应用。

    您需要使用的类称为NEHotspotConfiguration

    要使用它,您需要在您的 App Capabilities (Adding Capabilities) 中启用 Hotspot 功能。快速工作示例:

    NEHotspotConfiguration *configuration = [[NEHotspotConfiguration
     alloc] initWithSSID:@“SSID-Name”];
    configuration.joinOnce = YES;
    
    [[NEHotspotConfigurationManager sharedManager] applyConfiguration:configuration completionHandler:nil];
    

    这将提示用户加入“SSID-Name”WiFi 网络。在用户离开应用程序之前,它将保持与 WiFi 的连接。

    这不适用于模拟器,您需要在实际设备上运行此代码才能使其工作。

    更多信息在这里: https://developer.apple.com/documentation/networkextension/nehotspotconfiguration

    【讨论】:

    • 您好 Enthouan,我已经安装了 iOS 11 SDK 并尝试了您的方法,但是当我尝试使用 NEHotspotConfigurationManager 或 NEHotspotConfiguration 时由于某种原因出现链接器错误。即:“_OBJC_CLASS_$_NEHotspotConfigurationManager”,引用自:HomeViewController.o中的objc-class-ref。如果您遇到任何类似的问题,我将非常感谢您的帮助。
    • 嘿Olexiy,您是否启用了热点功能?如果它不能确保 NetworkExtension.framework 与您的二进制文件链接。
    • 是的,我启用了它并检查了 NetworkExtension.framework 是否正确链接。至少我可以使用 NEHotspotHelper 类,但不能使用其他类。
    • 是的,猜猜我需要什么来连接实际设备。最初我犹豫不决,因为它需要我在手机上安装 iOS 11 Beta,但如果没有其他方法 - 我可以接受。赞成。
    • 这是否需要 Apple 批准,是否有任何权利?
    【解决方案2】:

    在 iOS 11 中连接 wifi 网络。您可以使用 ssid 和密码连接 wifi,如下所示。

    在 App Id 配置服务上启用热点

    启用热点配置后

    仅适用于 iOS 11 的 Swift 4.0 代码:

    import NetworkExtension
    

    ...

    let configuration = NEHotspotConfiguration.init(ssid: "SSIDname", passphrase: "Password", isWEP: false)
    configuration.joinOnce = true
    
    NEHotspotConfigurationManager.shared.apply(configuration) { (error) in
        if error != nil {
            if error?.localizedDescription == "already associated."
            {
                print("Connected")
            }
            else{
                print("No Connected")
            }
        }
        else {
            print("Connected")
        }
    }
    

    【讨论】:

    • 如果您的 SSID 输入错误,您的连接失败并且没有错误,它仍然打印“已连接”。
    • 有没有办法知道 SSID 是否在 iPhone 的范围内?
    • 我无法将热点视为我的能力。知道为什么吗?
    • @MohammadBashirSidani 将热点视为您注册 Apple 开发计划所需的能力。您可以在这里找到更多信息developer.apple.com/support/app-capabilities
    • @Willjay 这个问题也在这里讨论stackoverflow.com/questions/53693025
    【解决方案3】:

    与您在这里和其他地方看到的相反,您可以做到。对于普通用户来说,很难做到足够漂亮,但如果不需要,那么编码真的很容易。这是企业管理的事情,但任何人都可以做到。查找“连接配置文件”。例如,Comcast 在他们的 iOS 应用中为您设置热点。

    基本上,它是一个 XML 文档,您可以让设备通过 Safari 或 Mail 摄取。它有很多技巧,用户体验不是很好,但我可以确认它可以在 iOS 10 中运行,并且不需要越狱。您使用 Configurator 生成 XML,我建议使用 this thread 来提供它(但人们找不到它,因为它不是专门针对 WiFi 的),以及 this blog 用于查询它是否已安装,这令人惊讶地不平凡但确实有效.

    I've answered this question 很多次,但要么没有足够的代表,要么太笨,无法弄清楚如何关闭重复的问题,以便更容易找到更好的答案。

    更新:iOS 11 直接为此功能提供 API(终于!)。见NEHotspotConfiguration。我们的 Xamarin C# 代码现在看起来像:

    var config = new NEHotspotConfiguration(Ssid, Pw, false);
    config.JoinOnce = false;
    

    【讨论】:

    • 我投票关闭了另一个问题,并让这个问题保持打开状态,因为这个问题有更多信息,并且有一个经过身份验证的用户可以接受答案。
    【解决方案4】:

    简短的回答,不。


    长答案:)

    这个问题被问了很多次:

    最有趣的答案似乎在指向 GitHub 项目的第一个链接中:wifiAssociate。但是,第三个链接中的某些人解释说,这不再适用于 iOS8,因此您可能很难让它运行。
    此外,iDevice必须越狱。

    【讨论】:

    • 即使使用 3rd 方库?那么有没有办法让用户加入网络呢?就像,弹出对话框加入一个网络,然后用户将在那里手动输入值..?
    • 我不知道有任何 3rd Party Lib 这样做可以帮助您。通常,我认为您会检查 Wi-Fi/蜂窝可用性(如 there 所述)并使用 UIApplicationOpenSettingsURLString 将用户重定向到设置应用程序。
    • 这个答案现在已经过时了
    【解决方案5】:

    确保功能中的网络扩展和热点配置都已打开。

    let wiFiConfig = NEHotspotConfiguration(ssid: YourSSID, 
        passphrase: YourPassword, isWEP: false) 
        wiFiConfig.joinOnce = false /*set to 'true' if you only want to join 
                                    the network while the user is within the 
                                    app, then have it disconnect when user 
                                    leaves your app*/
        NEHotspotConfigurationManager.shared.apply(wiFiConfig) { error in
            if error != nil {
                    //an error occurred
                    print(error?.localizedDescription)
                }
                else {
                    //success
                }
        }
    

    【讨论】:

    • 是的。在 objc 或 swift 中。建立连接后,如何向连接的网络发送数据包以及如何从网络接收数据包???
    • Abdul 一旦您连接,您发送和接收与其他任何人一样。只需谷歌如何进行网络编程,它的主题对于单个 Stack Overflow 帖子来说太宽泛了。
    【解决方案6】:

    我的两分钱: 如果你有:

    架构 i386 的未定义符号:
    “_OBJC_CLASS_$_NEHotspotConfigurationManager”,引用自: WiFiViewController.o "_OBJC_CLASS_$_NEHotspotConfiguration" 中的 objc-class-ref,引用自: WiFiViewController.old 中的 objc-class-ref:未找到架构 i386 的符号

    只是它在模拟器下不起作用。

    在真实设备上它会编译。 所以使用:

    class func startHotspotHelperStuff(){
    
            if TARGET_IPHONE_SIMULATOR == 0 {
    
                if #available(iOS 11.0, *) {
                    let configuration = NEHotspotConfiguration(ssid: "ss")
                    configuration.joinOnce = true
                    NEHotspotConfigurationManager.shared.apply(configuration, completionHandler: { (err: Error?) in
                        print(err)
                    })
                } else {
                    // Fallback on earlier versions
                }
            }// if TARGET_IPHONE_SIMULATOR == 0
        }
    

    【讨论】:

    • TARGET_IPHONE_SIMULATOR 已弃用,请改用 TARGET_OS_SIMULATOR。
    【解决方案7】:

    IOS 11 之后我们可以通过编程方式连接 wifi 网络。您可以使用 ssid 和密码连接 wifi,如下所示。

    斯威夫特

    var configuration = NEHotspotConfiguration.init(ssid: "wifi name", passphrase: "wifi password", isWEP: false)
            configuration.joinOnce = true
    
            NEHotspotConfigurationManager.shared.apply(configuration) { (error) in
                if error != nil {
                    //an error accured
                    print(error?.localizedDescription)
                }
                else {
                    //success
                }
            }
    

    【讨论】:

      【解决方案8】:

      您可以使用 Xcode 9 和 swift 4 连接到 wifi

      let WiFiConfig = NEHotspotConfiguration(ssid: "Mayur1",
                                                        passphrase: "123456789",
                                                        isWEP: false)
      
          WiFiConfig.joinOnce = false
          NEHotspotConfigurationManager.shared.apply(WiFiConfig) { error in
              // Handle error or success
              print(error?.localizedDescription)
          }
      

      【讨论】:

        【解决方案9】:

        我不确定这是否对任何人有帮助,但如果我没记错的话,Apple 从版本 9 开始在 iOS 中输入了一个 Wifi QR 码。已经有一段时间了。

        你可以去这里:https://qifi.org

        输入您的 SSID 和密码。打印 QR 码或将其保存在屏幕上。使用相机应用程序将 iPhone 对准二维码。你会看到一个通知栏,如果你按下它就会即时设置你的 WIFI 连接。

        这“应该”适用于 Android,但我尚未对其进行测试。它确实适用于 iOS。

        此解决方案的好处是您可以将您的 WIFI 基地“隐藏”在网络上,人们仍然可以连接到它,这在高流量区域出于安全原因非常可取。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-02
          • 2013-04-30
          • 2013-03-26
          • 2023-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多