【问题标题】:Detect the name of wireless network检测无线网络名称
【发布时间】:2012-11-02 12:58:56
【问题描述】:

是否可以运行返回用户连接的无线网络名称的方法?在我的应用程序内部,我希望能够返回用户连接到的无线网络的名称。

【问题讨论】:

标签: iphone ios xcode


【解决方案1】:

这对我来说很完美:

#import <SystemConfiguration/CaptiveNetwork.h>

CFArrayRef myArray = CNCopySupportedInterfaces();
CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
//    NSLog(@"SSID: %@",CFDictionaryGetValue(myDict, kCNNetworkInfoKeySSID));
NSString *networkName = CFDictionaryGetValue(myDict, kCNNetworkInfoKeySSID);

if ([networkName isEqualToString:@"Hot Dog"])
{
    self.storeNameController = [[StoreDataController alloc] init];
    [self.storeNameController addStoreNamesObject];
}
else {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Connection Failed"
                                                   message: @"Please connect to the Hot Dog network and try again"
                                                  delegate: self
                                         cancelButtonTitle: @"Close"
                                         otherButtonTitles: nil];

    [alert show];

【讨论】:

  • 释放CNCopySupportedInterfaces和CNCopyCurrentNetworkInfo的返回值怎么样?文档声明您“必须”释放返回值。
  • 坏消息:'CNCopyCurrentNetworkInfo' 已弃用:在 iOS 9.0 中首次弃用 - 对于强制网络应用程序,它已完全被 取代。对于其他应用程序,没有直接替代。请提交描述您使用此 API 的错误,以便我们可以随着这种情况的发展考虑您的要求。好消息:尽管已被弃用,但它在 iOS 9 中仍然有效,并且在 iOS 10 中未被弃用。
  • @RonReuter 评论的更新:现在已正确弃用,并且在 iOS 13 中不起作用(总是返回相同的 wifi ssid)
  • 实际上,它在 iOS 13 中仍然可以正常工作,但需要几个步骤才能使其正常工作。您必须添加访问 WiFi 信息的权利,实现一些 CLLocationManager 方法来访问位置信息,并且您必须添加一个或两个带有消息的 info.plist 项,以便在您的应用程序请求信息时向用户显示。它不平凡,但它仍然有效,现在似乎得到了 Apple 的支持。
【解决方案2】:

Developer.apple ,您可以使用 CNCopyCurrentNetworkInfo

返回给定网络接口的当前网络信息。

CFDictionaryRef CNCopyCurrentNetworkInfo (
   CFStringRef interfaceName
);

它包含一个包含接口当前网络信息的字典。所有权遵循创建规则。

注意适用于 iOS 4.1 及更高版本

示例:

这个例子在真机上可以正常运行,在模拟器中可能会崩溃。

添加SystemConfiguration.framework

导入 CaptiveNetwork header 同下

#import &lt;SystemConfiguration/CaptiveNetwork.h&gt;

然后编写以下代码。

    CFArrayRef myArray = CNCopySupportedInterfaces();
    // Get the dictionary containing the captive network infomation
    CFDictionaryRef captiveNtwrkDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));    
    NSLog(@"Information of the network we're connected to: %@", captiveNtwrkDict);    
    NSDictionary *dict = (__bridge NSDictionary*) captiveNtwrkDict;
    NSString* ssid = [dict objectForKey:@"SSID"];
    NSLog(@"network name: %@",ssid);

使用 Bonjour,应用程序既在本地网络上宣传自己,又在网络上显示该应用程序的其他实例的列表

查看示例Witap 应用程序

【讨论】:

  • CNCopyCurrentNetworkInfo 听起来很有希望,但我无法让它正常运行。 Wifi的接口名称是什么?我搜索了它,但没有找到。
  • 这可能在模拟器中崩溃的事实是否记录在任何地方?对我来说,它在模拟器中完美运行了几周,然后突然可靠地崩溃了。
【解决方案3】:

坏消息:'CNCopyCurrentNetworkInfo' 已弃用:在 iOS 9.0 中首次弃用 - 对于强制网络应用程序,它已完全被 取代。对于其他应用程序,没有直接替代。请提交描述您使用此 API 的错误,以便我们可以随着这种情况的发展考虑您的要求。

好消息:虽然已被弃用,但它在 iOS 9 中仍然有效,并且在 iOS 10 中已被弃用。

它在 iOS 13 中仍然有效,但前提是应用实现了定位服务并且用户授权了它们的使用。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 2011-09-26
    • 1970-01-01
    • 2011-10-06
    • 2014-10-31
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多