判断手机的的IP在不在中国
开源库:
LCCChinaIP
pod 'LCCChinaIP'
1. 获取IP地址
获取IP地址见:看这里
- 应为本地地址可能为局域网的地址,所以还得处理一下
/// 获取本地IP 地址,可能是局域网的地址@objc public static func getIphoneIpAddress() -> String{var addresses = [String]()var ifaddr : UnsafeMutablePointer<ifaddrs>? = nilif getifaddrs(&ifaddr) == 0 {var ptr = ifaddrwhile (ptr != nil) {let flags = Int32(ptr!.pointee.ifa_flags)var addr = ptr!.pointee.ifa_addr.pointeeif (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {if 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 address = String(validatingUTF8:hostname) {addresses.append(address)}}}}ptr = ptr!.pointee.ifa_next}freeifaddrs(ifaddr)}return addresses.first ?? "0.0.0.0"}
/// 获取手机的网络的Ip 地址@objc public static func getNetIpAddress() -> String {let url = URL(string: "https://ifconfig.me/ip")let ip = try? String(contentsOf: url!, encoding: .utf8)return ip ?? "0.0.0.0"}/// 获取ip 地址@objc public static func getIPAddress() -> String {let phoneIpAddress = getIphoneIpAddress()if phoneIpAddress.hasPrefix("10.")|| phoneIpAddress.hasPrefix("172.")|| phoneIpAddress.hasPrefix("192.168") {return getNetIpAddress()}else {return phoneIpAddress}}
1.加载中国地址列表
转换IP地址为Int64或者longlong
- 首先,我们需要思考一个地址是不是在给定的地址范围内,怎么处理?比如 192.0.0.23 在192.0.0.0~192.0.0.255 范围内?
- 其实ip 地址就是 256 进制的数字,我们只要转化为longlong 类型就可处理了
192.0.0.23
->3221225495
192.0.0.0
->3221225472
192.0.0.255
->3221225727
- 现在就只需要比较两个数字的大小就简单多了
/// 将ip 地址转换为Int 类型 @objc public static func covertIPToInt64(ip:String) -> Int64 {// 去空格let ipStr = ip.replacingOccurrences(of: " ", with: "")if ipStr.count == 0 {return 0}let splitArr = ipStr.split(separator: ".")var result: Int64 = 0for (idx,subIp) in splitArr.enumerated() {let num : Int64 = Int64(subIp) ?? 0let scale = pow(Double(256), Double(3-idx))result = result + num * Int64(scale)}return result }
- 其实ip 地址就是 256 进制的数字,我们只要转化为longlong 类型就可处理了
遍历查找
- 接下来是考虑怎么在给到的地址范围一一对比的问题,给到地址范围共有8000多个,要是一个一个比较,显然是不合理的,所有我们得小小的处理一下
- 我们可以去ip 地址的第一段作为
KEY
建立一个map,这样就可以做一个简单的分类索引,是不是会快很多呢?存储结构如下
{"192":[{"from":"192.0.0.0""fromV":"3221225472""to":"192.0.0.255""toV":"3221225727"},...],.....}
- 处理以后,大部分ip段都只有几十个了,只需要稍微便利一下就好
Demo地址
判断手机的的IP在不在中国相关推荐
- Android高手进阶教程(十一)之----Android 通用获取Ip的方法(判断手机是否联网的方法)!
大家好,我们这一节讲一下,Android获取Ip的一些方法,在我们开发中,有判断手机是否联网,或者想获得当前手机的Ip地址,当然WIFI连接的和 我们3G卡的Ip地址当然是不一样的. 首先我尝试了如下 ...
- django项目内部的views层判断手机访问还是电脑访问
在做网站时,一般都会通过打包html来制作两个界面,一个提供给电脑端,一个提供给手机端,避免因为兼容性差的问题,界面会变得很丑.当然,如果能保证纯bootstrap开发html界面,则不需要考虑这个问 ...
- Android 手机上获取手机当前上网IP地址(手机网关给手机号分配的IP)
Android 手机上获取手机当前上网IP地址 (手机网关给手机号分配的IP) 每个手机上网通过移动网关的时候,网关都会给该手机号分配一个IP地址(当然这个IP地址会在下线上线后会改变,网关都有记录的 ...
- 判断手机是否弹出键盘,改变了手机页面高度,对应inputStatus的状态改变相关控件的大小和位置
inputResizeBodyHeight() {// 判断手机是否弹出键盘,改变了手机页面高度,对应inputStatus的状态改变相关控件的大小和位置var oldHeight =document ...
- js判断手机浏览器屏幕方向
/* js判断手机浏览器屏幕方向*/var direction = {__getOrientation: function () {if (window.orientation == 0 || win ...
- php判断字符串是否为IP,php 判断IP为有效IP地址的方法
多数人看到这篇日志,第一印象肯定是以为是要讲如何通过正则表达式来判断. 非也,在php5.2.0之后,有专门的函数来做这个判断了. 判断是否是合法IP if(filter_var($ip, FILTE ...
- JS判断是否是微信页面,判断手机操作系统(ios或android)并跳转到不同下载页面...
JS判断客户端是否是iOS或者Android 参考:http://caibaojian.com/browser-ios-or-android.html 1 function is_weixin() { ...
- android 动态录音权限,Android如何判断手机是否有录音权限的工具类
作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android ...
- 判断手机所属三大运营商 移动、联通、电信
中国移动服务网号 "134", "135", "136", "137", "138", " ...
最新文章
- 10.python网络编程(解决粘包问题 part 2)
- STC单片机功率控制下载板
- C# WinForm开发系列 - DataGrid
- JavaWeb第五讲 Web核心基础之HTTP协议
- java string转jsonobject_超赞!终于有网友用Java实现了第三方qq账号登录
- MVC3.0图片滚动和相册展示(下)
- php多个逻辑如何分为多个逻辑块,php 项目如何分层
- 将Java EE单体应用打造成微服务
- dns服务与配置管理,一机多站
- php中正则表达式中的特殊符号
- java 留言板_java web实现简单留言板功能
- 五分钟上手ECharts教程
- leetcode33. 搜索旋转排序数组
- 3D建模zbrush笔刷分享
- 交换机/路由器实验:最后说些什么
- 数字信号处理的学习资源
- Vue 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)详解
- Android7.0分屏功能
- vue前端下载excel文件
- 数字孪生智慧水务建设综述