如何通过程序连接到一个WiFi网络,只需提供SSID和密码即可。

56

我正在尝试将一款已存在的Android应用程序复制到iOS上。在我的应用程序中,我应该能够连接到一个WiFi网络,只需提供SSID和密码。SSID和密码可以硬编码或由用户输入。我在互联网上研究如何在iOS上完成这个功能,然而,似乎高度不鼓励这种行为,并且没有使用公共/文档库的方法,否则您的应用程序将被App Store拒绝。

问题是我将会个人使用此应用程序,并且没有计划将其提交到App Store中,因此如果我使用外部库,那就没问题了。如果我的朋友想要使用它,我可以导出企业级ipa并给他们安装说明。

在搜索过程中,看起来MobileWifi.framework是一个很好的选择。然而,似乎没有直接的方法使用这个库来连接给定SSID和密码的WiFi网络。

有没有成功尝试连接到给定SSID和密码的WiFi网络的人?

9个回答

68

iOS 11提供了公共API,您可以在不离开应用程序的情况下编程加入WiFi网络。

您需要使用的类名为NEHotspotConfiguration

要使用它,您需要在应用能力中启用热点功能(添加能力)。以下是一个快速工作的示例:

NEHotspotConfiguration *configuration = [[NEHotspotConfiguration
 alloc] initWithSSID:@“SSID-Name”];
configuration.joinOnce = YES;

[[NEHotspotConfigurationManager sharedManager] applyConfiguration:configuration completionHandler:nil];

这将提示用户加入"SSID-Name"的WiFi网络。它将一直保持连接,直到用户离开应用程序。

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

更多信息请参见: https://developer.apple.com/documentation/networkextension/nehotspotconfiguration


嘿,Olexiy,你启用了热点功能吗?如果没有,请确保将NetworkExtension.framework与您的二进制文件链接。 - Enthouan
是的,我已经启用了它,并检查了NetworkExtension.framework是否正确链接。至少我能够使用NEHotspotHelper类,但不能使用其他类。 - Olexiy Burov
1
是的,你猜我需要连接一个实际设备。起初我犹豫了,因为这需要我在手机上安装iOS 11测试版,但如果没有其他办法 - 我可以接受。点赞。 - Olexiy Burov
我在功能列表中找不到热点功能,有什么帮助吗? - Mohammad Bashir Sidani
2
这需要苹果的批准吗?需要任何权限吗? - anoop4real
显示剩余6条评论

30

iOS 11中连接wifi网络。您可以像以下这样使用ssid和密码连接wifi。

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

在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")
    }
}

9
如果SSID中有错别字,连接将失败且不会出现任何错误提示,但仍会显示“已连接”。 - Willjay
2
有没有办法知道 iPhone 是否在某个 SSID 的范围内? - razvan
我在我的功能中找不到热点作为能力,有任何想法为什么? - Mohammad Bashir Sidani
要将热点作为功能查看,您需要加入苹果开发计划。您可以在此处找到更多信息:https://developer.apple.com/support/app-capabilities/ - Stacy Smith
1
@Willjay 这个问题在这里也有讨论:https://dev59.com/ElQJ5IYBdhLWcg3wg2NQ - DerSeegler
还有,您需要在页面顶部添加“import NetworkExtension”语句。 - JackieNBee

21

与你在这里和其他地方看到的相反,你可以做到这一点。要让它漂亮到足够普通用户使用是很难的,但如果不必这样做,那么编码就非常容易了。这是一个企业管理员的事情,但任何人都可以做到。查找“连接配置文件”。例如,Comcast在其iOS应用程序中执行此操作,为您设置热点。

基本上,它是一个XML文档,您可以通过Safari或Mail使设备摄入该文档。有很多诀窍,用户体验并不是很好,但我可以确认它在iOS 10中有效,并且不需要越狱。您可以使用Configurator生成XML,我建议使用此线程进行服务(但人们无法找到它,因为它不是特别关于WiFi),以及使用此博客查询是否已安装,这非常复杂,但确实可以工作。

我已经多次回答了这个问题,但要么没有足够的声望,要么太笨了,无法弄清楚如何关闭问题,以便更容易找到更好的答案。

更新:iOS 11直接提供此功能的API(终于!)。请参见NEHotspotConfiguration。我们的Xamarin C#代码现在是这样的:

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

1
我投票关闭了另一个问题,并保留了这个问题的开放状态,因为这个问题有更多的信息,并且有一个已验证的用户可以接受答案。 - Senseful

9

简短回答,不行。


长答案 :)

这个问题被问了很多次:

最有趣的答案似乎在第一个链接中,它指向一个GitHub项目:wifiAssociate。然而,第三个链接中的一些人解释说,这在iOS8中不再起作用,因此您可能难以让它运行。
此外,i设备必须越狱。


即使使用第三方库,还是有办法要求用户加入网络吗?比如,弹出对话框让用户加入网络,然后用户手动输入值...? - Razgriz
我不知道有任何第三方库可以帮助您完成这项任务。通常,我认为您需要检查Wi-Fi/蜂窝网络的可用性(如此处所述),然后使用UIApplicationOpenSettingsURLString将用户重定向到设置应用程序。 - filaton
1
此答案现已过时。 - pstanton

7

请确保在功能选项中同时开启了网络扩展和热点配置。

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
            }
    }

是的,在 Objective-C 或 Swift 中。 一旦建立连接,如何向已连接的网络发送数据包,以及如何从网络接收数据包??? - Abdul Yasin
1
阿卜杜勒,一旦你连接上了,你的发送和接收就和其他人一样。只需谷歌搜索如何进行网络编程,这是一个太广泛的主题,无法在单个Stack Overflow帖子中解决。 - Shayne

5

我的建议:

i386架构未定义符号:
"_OBJC_CLASS_$_NEHotspotConfigurationManager",引用于: WiFiViewController.o中的objc-class-ref "_OBJC_CLASS_$_NEHotspotConfiguration",引用于: WiFiViewController.o中的objc-class-ref ld: 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代替。 - Nilesh

4
我们可以在IOS 11之后通过编程方式连接wifi网络。您可以像以下示例一样使用ssid和密码连接wifi。
Swift
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
            }
        }

0

你可以使用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)
    }

0

我不确定这是否会对任何人有所帮助,但自iOS 9版本以来,苹果就将Wifi QR码放入了系统中。它已经存在一段时间了。

您可以访问这里:https://qifi.org

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

这个解决方案“应该”适用于Android,但我还没有测试过。它在iOS上确实有效。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接