zoukankan      html  css  js  c++  java
  • 获取iOS设备ip地址

    写在前面

    最近做关于网络接口部分,有时候为了接口安全,需要在请求接口的时候,跟后服务端约好,每一个接口需要传递特定的签名数据,关于签名算法,服务端和移动端保持一致;当然这不是主要的,主要的是,如何获取设备的ip地址;废话不多说,直接上代码;

    小tips:

    Mac 终端获取电脑ip: ifconfig | grep "inet " | grep -v 127.0.0.1

    主要参考:stackoverflow

    1 http://stackoverflow.com/questions/7072989/iphone-ipad-osx-how-to-get-my-ip-address-programmatically/10803584#10803584

     1 导入头文件
     2 #include <ifaddrs.h>
     3 #include <arpa/inet.h>
     4 #include <net/if.h>
     5 
     6 #define IOS_CELLULAR    @"pdp_ip0"
     7 #define IOS_WIFI        @"en0"
     8 #define IOS_VPN         @"utun0"
     9 #define IP_ADDR_IPv4    @"ipv4"
    10 #define IP_ADDR_IPv6    @"ipv6"
    11 
    12 
    13 
    14 #pragma mark - 获取ip地址
    15 + (NSString *)getIPAddress:(BOOL)preferIPv4{
    16     NSArray *searchArray = preferIPv4 ?
    17     @[ 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 ] :
    18     @[ 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 ] ;
    19     
    20     NSDictionary *addresses = [self getIPAddresses];
    21     
    22     //    NSLog(@"addresses: %@", addresses);
    23     
    24     __block NSString *address;
    25     [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)
    26      {
    27          address = addresses[key];
    28          //筛选出IP地址格式
    29          if([self isValidatIP:address]) *stop = YES;
    30      } ];
    31     return address ? address : @"0.0.0.0";
    32 
    33 }
    34 
    35 + (BOOL)isValidatIP:(NSString *)ipAddress {
    36     if (ipAddress.length == 0) {
    37         return NO;
    38     }
    39     NSString *urlRegEx = @"^([01]?\d\d?|2[0-4]\d|25[0-5])\."
    40     "([01]?\d\d?|2[0-4]\d|25[0-5])\."
    41     "([01]?\d\d?|2[0-4]\d|25[0-5])\."
    42     "([01]?\d\d?|2[0-4]\d|25[0-5])$";
    43     
    44     NSError *error;
    45     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error];
    46     
    47     if (regex != nil) {
    48         NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];
    49         
    50         if (firstMatch) {
    51             NSRange resultRange = [firstMatch rangeAtIndex:0];
    52             NSString *result=[ipAddress substringWithRange:resultRange];
    53             //输出结果
    54             //   NSLog(@"%@",result);
    55             return YES;
    56         }
    57     }
    58     return NO;
    59 }
    60 
    61 + (NSDictionary *)getIPAddresses
    62 {
    63     NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
    64     
    65     // retrieve the current interfaces - returns 0 on success
    66     struct ifaddrs *interfaces;
    67     if(!getifaddrs(&interfaces)) {
    68         // Loop through linked list of interfaces
    69         struct ifaddrs *interface;
    70         for(interface=interfaces; interface; interface=interface->ifa_next) {
    71             if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
    72                 continue; // deeply nested code harder to read
    73             }
    74             const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
    75             char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
    76             if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
    77                 NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
    78                 NSString *type;
    79                 if(addr->sin_family == AF_INET) {
    80                     if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
    81                         type = IP_ADDR_IPv4;
    82                     }
    83                 } else {
    84                     const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
    85                     if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
    86                         type = IP_ADDR_IPv6;
    87                     }
    88                 }
    89                 if(type) {
    90                     NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
    91                     addresses[key] = [NSString stringWithUTF8String:addrBuf];
    92                 }
    93             }
    94         }
    95         // Free memory
    96         freeifaddrs(interfaces);
    97     }
    98     return [addresses count] ? addresses : nil;
    99 }

    亲测可用,万能的stackoverflow,非常感谢!

    好好做好分内之事,闲来之余,随便逛逛!
  • 相关阅读:
    课程作业06-汇总整理
    课程作业04-汇总整理
    课程作业04-字串加密解密
    课程作业03-你已经创建了多少个对象?
    课程作业03-汇总整理
    课程作业02-汇总整理
    02-实验性问题总结归纳
    猜数字游戏
    RandomStr实验报告(验证码实验)
    个人总结
  • 原文地址:https://www.cnblogs.com/20150728-IOS/p/5644128.html
Copyright © 2011-2022 走看看