iOS 获取手机设备IP地址的两种方法

转自:http://blog.sina.com.cn/s/blog_b0b335e20102y3im.html

整理了两个能有效获取手机设备IP地址的方法,分享给大家。

友情提示:两种方法都必须在设备联网的情况下才能成功获取IP。

微博地址:http://blog.sina.com.cn/s/blog_b0b335e20102y3im.html



一,方法一​

1,引入头文件 import,五个


2,代码实现

- (NSString *)getDeviceIPIpAddresses

{

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd <</span> 0) returnnil;

    NSMutableArray *ips = [NSMutableArray array];

    

    int BUFFERSIZE = 4096;

    structifconf ifc;

    char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;

    structifreq *ifr, ifrcopy;

    ifc.ifc_len = BUFFERSIZE;

    ifc.ifc_buf = buffer;

    if (ioctl(sockfd, SIOCGIFCONF, &ifc) >= 0){

        for (ptr = buffer; ptr < buffer + ifc.ifc_len; ){

            ifr = (structifreq *)ptr;

            int len = sizeof(struct sockaddr);

            if (ifr->ifr_addr.sa_len > len) {

                len = ifr->ifr_addr.sa_len;

            }

            ptr += sizeof(ifr->ifr_name) + len;

            if (ifr->ifr_addr.sa_family != AF_INET) continue;

            if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL) *cptr = 0;

            if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) continue;

            memcpy(lastname, ifr->ifr_name, IFNAMSIZ);

            ifrcopy = *ifr;

            ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);

            if ((ifrcopy.ifr_flags & IFF_UP) == 0) continue;

            

            NSString *ip = [NSString  stringWithFormat:@"%s", inet_ntoa(((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr)];

            [ips addObject:ip];

        }

    }

    close(sockfd);

    

    

    NSString *deviceIP = @"";

    for (int i=0; i < ips.count; i++)

    {

        if (ips.count > 0)

        {

            deviceIP = [NSString stringWithFormat:@"%@",ips.lastObject];

            

        }

    }

    return deviceIP;

}


3,调用,得到IP

NSString *deviceIP_01 = [self  getDeviceIPAddress];

 NSLog(@"deviceIP: %@",deviceIP_01);




​二,方法二

1,include 头文件

​#include "IPAddress.h"

2,代码实现

- (NSString*)getDeviceIPAddress

{

    InitAddresses();

    GetIPAddresses();

    GetHWAddresses();

    

    int i;

    NSString *deviceIP = nil;

    

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        static unsigned  long localHost = 0x7F000001;            // 127.0.0.1

        unsigned long theAddr;

        

        theAddr = ip_addrs[i];

        

        if (theAddr == 0) break;

        if (theAddr == localHost) continue;

        

        NSString *ifName = [NSString  stringWithFormat:@"%s",if_names[i]];

        

        

        if ([ifName isEqualToString:@"en0"])

        {

            deviceIP = [NSString stringWithFormat:@"%s",ip_names[i]];;

        }

        

    }

    

    //save deviceIP

    if (deviceIP.length > 1)

    {

        [[NSUserDefaultsstandardUserDefaults] setObject:deviceIP forKey:@"deviceIP"];

    }

    return deviceIP;

}

​​

​3,调用

​NSString *deviceIP = [self getDeviceIPAddress];

NSLog(@"deviceIP: %@",deviceIP);


4,IPAddress 文件代码

(1)IPAddress.h

//

//  IPAddress.h

//  MiniSoft

//

//  Created by cherish on 15/9/16.

//  Copyright (c) 2015年 nike_hu. All rights reserved.

//

#ifndef __MiniSoft__IPAddress__

#define __MiniSoft__IPAddress__

#include

#define MAXADDRS    32

externchar *if_names[MAXADDRS];

externchar *ip_names[MAXADDRS];

externchar *hw_addrs[MAXADDRS];

externunsignedlong ip_addrs[MAXADDRS];

// Function prototypes

void InitAddresses();

void FreeAddresses();

void GetIPAddresses();

void GetHWAddresses();

#endif

(2)IPAddress.m

​//

//  IPAddress.c

//  MiniSoft

//

//  Created by cherish on 15/9/16.

//  Copyright (c) 2015年 nike_hu. All rights reserved.

//

#include "IPAddress.h"

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "IPAddress.h"

#define min(a,b)    ((a) < (b) ? (a) : (b))

#define max(a,b)    ((a) > (b) ? (a) : (b))

#define BUFFERSIZE  4000

char *if_names[MAXADDRS];

char *ip_names[MAXADDRS];

char *hw_addrs[MAXADDRS];

unsignedlong ip_addrs[MAXADDRS];

staticint   nextAddr = 0;

void InitAddresses()

{

    int i;

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        if_names[i] = ip_names[i] = hw_addrs[i] = NULL;

        ip_addrs[i] = 0;

    }

}

void FreeAddresses()

{

    int i;

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        if (if_names[i] != 0) free(if_names[i]);

        if (ip_names[i] != 0) free(ip_names[i]);

        if (hw_addrs[i] != 0) free(hw_addrs[i]);

        ip_addrs[i] = 0;

    }

    InitAddresses();

}

void GetIPAddresses()

{

    int                 i, len, flags;

    char                buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;

    structifconf       ifc;

    structifreq        *ifr, ifrcopy;

    structsockaddr_in  *sin;

    

    char temp[80];

    

    int sockfd;

    

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        if_names[i] = ip_names[i] = NULL;

        ip_addrs[i] = 0;

    }

    

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd <</span> 0)

    {

        perror("socket failed");

        return;

    }

    

    ifc.ifc_len = BUFFERSIZE;

    ifc.ifc_buf = buffer;

    

    if (ioctl(sockfd, SIOCGIFCONF, &ifc) <</span> 0)

    {

        perror("ioctl error");

        return;

    }

    

    lastname[0] = 0;

    

    for (ptr = buffer; ptr < buffer + ifc.ifc_len; )

    {

        ifr = (structifreq *)ptr;

        len = max(sizeof(struct  sockaddr), ifr->ifr_addr.sa_len);

        ptr += sizeof(ifr->ifr_name) + len;   // for next one in buffer

        

        if (ifr->ifr_addr.sa_family != AF_INET)

        {

            continue; // ignore if not desired address family

        }

        

        if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL)

        {

            *cptr = 0;        // replace colon will null

        }

        

        if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0)

        {

            continue;

        }

        

        memcpy(lastname, ifr->ifr_name, IFNAMSIZ);

        

        ifrcopy = *ifr;

        ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);

        flags = ifrcopy.ifr_flags;

        if ((flags & IFF_UP) == 0)

        {

            continue; // ignore if interface not up

        }

        

        if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+1);

        if (if_names[nextAddr] == NULL)

        {

            return;

        }

        strcpy(if_names[nextAddr], ifr->ifr_name);

        

        sin = (structsockaddr_in *)&ifr->ifr_addr;

        strcpy(temp, inet_ntoa(sin->sin_addr));

        

        ip_names[nextAddr] = (char *)malloc(strlen(temp)+1);

        if (ip_names[nextAddr] == NULL)

        {

            return;

        }

        strcpy(ip_names[nextAddr], temp);

        

        ip_addrs[nextAddr] = sin->sin_addr.s_addr;

        

        ++nextAddr;

    }

    

    close(sockfd);

}

void GetHWAddresses()

{

    structifconf ifc;

    structifreq *ifr;

    int i, sockfd;

    char buffer[BUFFERSIZE], *cp, *cplim;

    char temp[80];

    

    for (i=0; i<</span>MAXADDRS; ++i)

    {

        hw_addrs[i] = NULL;

    }

    

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd <</span> 0)

    {

        perror("socket failed");

        return;

    }

    

    ifc.ifc_len = BUFFERSIZE;

    ifc.ifc_buf = buffer;

    

    if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) <</span> 0)

    {

        perror("ioctl error");

        close(sockfd);

        return;

    }

    

    ifr = ifc.ifc_req;

    

    cplim = buffer + ifc.ifc_len;

    

    for (cp=buffer; cp < cplim; )

    {

        ifr = (structifreq *)cp;

        if (ifr->ifr_addr.sa_family == AF_LINK)

        {

            structsockaddr_dl *sdl = (structsockaddr_dl *)&ifr->ifr_addr;

            int a,b,c,d,e,f;

            int i;

            

            strcpy(temp, (char *)ether_ntoa((conststruct ether_addr *)LLADDR(sdl)));

            sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);

            sprintf(temp, "X:X:X:X:X:X",a,b,c,d,e,f);

            

            for (i=0; i<</span>MAXADDRS; ++i)

            {

                if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name, if_names[i]) == 0))

                {

                    if (hw_addrs[i] == NULL)

                    {

                        hw_addrs[i] = (char *)malloc(strlen(temp)+1);

                        strcpy(hw_addrs[i], temp);

                        break;

                    }

                }

            }

        }

        cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);

    }

    close(sockfd);

}


希望对你有帮助,不喜勿喷。

地址:http://blog.sina.com.cn/s/blog_b0b335e20102y3im.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取手机SSID和BSSID可以使用iOS的System Configuration框架中的Captive Network API,具体代码如下: ```swift import SystemConfiguration.CaptiveNetwork func getWifiInfo() -> (ssid: String?, bssid: String?) { var ssid: String? var bssid: String? if let interfaces = CNCopySupportedInterfaces() as NSArray? { for interface in interfaces { if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? { ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String bssid = interfaceInfo[kCNNetworkInfoKeyBSSID as String] as? String } } } return (ssid, bssid) } ``` 获取IP地址可以使用iOS的网络接口API,具体代码如下: ```swift import UIKit import SystemConfiguration func getIPAddress() -> String? { var address: String? var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil if getifaddrs(&ifaddr) == 0 { var ptr = ifaddr while ptr != nil { let flags = Int32(ptr!.pointee.ifa_flags) var addr = ptr!.pointee.ifa_addr.pointee if ((flags & (IFF_UP|IFF_RUNNING)) == (IFF_UP|IFF_RUNNING)) && (addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6)) { var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) if (getnameinfo(&addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count), nil, socklen_t(0), NI_NUMERICHOST) == 0) { if let addressString = String(validatingUTF8:hostname) { if addr.sa_family == UInt8(AF_INET) { address = addressString } } } } ptr = ptr!.pointee.ifa_next } freeifaddrs(ifaddr) } return address } ``` 注意,获取IP地址需要在应用的Info.plist文件中添加`Privacy - Local Network Usage Description`键,并在值中添加描述,否则应用将被拒绝。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值