iOS獲取設備IP

獲取iOS設備IP ?wifi和流量環境下 ? 在網上找的比較好的獲取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"



#pragma mark---------getipadress

+ (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";

}

+ (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;

}

使用的時候直接調用 ?: [self?getIPAddress:YES];就行了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458542.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458542.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458542.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一些不錯的網站

http://www.huxiu.com/虎嗅網&#xff0c;一個關注最新創業信息的網站http://36kr.com/創業天花板https://www.zhihu.com/與世界分享你的經驗http://www.mafengwo.cn/世界那么大&#xff0c;想去哪就去那http://www.mt-bbs.com/找到屬于自己的設計本http://www.guokr.com/科技有…

[原]詳解如何將cocos2dx項目編譯到Android平臺上的(方式一:Cywin+NDK)

鏈接地址&#xff1a;http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8閱讀578 評論0 前言&#xff1a;cocos2dx作為一個開源的移動2D游戲框架&#xff0c;其跨平臺的特性讓它備受開發公司的歡迎。這里我就不做概念性的解釋了&#xff0c;通過這篇文章你就會了解…

互斥鎖和讀寫鎖的區別

原文地址&#xff1a;http://blog.csdn.NET/u012884354/article/details/46691761 相交進程之間的關系主要有兩種&#xff0c;同步與互斥。 所謂互斥&#xff0c;是指散布在不同進程之間的若干程序片斷&#xff0c;當某個進程運行其中一個程序片段時&#xff0c;其它進程就不能…

JSP EL表達式使用

為什么80%的碼農都做不了架構師&#xff1f;>>> ##1.EL全名為Expression Language out.print(str) <%str%> ${str}例子&#xff1a; Hi! <%username%> 和 Hi! ${username}是一樣的 只要是支持servlet2.4/jsp2.0的Container就都可以在jsp網頁中直接使用e…

eclipse 中 Android sdk 無法更新的問題

誒&#xff0c;真是麻煩&#xff0c;想下個東西都下不了。我也好久沒折騰過這個了&#xff0c;在家的電腦是早就下載好了的&#xff0c;然后如今又須要下載一份。下不到。網上搜到了資料&#xff0c;記錄下來&#xff1a; 第一種方法:sdk manager - tools - option 選擇強制 xx…

iOS10 xcode8 分頁請求MJRefresh崩潰問題

MJRefresh出現崩潰現象 解決辦法&#xff1a;類庫增加判斷 if (range.location ! NSNotFound) { language [language substringToIndex:range.location]; }

網絡編程學習筆記一:Socket編程

from: http://blog.csdn.net/gneveek/article/details/8699198 “一切皆Socket&#xff01;” 話雖些許夸張&#xff0c;但是事實也是&#xff0c;現在的網絡編程幾乎都是用的socket。 ——有感于實際編程和開源項目研究。 我們深諳信息交流的價值&#xff0c;那網絡中進程之間…

JavaScript原生對象常用方法總結

這是4年前學習JavaScript基礎的學習筆記&#xff0c;當初是照著W3School教程學習的&#xff0c;4年恍然如云煙&#xff0c;仿佛還在昨天。現發布與此&#xff0c;留作紀念&#xff0c;紀念那段不悔的青蔥歲月。下面都是我學習W3C School教程中有關JavaScript寫的學習筆記&#…

[delphi]修改indy源碼后重新編譯

http://blog.csdn.net/nerdy/article/details/8702568 雖然indy有一身的毛病&#xff0c;但是一般情況下使用起來還是多方便的。 今天在做一個使用到indy的程序的時候&#xff0c;發現無論你怎么修改idhttp.request.accept-encoding&#xff0c;他都會在其后添加一個值 identit…

xcode8 崩潰問題

【1】、Xcode8代碼出現ubsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0 2016-09-14 17:18:…

前端工具--less篇

前端工具–less篇 less 中文網http://www.bootcss.com/p/lesscss/ 常見錯誤及解決&#xff1a; sublime text 3 安裝less2css保存less出現錯誤 未安裝這個 npm install -g less-plugin-clean-css 未安裝這個 npm install less -gd less語法 LESS 做為 CSS 的一種形式的擴展&a…

從static變量導出問題解析 __declspec(dllexport) 和 __declspec(dllimport)的作用

這段時間要把tinyxml從靜態庫弄成動態庫&#xff0c;要用到__declspec(dllexport)和__declspec(dllimport)來導出dll和lib文件。終于弄明白了export和import的作用&#xff0c;下面從使用的角度來說明一下他們的功能。 首先要知道&#xff0c;頭文件是C的接口文件&#xff0c;不…

4月26日作業

2016年4月26日作業 一、項目整體績效評估1、*三E審計是什么的合稱&#xff1f;&#xff08;記&#xff09; 答&#xff1a;經濟審計&#xff0c;效率審計和效果審計2、霍爾三維結構是從哪三個方面考察系統工程的工作過程的&#xff1f; 答&#xff1a;邏輯&#xff0c;時間和知…

xcode8 快捷鍵失效

因為蘋果解決xcode ghost,把插件屏蔽了。 解決方法: 命令運行&#xff1a; sudo /usr/libexec/xpccachectl 然后必須重啟電腦后生效

CAS單點登錄配置[3]:服務器端配置

在準備工作&#xff0c;證書生成等工作完成后&#xff0c;本篇介紹服務器端的配置。 JDK配置 1我們將生成的cacerts文件分別拷貝到JDK目錄下的jre/lib/security目錄下及JRE對應的目錄中&#xff0c;如果之前存在此文件&#xff0c;請替換&#xff1b; ENDTomcat配置 1Step 1:將…

DLL動態鏈接庫的工作原理

"動態鏈接"這幾字指明了DLLs是如何工作的。 對于常規的函數庫&#xff0c;鏈接器從中拷貝它需要的所有庫函數&#xff0c;并把確切的函數地址傳送給調用這些函數的程序。 而對于DLLs&#xff0c;函數儲存在一個獨立的動態鏈接庫文件中。在創建Windows程序時&#xff…

remind程序

2019獨角獸企業重金招聘Python工程師標準>>> 用了兩個定時器。一個控制刷新時間&#xff0c;一個控制響鈴。 定時器響應函數Timer: int wk; if(nIDEvent1) { CTime tCTime::GetCurrentTime(); wkt.GetDayOfWeek()-1; m_mnt.Format("%Y 年 …

查看手機是否安裝微信客戶端

if (![[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:"weixin://"]] ) {[wcatBtn setHidden:YES];}

Caffe學習系列(7):solver及其配置

solver算是caffe的核心的核心&#xff0c;它協調著整個模型的運作。caffe程序運行必帶的一個參數就是solver配置文件。運行代碼一般為 # caffe train --solver*_slover.prototxt 在Deep Learning中&#xff0c;往往loss function是非凸的&#xff0c;沒有解析解&#xff0c;我們…

Qt DLL總結-創建及調用QT的 DLL

目錄 Qt DLL總結【一】-鏈接庫預備知識 Qt DLL總結【二】-創建及調用QT的 DLL Qt DLL總結【三】-VS2008Qt 使用QPluginLoader訪問DLL 開發環境&#xff1a;VS2008Qt4.7.4 最近看了不少Qt的DLL例子&#xff0c;總結一下如何創建和調用QT 動態鏈接庫。 先講一下對QT動態鏈接庫的…