重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
最近遇到一个比较奇葩的需求:App与硬件通过WiFi LAN通信, 同时App需要与服务器通过3G/4G WAN通信,如下图:
创新互联专注于凤台网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供凤台营销型网站建设,凤台网站制作、凤台网页设计、凤台网站官网定制、微信小程序开发服务,打造凤台网络公司原创品牌,更为您提供凤台网站排名全网营销落地服务。
众所周知,手机同时打开WiFi和3G时候,会优先走WiFi。这个该如何实现呢?市面上有一个极路客APP已经实现此方案,网上各种搜索资料,出现一个 Multipath TCP概念 ,但是这个系统没有API,瞬间抓狂,直接查看极路客APP与他们硬件连接的WIFI,发现与我们平时WiFi不一样,DNS没有。
遍历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);
}
通过官方的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,是一个用户的操作, 在非越狱的机器上,第三方的应用是没法实现这功能的。
蓝牙是比较简单的 使用苹果自带的 CoreBluetooth 就可以 ,至于wifi 现在貌似都是私有API了,上架可能会遇到问题,如果是企业帐号 则可以使用NSNetService类 和CFNetServices C API实现设备的发现、连接和Bonjour services.通过Socket实现基于TCP/IP协议网络通信。推荐 CocoaAsyncSocket 一个Socket的开源框架