iOS 之获取IP地址 以及 判断个人热点是否开启
应用到的头文件及宏定义
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <net/if.h>
#define IOS_CELLULAR @"pdp_ip0"
#define IOS_WIFI @"en0"
//#define IOS_VPN @"utun0"
#define IP_ADDR_IPv4 @"ipv4"
#define IP_ADDR_IPv6 @"ipv6"
获取所有相关IP信息
/**
获取所有相关IP信息
@return <#return value description#>
*/
- (NSDictionary *)getIPAddresses
{
NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
// retrieve the current interfaces - returns 0 on success
struct ifaddrs *interfaces;
if(!getifaddrs(&interfaces)) {
// Loop through linked list of interfaces
struct ifaddrs *interface;
for(interface=interfaces; interface; interface=interface->ifa_next) {
if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
continue; // deeply nested code harder to read
}
const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
NSString *type;
if(addr->sin_family == AF_INET) {
if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
type = IP_ADDR_IPv4;
}
} else {
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
type = IP_ADDR_IPv6;
}
}
if(type) {
NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
addresses[key] = [NSString stringWithUTF8String:addrBuf];
}
}
}
// Free memory
freeifaddrs(interfaces);
}
return [addresses count] ? addresses : nil;
}
获取设备当前网络IP地址
/**
获取设备当前网络IP地址
@param preferIPv4 <#preferIPv4 description#>
@return <#return value description#>
*/
- (NSString *)getIPAddress:(BOOL)preferIPv4
{
NSArray *searchArray = preferIPv4 ?
@[ /*IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6,*/ IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :
@[ /*IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4,*/ IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;
NSDictionary *addresses = [self getIPAddresses];
NSLog(@"addresses: %@", addresses);
__block NSString *address;
[searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)
{
address = addresses[key];
if(address) *stop = YES;
} ];
return address ? address : @"0.0.0.0";
}
判断热点是否开启
/**
判断热点是否开启
@return <#return value description#>
*/
- (BOOL)flagWithOpenHotSpot
{
NSDictionary *dict = [self getIPAddresses];
if ( dict ) {
NSArray *keys = dict.allKeys;
for ( NSString *key in keys) {
if ( key && [key containsString:@"bridge"])
return YES;
}
}
return NO;
}
————————————————
版权声明:本文为CSDN博主「Three_Zhang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Three_Zhang/article/details/58589524
相关文章
- iOS 获取appstore 版本
- iOS获取手机号
- iOS new 和 alloc的区别
- JavaScript 中 new Date(time).getTime() 获取时间戳方法在 iOS 中的兼容性问题
- How to change in the Cocos2d-x project from landscape to portrait both in iOS and Android
- iOS应用开发---返回到指定界面
- Hello_IOS ios开发transform属性
- ios GUI系统综述:iOS的图形绘制、动画与runloop
- iOS 开发中使用 NSURLProtocol 拦截 HTTP 请求
- 聊聊 iOS 中的网络加密
- iOS获取设备型号
- iOS runtime 运行时( 三 )
- IOS 被拒 关于 iPhone running iOS 10.3.1 on Wi-Fi connected to an IPv6 network.
- 接入华为推送用API给iOS应用发消息时如何获取access_token?
- 【AGC】flutter之agconnect_crash在ios上崩溃
- iOS 获取appstore 版本
- iOS_21团购_地图功能
- Unity 之 代码获取IOS设备型号 -- 做分辨率适配
- ios 获取button所在的cell对象, 注意:ios7 =< System Version < ios8 获取cell对象的差别
- weex-platform里iOS项目打包报错/platforms/ios/../../start does not exist.
- iOS - 获取音视频文件的Metadata信息
- iOS - 开发类库
- iOS之学习资源收集--很好的IOS技术学习网站
- IOS UIAlertController 使用方法
- Mac机获取IOS手机udid