1. 程式人生 > >iOS 如何獲取手機外網IP地址(附內網IP地址)

iOS 如何獲取手機外網IP地址(附內網IP地址)

查找了一些方法,最初以為拿到的就是手機對外的公網地址,其實只是本地IP地址。下面把獲取手機內外網IP地址的方法總結下:

一、獲取手機本地靜態IP地址:(區域網)

方法1:

首先匯入標頭檔案:

//IP地址需求庫
#import <sys/socket.h>
#import <sys/sockio.h>
#import <sys/ioctl.h>
#import <net/if.h>
#import <arpa/inet.h>
具體方法:
//獲取裝置IP地址
-(NSString *)getDeviceIPAddresses
{
    int sockfd = socket(AF_INET,SOCK_DGRAM, 0);
    // if (sockfd <</span> 0) return nil; //這句報錯,由於轉載的,不太懂,註釋掉無影響,懂的大神歡迎指導
    NSMutableArray *ips = [NSMutableArray array];

    int BUFFERSIZE =4096;
    
    struct ifconf ifc;
    
    char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
    
    struct ifreq *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 = (struct ifreq *)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 
[email protected]
""; for (int i=0; i < ips.count; i++){ if (ips.count >0){ deviceIP = [NSString stringWithFormat:@"%@",ips.lastObject]; } } return deviceIP; }

參考:http://blog.sina.com.cn/s/blog_b0b335e20102y3im.html

方法2:

匯入兩個標頭檔案,此法只能獲取到WiFi環境下的本地IP,比較簡潔

#import <ifaddrs.h>
#import <arpa/inet.h>
+ (NSString *)deviceIPAdress {
    NSString *address = @"手機行動網路";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    
    success = getifaddrs(&interfaces);
    if (success == 0) {
        temp_addr = interfaces;
        while (temp_addr != NULL) {
            if( (*temp_addr).ifa_addr->sa_family == AF_INET) {
                if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
            
            temp_addr = temp_addr->ifa_next;
        }
    }
    freeifaddrs(interfaces);
    
    //    NSLog(@"手機的IP是:%@", address);
    
    return address;
}

二、獲取手機外網IP(公網IP)

網上找了很久獲取外網IP的方法,很多訪問網址已經不能用了,能用的主要有2個,但是獲取到的IP地址不同,下面詳細介紹。

首推方法1:此方法採用的淘寶網址,獲取的到IP與百度IP是一樣的,考慮到如今百度橫行,所以我使用的是此方法。

-(NSString *)deviceWANIPAddress
{
    NSURL *ipURL = [NSURL URLWithString:@"http://ip.taobao.com/service/getIpInfo.php?ip=myip"];
    NSData *data = [NSData dataWithContentsOfURL:ipURL];
    NSDictionary *ipDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

    NSString *ipStr = nil;
    if (ipDic && [ipDic[@"code"] integerValue] == 0) { //獲取成功
        ipStr = ipDic[@"data"][@"ip"];
    }
    return (ipStr ? ipStr : @"");
}

訪問介面返回的json資料


百度ip查到的本機ip:



方法2:此方法訪問的搜狐的獲取ip介面,返回的IP與百度淘寶不一樣。(可能是此介面精確到了具體的區。。。)

-(NSString *)getWANIPAddress
{
    NSError *error;
    NSURL *ipURL = [NSURL URLWithString:@"http://pv.sohu.com/cityjson?ie=utf-8"];
    
    NSMutableString *ip = [NSMutableString stringWithContentsOfURL:ipURL encoding:NSUTF8StringEncoding error:&error];
    //判斷返回字串是否為所需資料
    if ([ip hasPrefix:@"var returnCitySN = "]) {
        //對字串進行處理,然後進行json解析
        //刪除字串多餘字串
        NSRange range = NSMakeRange(0, 19);
        [ip deleteCharactersInRange:range];
        NSString * nowIp =[ip substringToIndex:ip.length-1];
        //將字串轉換成二進位制進行Json解析
        NSData * data = [nowIp dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"%@",dict);
        return dict[@"cip"] ? dict[@"cip"] : @"";
    }
    return @"";
}

訪問介面取到的資料:


參考:http://blog.csdn.net/henry_moneybag/article/details/51463375

還有一個介面可直接獲取到IP,但返回比較慢,可能返回失敗,不推薦。

    NSError *error;
    NSURL *ipURL = [NSURL URLWithString:@"http://ifconfig.me/ip"];
    NSString *ip = [NSString stringWithContentsOfURL:ipURL encoding:NSUTF8StringEncoding error:&error];


相關推薦

iOS 如何獲取機外IP地址IP地址

查找了一些方法,最初以為拿到的就是手機對外的公網地址,其實只是本地IP地址。下面把獲取手機內外網IP地址的方法總結下: 一、獲取手機本地靜態IP地址:(區域網) 方法1: 首先匯入標頭檔案: //IP地址需求庫 #import <sys/socket.h> #

獲取當前訪問客戶端的真實IP地址地址

在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。如果使用了反向代理軟體,用request.getRemoteAd

pdf expert for windows_啟用碼_百度盤_盤下載安卓使用教程

PDF Expert啟用碼是一款輕巧易用的PDF閱讀、編輯、轉換工具,使用者可以輕鬆對PDF文件進行編輯、百度盤_網盤下載(附安卓使用教程)閱讀、批註,合併等功能。 PDF Expert for mac 中文 破解版點選下載 PDF Expert for mac 中文 序列號點選下載 快速、輕巧、易用的

國內常用的Android映象下載地址教育網主要映象站

Android developer 最新國內映象:http://wear.techbrood.com 中科院開源軟體協會:www.opencas.org 網易開源映象站:http://mirrors.163.com/ 搜狐開源映象站:http://mirrors.soh

Java獲取訪問使用者的客戶端IP地址適用於公網與區域網

  /** * 獲取Ip地址,多級反向代理 * @param request * @return */ public static String getIpaddr(HttpServletRequest request){ String ipAddress = request.ge

Shell獲取絡卡Mac地址grep、正則表示式

#!/bin/bash #brief attain the Mac addr of netcard eth0. #author lee #time 18.08.10 macaddr=`sudo

如何獲取sqlserver 序列下一個值本文在絡上找的

art 直接 for esc seq io操作 rom upload 最小值 使用SQL創建序列對象: IF EXISTS(SELECT * FROM sys.sequences WHERE name = N‘TestSeq‘) DRO

修改RAC 的IP地址 不包含private IP地址

環境 RDBMS 11.2.0.4  修改RAC 的IP地址,包括public、VIP 、SCAN 等IP。不包含private IP 。 步驟  1 關閉庫,監聽,CRS等 2 修改/etc/hosts 3 OS層面修改IP 4 啟動CRS  5

Linux Centos7.5 檢視IP地址 最小化系統安裝

ps:        Linux Centos7.5 最小化系統預設是把網絡卡給沒開啟,所以檢視不了ip地址。而且無法使用ifconfig命令,會提示命令找不到。  1、進入網絡卡的配置檔案,進行修改。 首先

Linux設定IP地址動態分配 靜態IP

一、背景 公司有一臺Linux虛擬機器,已經安裝好了部署環境(Tomcat,MySQL之類的),為了做測試,將虛擬機器拷貝到本地之後,發現IP地址不能訪問。所以要重新設定IP。 環境:VMware Workstation 12 Pro + 虛擬機器(Red

iOS獲取裝置全域性資訊方法總結如訊號,電量,裝置標示

iOS獲取裝置全域性資訊方法總結 為系統建立一個隨機的標示符 (NSString*) createUUID { NSString *id = [[NSUserDefaults standardUserDefaults] objectFor

獲得本機ipv4和ipv6地址即有線絡卡地址

程式原始碼如下: 1. 形參ipv4, ipv6為外部呼叫者傳入,用來儲存ipv4地址和ipv6地址, 2. MAX_PATH為自定義巨集, 為數值260, IPVN_SIZE為數值50, DEFAULT_STR_PORT為字串"8080" 3. 需在標頭檔案中包含以下內容

Linux Centos7.5 檢視IP地址 最小化系統安裝

ps:        Linux Centos7.5 最小化系統預設是把網絡卡給沒開啟,所以檢視不了ip地址。而且無法使用ifconfig命令,會提示命令找不到。  1、進入網絡卡的配置檔案,進

IP地址分類及IP

私有 IP A類: 10.0.0.1-10.255.255.254 B類: 172.16.0.1-172.31.255.254

APP端的絡優化DNS優化,HTTP優化

分開 也會 並且 頭像 尺寸 proto googl 運營 簡單 一、使用httpDNS優化DNS解析和緩存   一般來說在App內用域名發送請求都要經過DNS解析出ip,然後再根據ip去拿對應的資源,這個過程中,如果LocalDNS中存在這個域名對應的ip,就會直接返回這

華為pat地址轉換,以及web服務器發布

cipher res 網關 title 設備 itl 其實在 1.0 ip地址 實驗名稱:華為pat地址轉換,以及內網web服務器發布實驗拓撲圖: 3. 實驗目的 : 1.使內網通過pat轉化出去上外網 2

國內互聯網可用時間服務器地址NTP時間服務器地址

NTP 時間服務器 老男孩教育 老男孩老師在教學培訓過程中經常發現曾經的時間服務器地址不可用了,很是尷尬,特找到了國內比較穩定的時間服務器地址,和博友分享如下:ntp1.aliyun.com ntp2.aliyun.com ntp3.aliyun.com ntp4.aliyun.com ntp5

python—絡爬蟲Requests庫主要方法解析

代理 coo put color 服務器 爬蟲 ont s參數 協議 Requests庫主要方法解析requests.request() 構造一個請求,支撐以下各方法的基礎方法 requests.request(method, url, **kwargs)method: 請

利用微軟RD Client APP遠程連接PC連接方法

屬性 ref 安裝 下載 -c 一個 土豪 允許 win 一、下載RD Client 這個就不用多說了。。。 二、設置PC允許遠程桌面連接 PC系統以win10為例: 1、進入“遠程設置”允許遠程協助與遠程桌面連接 桌面右鍵單擊“此電腦”,屬性,單擊左邊“遠程設置”,按照下

[iOS]iOS8可用的識別使用者方式IDFA、UUID、IDFV

本文地址:http://blog.csdn.net/zhaoyabei/article/details/46682765 轉載註明出處 想要追蹤、統計使用者,自然離不開使用者唯一識別符號,這是每個公司都面臨的問題。在歷史上唯一識別符號很多,如UDID、MAC