新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群: 812157648 ,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!
创新互联主营商南网站建设的网络公司,主营网站建设方案,app软件定制开发,商南h5成都微信小程序搭建,商南网站营销推广欢迎商南等地区企业咨询
iOS 13 以后
获取WiFi名称,必须要先允许获取定位信息
原文地址: ;request_id=160741070019215668868668biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2 all first_rank_v2~rank_v29-6-110481171.pc_search_result_cacheutm_term=iOS%E5%BC%80%E5%8F%91
最近遇到一个比较奇葩的需求:App与硬件通过WiFi LAN通信, 同时App需要与服务器通过3G/4G WAN通信,如下图:
众所周知,手机同时打开WiFi和3G时候,会优先走WiFi。这个该如何实现呢?市面上有一个极路客APP已经实现此方案,网上各种搜索资料,出现一个 Multipath TCP概念 ,但是这个系统没有API,瞬间抓狂,直接查看极路客APP与他们硬件连接的WIFI,发现与我们平时WiFi不一样,DNS没有。
1 AirDrop (UIActivityViewController类)
功能:实现iOS设备间的文件和数据分享。AirDrop使用蓝牙来扫描周围的设备,当两台设备通过蓝牙建立起了连接,考虑到更快速的数据传输,它就会创建点对点的WiFi网络来连接两部iOS 设备。但并不意味着为了使用AirDrop而需要把设备连接至WiFi网络。
传输方式:蓝牙、WiFi
支持系统:iOS
2 GameKit 框架
功能:GameKit主要是完成iOS设备间联网的相关功能,包括蓝牙和Internet两种方式。
传输方式:蓝牙、WiFi
支持系统:iOS
3 MultipeerConnectivity 框架
功能:利用Multipeer Connectivity框架,即使在没有连接到WiFi(WLAN)或移动网络(xG)的情况下,距离较近的Apple设备(iMac/iPad/iPhone)之间可基于蓝牙和WiFi(P2P WiFi)技术进行发现和连接实现近场通信。
传输方式:蓝牙、WiFi
支持系统:iOS
4 ExternalAccessory 框架
功能:External Accessory Framework提供了配件连接iOS设备的通道。开发者可以通过它来开发连接配件的app。配件可以通过30pin、蓝牙、USB的方式连接iOS设备。
传输方式:蓝牙、WiFi
支持系统:iOS
5 CoreBluetooth 框架
功能:蓝牙4.0协议之间信息传输,支持iOS和Android设备。
传输方式:蓝牙
支持系统:iOS、Android
6 Socket
功能:通过TCP或UDP进行相同局域网内信息传输,支持iOS和Android设备。
传输方式:WiFi
支持系统:iOS、Android
7 Bonjour
功能:Bonjour是一种能够自动查询接入网络中的设备或应用程序的协议。Bonjour 抽象掉 ip 和 port 的概念,让我们聚焦于更容易为人类思维理解的 service。通过 Bonjour,一个应用程序 publish 一个网络服务 service,然后网络中的其他程序就能自动发现这个 service,从而可以向这个 service 查询其 ip 和 port,然后通过获得的 ip 和 port 建立 socket 链接进行通信,支持iOS和Android设备。
传输方式:WiFi
支持系统:iOS、Android
8 AllJoyn
功能:AllJoyn,由高通公司主导的高创新中心的开源项目开发的,主要用于近距离无线传输,通过WiFi或蓝牙技术,定位和点对点文件传输。支持平台:RTOS、Arduino、Linux、Android、iOS、Windows、Mac。
传输方式:蓝牙、WiFi
支持系统:RTOS、Arduino、Linux、Android、iOS、Windows、Mac
蓝牙是比较简单的 使用苹果自带的 CoreBluetooth 就可以 ,至于wifi 现在貌似都是私有API了,上架可能会遇到问题,如果是企业帐号 则可以使用NSNetService类 和CFNetServices C API实现设备的发现、连接和Bonjour services.通过Socket实现基于TCP/IP协议网络通信。推荐 CocoaAsyncSocket 一个Socket的开源框架
通过官方的API 可以获取到wifi的信息,实现代码:
- (id)fetchSSIDInfo {
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
NSLog(@"Supported interfaces: %@", ifs);
id info = nil;
for (NSString *ifnam in ifs) {
info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
NSLog(@"%@ = %@", ifnam, info);
if (info [info count]) { break; }
}
return info;
}
至于开关wifi,是一个用户的操作, 在非越狱的机器上,第三方的应用是没法实现这功能的。
遍历UIStatusBar获取信号类型
- (void)getNetworkType
{
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
for (id subview in subviews) {
if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
switch (networkType) {
case 0:
NSLog(@"NONE");
break;
case 1:
NSLog(@"2G");
break;
case 2:
NSLog(@"3G");
break;
case 3:
NSLog(@"4G");
break;
case 5:
{
NSLog(@"WIFI");
}
break;
default:
break;
}
}
}
}
- (void)getSignalStrength{
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
NSString *dataNetworkItemView = nil;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
dataNetworkItemView = subview;
break;
}
}
int signalStrength = [[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue];
NSLog(@"signal %d", signalStrength);
}