ios 获取外网ip

今天在网上找了一个获取外网地址的方法无奈,Data的initcontentsOfURL一直不好使,然后查询了一些资料得到了一个能使用的方法。下面贴代码。

/// 获取外网ip

///

/// - Returns: 外网ip

func getIpinfo() ->String?

{

/** 这是ip查询网址 */

let urlStr = "http://ip.taobao.com/service/getIpInfo.php?ip=myip"

/** 编码为下面转换数据做准备 */

let strEncoding = urlStr.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)

if strEncoding != nil {

do{

let data = try Data.init(contentsOf: URL.init(string: strEncoding!)!)

do

{

/** 解析data */

if let resultDic = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? [String:Any]

{

/** 打印结果 这边数据比较多类似以下数据 */

/** {

code = 0;

data =    {

area = "\U534e\U4e1c";

"area_id" = 300000;

city = "\U4e0a\U6d77\U5e02";

"city_id" = 310100;

country = "\U4e2d\U56fd";

"country_id" = CN;

county = "";

"county_id" = "-1";

ip = "139.226.164.200";

isp = "\U8054\U901a";

"isp_id" = 100026;

region = "\U4e0a\U6d77\U5e02";

"region_id" = 310000;

};

} */

print(resultDic)

/** 用guard逻辑稍微清晰点  */

guard let resultCode = resultDic["code"] as? Int  else

{

print("data error")

return nil;

}

guard resultCode == 0 else

{

print("code error")

return nil

}

guard let dataDic = resultDic["data"] as? [String:Any] else

{

print("dic info error")

return nil;

}

guard let ip = dataDic["ip"] as? String else

{

print("ip error")

return nil;

}

/** 得到最终结果 */

return ip

}

}

catch

{

print(error.localizedDescription)

}

}

catch

{

print(error.localizedDescription)

}

}

return nil

}

比较喜欢swift的机制把不确定因素在代码界面排除支持swift

忘了补充下 记得在info.plist文件中加http传输协议许可

<think>好的,我现在需要回答用户的问题:“如何在移动应用中获取设备的网络IP地址”。首先,我得理解用户的需求,他们可能是在开发移动应用时需要获取设备的IP地址用于日志记录、地理位置服务或网络诊断等用途。接下来,我需要结合提供的引用内容,特别是引用4和引用5,因为它们提到了获取IP和MAC地址的方法。 根据引用4,里面提到了通过代码获取客户端IP地址和MAC地址的方法。例如,Java中使用NetworkInterface类来获取网络接口信息。不过移动应用可能使用的是不同的编程语言,比如Android用Java/Kotlin,iOS用Swift/Objective-C。所以需要分别考虑这两个平台的方法。 引用3提到移动设备的IP地址频繁变化,主要是因为动态IP分配和网络切换。因此,在应用中获取IP地址时需要注意其动态性,可能需要实时获取而不是缓存。 引用5提到了Windows系统中开启热点时的IP配置问题,虽然不直接相关,但说明网络共享和IP分配可能影响获取IP的方式,不过这可能更多是系统层面的设置,移动应用开发者可能需要处理不同网络环境下的IP获取。 接下来,我需要整理Android和iOS平台上获取IP地址的具体方法。对于Android,通常可以通过NetworkInterface类遍历网络接口,找到非回环地址IPv4地址。对于iOS,由于权限限制,可能需要使用NSHost或通过连接信息来获取。同时,要注意在真实设备上测试,因为模拟器可能返回不同的结果。 还需要考虑网络权限的问题,比如Android应用是否需要INTERNET权限,或者iOS是否需要配置特定的权限。此外,移动网络和Wi-Fi的IP地址获取方式可能不同,可能需要分别处理。 另外,用户可能关心的是如何确保获取IP地址是当前有效的,特别是在网络切换时。可能需要监听网络状态变化,并在连接变更时重新获取IP地址。 最后,需要验证这些方法的正确性,确保代码示例准确,并提醒用户注意事项,比如动态IP、权限问题、不同网络环境的影响等。</think>### 如何在移动应用中获取设备的网络IP地址 #### 1. **基本原理** 移动设备的网络IP地址由网络服务提供商(如蜂窝网络或Wi-Fi路由器)动态分配[^3]。获取IP地址的核心是通过操作系统的网络接口信息查询功能实现。不同平台(Android/iOS)的API和权限要求略有差异。 --- #### 2. **具体实现方法** ##### **Android平台** - **步骤1:添加网络权限** 在`AndroidManifest.xml`中声明权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` - **步骤2:遍历网络接口获取IP** 使用`NetworkInterface`类过滤非回环地址: ```java public String getLocalIpAddress() { try { for (NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces())) { for (InetAddress addr : Collections.list(intf.getInetAddresses())) { if (!addr.isLoopbackAddress() && addr instanceof Inet4Address) { return addr.getHostAddress(); } } } } catch (Exception e) { e.printStackTrace(); } return null; } ``` > 此代码会返回当前活跃网络(如Wi-Fi或移动数据)的IPv4地址。 ##### **iOS平台** - **方法1:通过NSHost获取**(需兼容性处理) ```swift func getIPAddress() -> String? { var address: String? var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil if getifaddrs(&ifaddr) == 0 { var ptr = ifaddr while ptr != nil { defer { ptr = ptr?.pointee.ifa_next } let interface = ptr?.pointee let addrFamily = interface?.ifa_addr.pointee.sa_family if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) { let name = String(cString: (interface?.ifa_name)!) if name == "en0" || name == "pdp_ip0" { // Wi-Fi或蜂窝网络接口 var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) getnameinfo(interface?.ifa_addr, socklen_t((interface?.ifa_addr.pointee.sa_len)!), &hostname, socklen_t(hostname.count), nil, socklen_t(0), NI_NUMERICHOST) address = String(cString: hostname) } } } freeifaddrs(ifaddr) } return address } ``` - **方法2:通过URLSession获取外部IP**(需网络请求) ```swift func fetchExternalIP() { guard let url = URL(string: "https://api.ipify.org") else { return } let task = URLSession.shared.dataTask(with: url) { data, _, _ in if let data = data, let ip = String(data: data, encoding: .utf8) { print("External IP: \(ip)") } } task.resume() } ``` --- #### 3. **注意事项** 1. **动态IP问题**:移动设备的IP可能因网络切换(如Wi-Fi到4G)而频繁变化,需实时监听网络状态[^3]。 2. **权限限制**: - Android 10+限制对`MAC地址`的访问[^4]。 - iOS应用需在`Info.plist`中声明网络权限。 3. **内外网IP差异**: - 内网IP(如`192.168.x.x`)适用于本地通信。 - 外网IP需通过第三方API(如`ipify`)获取,但可能受服务稳定性影响。 --- #### 4. **应用场景** - 用户行为分析:记录IP辅助地理定位。 - 网络诊断:检测当前网络环境。 - 安全风控:识别异常登录行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值