开源库:

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
    }
    

遍历查找

  • 接下来是考虑怎么在给到的地址范围一一对比的问题,给到地址范围共有8000多个,要是一个一个比较,显然是不合理的,所有我们得小小的处理一下
  • 我们可以去ip 地址的第一段作为KEY 建立一个map,这样就可以做一个简单的分类索引,是不是会快很多呢?存储结构如下
{"192":[{"from":"192.0.0.0""fromV":"3221225472""to":"192.0.0.255""toV":"3221225727"},...],.....}
  • 处理以后,大部分ip段都只有几十个了,只需要稍微便利一下就好

Demo地址

判断手机的的IP在不在中国相关推荐

  1. Android高手进阶教程(十一)之----Android 通用获取Ip的方法(判断手机是否联网的方法)!

    大家好,我们这一节讲一下,Android获取Ip的一些方法,在我们开发中,有判断手机是否联网,或者想获得当前手机的Ip地址,当然WIFI连接的和 我们3G卡的Ip地址当然是不一样的. 首先我尝试了如下 ...

  2. django项目内部的views层判断手机访问还是电脑访问

    在做网站时,一般都会通过打包html来制作两个界面,一个提供给电脑端,一个提供给手机端,避免因为兼容性差的问题,界面会变得很丑.当然,如果能保证纯bootstrap开发html界面,则不需要考虑这个问 ...

  3. Android 手机上获取手机当前上网IP地址(手机网关给手机号分配的IP)

    Android 手机上获取手机当前上网IP地址 (手机网关给手机号分配的IP) 每个手机上网通过移动网关的时候,网关都会给该手机号分配一个IP地址(当然这个IP地址会在下线上线后会改变,网关都有记录的 ...

  4. 判断手机是否弹出键盘,改变了手机页面高度,对应inputStatus的状态改变相关控件的大小和位置

    inputResizeBodyHeight() {// 判断手机是否弹出键盘,改变了手机页面高度,对应inputStatus的状态改变相关控件的大小和位置var oldHeight =document ...

  5. js判断手机浏览器屏幕方向

    /* js判断手机浏览器屏幕方向*/var direction = {__getOrientation: function () {if (window.orientation == 0 || win ...

  6. php判断字符串是否为IP,php 判断IP为有效IP地址的方法

    多数人看到这篇日志,第一印象肯定是以为是要讲如何通过正则表达式来判断. 非也,在php5.2.0之后,有专门的函数来做这个判断了. 判断是否是合法IP if(filter_var($ip, FILTE ...

  7. JS判断是否是微信页面,判断手机操作系统(ios或android)并跳转到不同下载页面...

    JS判断客户端是否是iOS或者Android 参考:http://caibaojian.com/browser-ios-or-android.html 1 function is_weixin() { ...

  8. android 动态录音权限,Android如何判断手机是否有录音权限的工具类

    作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android ...

  9. 判断手机所属三大运营商 移动、联通、电信

    中国移动服务网号 "134", "135", "136", "137", "138", " ...

最新文章

  1. 10.python网络编程(解决粘包问题 part 2)
  2. STC单片机功率控制下载板
  3. C# WinForm开发系列 - DataGrid
  4. JavaWeb第五讲 Web核心基础之HTTP协议
  5. java string转jsonobject_超赞!终于有网友用Java实现了第三方qq账号登录
  6. MVC3.0图片滚动和相册展示(下)
  7. php多个逻辑如何分为多个逻辑块,php 项目如何分层
  8. 将Java EE单体应用打造成微服务
  9. dns服务与配置管理,一机多站
  10. php中正则表达式中的特殊符号
  11. java 留言板_java web实现简单留言板功能
  12. 五分钟上手ECharts教程
  13. leetcode33. 搜索旋转排序数组
  14. 3D建模zbrush笔刷分享
  15. 交换机/路由器实验:最后说些什么
  16. 数字信号处理的学习资源
  17. Vue 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)详解
  18. Android7.0分屏功能
  19. vue前端下载excel文件
  20. 数字孪生智慧水务建设综述

热门文章

  1. Linux九阴真经之九阴白骨爪残卷4(cobbler)
  2. TopoDOT | 不是TopDOT !
  3. C++规范的整理---王海波
  4. Cisco路由器配置OSPF
  5. 利用路由器连接校园网同时解决一次限制单个设备登录问题
  6. 电容笔有什么用?电容笔10大品牌排行榜
  7. 摄像头水平视野垂直视野?_如何在“动物穿越:新视野”中定时旅行
  8. python selenium 等待元素出现_Selenium 3种等待方式
  9. 显示等待与隐式等待的用法
  10. 数据分析---网站日志流分析