在 IOS 12- Xamarin 上获取已连接 WIFI 的 SSID(针对 iOS 13 进行了更新)
Getting the SSID of the CONNECTED WIFI on IOS 12- Xamarin (Updated for iOS 13)
我可以将已连接 wifi 的 ssid 获取到我的 iPhone。安装 Xcode 10 并为 Mac 和 Visual Studio 2017 更新 Visual Studio 后,它 return 给我一个空的 ssid。
这是我获取 ssid 的代码:
public override string GetCurrentWiFi()
{
String ssid = "";
try
{
string[] supportedInterfaces;
StatusCode status;
if ((status = CaptiveNetwork.TryGetSupportedInterfaces(out supportedInterfaces)) != StatusCode.OK)
{
}
else
{
foreach (var item in supportedInterfaces)
{
NSDictionary info;
status = CaptiveNetwork.TryCopyCurrentNetworkInfo(item, out info);
if (status != StatusCode.OK)
{
continue;
}
ssid = info[CaptiveNetwork.NetworkInfoKeySSID].ToString();
}
}
}
catch
{
}
return ssid;
}
我尝试为 iOS 12 应用程序添加 "Access WiFi Information" 权利,正如此处提到的那样,但该应用程序仍然得到一个空的 ssid:https://forums.xamarin.com/discussion/139476/adding-access-wifi-information-entitlement-for-ios-12-apps
如果有人能提供帮助,我将不胜感激。
已解决:我为我的 Apple ID 申请了访问 WIFI 信息。然后我再次重新生成我的配置文件并在我的 Xcode 中打开它。不要忘记在 ios Bundle Signing 的 Custom Entertainments 中添加 Entitlements.plist。现在它可以正常工作了。
iOS13更新:Apple宣布iOS13,CNCopyCurrentNetworkInfoAPI将不再return有效Wi-Fi SSID 和 BSSID 信息。
如果您的应用需要有效的 Wi-Fi SSID 和 BSSID 信息才能运行,您可以执行以下操作:
· 对于附件设置应用程序,使用 NEHotSpotConfiguration API,它现在可以选择传递您的应用程序希望连接到的 SSID 热点的前缀。
· 对于其他类型的应用程序,使用 CoreLocation API 请求用户同意访问位置信息。
所以,我通过以下方式更新了上面的解决方案:
将此密钥添加到您的 info.plist:
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your Description</string>
使用 CoreLocation API 请求用户同意访问位置信息。
private void GetLocationConsent()
{
var manager = new CLLocationManager();
manager.AuthorizationChanged += (sender, args) => {
Console.WriteLine("Authorization changed to: {0}", args.Status);
};
if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
manager.RequestWhenInUseAuthorization();
}
在调用 "CaptiveNetwork" 之前调用 GetLocationConsent() 函数。
要在 iOS 12 及更高版本中使用此功能,请为您的应用启用访问 WiFi 信息功能。
所以你必须检查appid中的Access WiFi Infomation。
我可以将已连接 wifi 的 ssid 获取到我的 iPhone。安装 Xcode 10 并为 Mac 和 Visual Studio 2017 更新 Visual Studio 后,它 return 给我一个空的 ssid。
这是我获取 ssid 的代码:
public override string GetCurrentWiFi()
{
String ssid = "";
try
{
string[] supportedInterfaces;
StatusCode status;
if ((status = CaptiveNetwork.TryGetSupportedInterfaces(out supportedInterfaces)) != StatusCode.OK)
{
}
else
{
foreach (var item in supportedInterfaces)
{
NSDictionary info;
status = CaptiveNetwork.TryCopyCurrentNetworkInfo(item, out info);
if (status != StatusCode.OK)
{
continue;
}
ssid = info[CaptiveNetwork.NetworkInfoKeySSID].ToString();
}
}
}
catch
{
}
return ssid;
}
我尝试为 iOS 12 应用程序添加 "Access WiFi Information" 权利,正如此处提到的那样,但该应用程序仍然得到一个空的 ssid:https://forums.xamarin.com/discussion/139476/adding-access-wifi-information-entitlement-for-ios-12-apps
如果有人能提供帮助,我将不胜感激。
已解决:我为我的 Apple ID 申请了访问 WIFI 信息。然后我再次重新生成我的配置文件并在我的 Xcode 中打开它。不要忘记在 ios Bundle Signing 的 Custom Entertainments 中添加 Entitlements.plist。现在它可以正常工作了。
iOS13更新:Apple宣布iOS13,CNCopyCurrentNetworkInfoAPI将不再return有效Wi-Fi SSID 和 BSSID 信息。
如果您的应用需要有效的 Wi-Fi SSID 和 BSSID 信息才能运行,您可以执行以下操作: · 对于附件设置应用程序,使用 NEHotSpotConfiguration API,它现在可以选择传递您的应用程序希望连接到的 SSID 热点的前缀。 · 对于其他类型的应用程序,使用 CoreLocation API 请求用户同意访问位置信息。
所以,我通过以下方式更新了上面的解决方案:
将此密钥添加到您的 info.plist:
<key>NSLocationWhenInUseUsageDescription</key> <string>Your Description</string>
使用 CoreLocation API 请求用户同意访问位置信息。
private void GetLocationConsent() { var manager = new CLLocationManager(); manager.AuthorizationChanged += (sender, args) => { Console.WriteLine("Authorization changed to: {0}", args.Status); }; if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) manager.RequestWhenInUseAuthorization(); }
在调用 "CaptiveNetwork" 之前调用 GetLocationConsent() 函数。
要在 iOS 12 及更高版本中使用此功能,请为您的应用启用访问 WiFi 信息功能。
所以你必须检查appid中的Access WiFi Infomation。