Flutter for OpenHarmony:dart_ipify 一行代码获取公网 IP 地址,不再自己维护接口(IP 查询服务) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:dart_ipify 一行代码获取公网 IP 地址,不再自己维护接口(IP 查询服务) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

前言

在做 P2P 应用、日志记录或地域限制功能时,经常需要知道用户的真实公网 IP。虽然可以自己写个后端 API 返回 request.ip,或者爬取 icanhazip.com,但这些方法要么麻烦,要么不稳定。

dart_ipify 封装了著名的 ipify.org 公共 API,它不仅提供 IPv4/IPv6 查询,还能返回 ISP(运营商)和地理位置信息(需 API Key)。最重要的是,它极其简单稳定,永久免费(基础查询)。

一、概念介绍/原理解析

1.1 基础概念

  • Public IP: 路由器在互联网上的唯一出口地址(区别于 192.168.x.x 内网 IP)。
  • Geolocation: 根据 IP 反查地理位置(国家、城市、经纬度)。
  • Ipify: 一个高性能的 IP 地址 API 服务,基于 AWS Lambda 构建,无请求限制。

HTTP 请求 (GET)

返回 IP (如 1.2.3.4)

渲染 UI

Flutter 应用

Ipify 服务

显示公网 IP

1.2 进阶概念

它支持 HTTPS 加密传输,确保 IP 信息不被中间人篡改。同时也提供了对 geo-ipify 的支持,适合需要精确位置的场景。

二、核心 API/组件详解

2.1 依赖安装

dependencies:dart_ipify: ^1.0.0 

2.2 基础用法

获取纯文本 IP 地址(免费,无 Key)。

import'package:dart_ipify/dart_ipify.dart';voidmain()async{// 1.IPv4final ipv4 =awaitIpify.ipv4();print(ipv4);// "98.207.254.136"// 2. IPv6 (如果网络支持)// final ipv6 = await Ipify.ipv64(); }

2.3 地理位置查询

注册 获取 API Key。

final geo =awaitIpify.geo('YOUR_API_KEY');print(geo.location.city);// "Mountain View"print(geo.isp);// "Google LLC"
在这里插入图片描述

三、常见应用场景

3.1 场景 1:自动切换服务器区域

根据用户 IP 所在的国家(如 US, CN),自动选择最近的 CDN 节点或游戏服务器。

final location =awaitIpify.geo(key);if(location.location.country =='CN'){Config.setBaseUrl('https://cn.api.com');}else{Config.setBaseUrl('https://us.api.com');}
在这里插入图片描述

3.2 场景 2:安全风控

检测用户是否频繁更换 IP,或者处于异常地理位置(如账号常在上海,突然在尼日利亚登录)。

if(lastIp != currentIp &&distance(lastLoc, currentLoc)>1000km){triggerSecurityCheck();}
在这里插入图片描述

3.3 场景 3:调试工具

在 App 的“关于”或“调试模式”页面,显示当前网络出口 IP,方便测试人员排查问题。

ListTile( title:Text('Public IP'), subtitle:FutureBuilder( future:Ipify.ipv4(), builder:(ctx, snap)=>Text(snap.data ??'Loading...'),),);
在这里插入图片描述

四、OpenHarmony 平台适配

4.1 网络权限

查询 IP 需要访问互联网,务必在 config.json / module.json5 中声明 ohos.permission.INTERNET

4.2 稳定性

Ipify 服务在海外,国内访问速度偶尔波动。建议在 OpenHarmony 侧做一层超时处理(Timeout)或增加重试机制,避免阻塞主流程。

五、完整示例代码

本示例展示在鸿蒙设备上查询本机公网 IP 及地理位置信息。

import'package:flutter/material.dart';import'package:dart_ipify/dart_ipify.dart';voidmain(){runApp(constMaterialApp(home:IpPage()));}classIpPageextendsStatefulWidget{constIpPage({super.key});@overrideState<IpPage>createState()=>_IpPageState();}class _IpPageState extendsState<IpPage>{String _ip ='';String _location =''; bool _loading =false;Future<void>_fetchIp()async{setState((){ _loading =true; _ip =''; _location ='';});try{// 1. 获取 IP (免费)final ip =awaitIpify.ipv4(); _ip = ip;// 2. 获取地理位置 (需要 Key,这里演示用)// 如果没有 Key,可以跳过此步骤// final geo = await Ipify.geo('YOUR_API_KEY');// _location = '${geo.location.city}, ${geo.location.country}'; _location ='需要 API Key 才能显示详细位置';}catch(e){ _ip ='查询失败';print(e);}finally{if(mounted)setState(()=> _loading =false);}}@overrideWidgetbuild(BuildContext context){returnScaffold( appBar:AppBar(title:constText('我的 IP 地址')), body:Center( child:Column( mainAxisAlignment:MainAxisAlignment.center, children:[if(_loading)constCircularProgressIndicator(),if(!_loading)...[constText('Public IPv4', style:TextStyle(color:Colors.grey)),Text( _ip.isEmpty ?'点击按钮查询': _ip, style:constTextStyle(fontSize:32, fontWeight:FontWeight.bold, color:Colors.blue),),constSizedBox(height:10),constText('Location', style:TextStyle(color:Colors.grey)),Text(_location, style:constTextStyle(fontSize:16)),],constSizedBox(height:40),ElevatedButton.icon( onPressed: _fetchIp, icon:constIcon(Icons.refresh), label:constText('查询'),),],),),);}}

六、总结

dart_ipify 解决了“我是谁,我在哪”的问题。虽然功能单一,但在特定场景下(如检测代理、区域限制)极其好用。

最佳实践

  1. 缓存:IP 地址通常不会频繁变动(除非重启路由器或切换网络),获取一次后应缓存在内存或本地,避免每次打开 App 都请求。
  2. Privacy:注意隐私合规,未经用户同意,不要滥用位置信息用于追踪。

Read more

使用Docker安装Ollama及Open-WebUI完整教程

作者:吴业亮 博客:wuyeliang.blog.ZEEKLOG.net 一、Ollama 简介及工作原理 1. Ollama 简介及原理 * 简介:Ollama 是一款轻量级、开源的大语言模型(LLM)运行工具,旨在简化本地部署和运行大语言模型的流程。它支持 Llama 3、Mistral、Gemini 等主流开源模型,用户无需复杂配置即可在本地设备(CPU 或 GPU)上快速启动模型,适用于开发测试、本地智能应用搭建等场景。 * 工作原理: * 采用模型封装机制,将大语言模型的运行环境、依赖库及推理逻辑打包为标准化格式,实现模型的一键下载、启动和版本管理。 * 通过优化的推理引擎适配硬件架构,支持 CPU 基础运行和 GPU 加速(如 NVIDIA CUDA),减少资源占用并提升响应速度。 * 提供简洁的

By Ne0inhk
基于C++11手撸前端Promise

基于C++11手撸前端Promise

文章导航 * 引言 * 前端Promise的应用与优势 * 常见应用场景 * 并发请求 * Promise 解决的问题 * 手写 C++ Promise 实现 * 类结构与成员变量 * 构造函数 * resolve 方法 * reject 方法 * then 方法 * onCatch 方法 * 链式调用 * 使用示例 * `std::promise` 与 `CProimse` 对比 * 1. 基础功能对比 * 2. 实现细节对比 * (1) 状态管理 * (2) 回调注册与执行 * (3) 异步支持 * (4) 链式调用 * 3. 代码示例对比 * (1) `CProimse` 示例 * (2) `std::promise` 示例 * 4.

By Ne0inhk
用Coze打造你的专属AI应用:从智能体到Web部署指南

用Coze打造你的专属AI应用:从智能体到Web部署指南

文章目录 * 一、Coze简介 * 1.1 什么是Coze? * 1.2 核心概念 * 二、Coze产品生态 * 三、智能体开发基础 * 四、Coze资源 * 4.1 插件 * 4.2 扣子知识库 * 4.3 数据库资源 * 五、工作流开发与发布 * 六、应用开发与发布 * 七、Coze的API与SDK * 八、实战案例 一、Coze简介 1.1 什么是Coze? Coze 是字节跳动开发的 AI Agent 平台,作为一款人工智能开发工具,它可以帮助开发者通过低代码甚至零代码的方式快速构建应用程序。此外还提供了相关的API和SDK,可以集成到我们自己开发的项目业务中。 1.2 核心概念 * 智能体:

By Ne0inhk
Java前缀和算法题目练习

Java前缀和算法题目练习

前缀和 * 前缀和 * 二维前缀和 * 寻找数组的中心下标 * 除自身以外数组的乘积 * 和为k的子数组 * 和可被K整除的子数组 * 连续数组 * 矩阵区域和 前缀和 题目解析:在一个数组中查询起对应区间的和,会查询多次 算法思想:暴力解法:每次查询都进行一次遍历,时间复杂度O(n*m) 前缀和解法:新定义一个数组,每一个下标存放的值是要查询数组的前下标对应值的和,这样我们在访问起某一个区间的时候,直接利用这个数组就非常快速 importjava.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publicclassMain{publicstaticvoidmain(String[] args){Scanner in =newScanner(System.in);int n = in.nextInt();int m = in.nextInt();int[

By Ne0inhk