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

Linux:早期操作系统的系统调用

Linux:早期操作系统的系统调用

相关阅读 Linuxhttps://blog.ZEEKLOG.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482 简介         本文将以Linux1.0为例说明早期操作系统的系统调用过程。         Linux1.0总共提供了135个系统调用(其中一些是保留或未实现),可以在源码路径linux-1.0/include/linux/sys.h下找到系统调用函数声明,在源码路径linux-1.0/include/linux/unistd.h下找到系统调用号定义。         下面列举出了一些系统调用的相关信息。 系统调用号系统调用函数名系统调用函数原型含义定义位置0sys_setupasmlinkage int sys_setup(void * BIOS)完成系统设备初始化(磁盘)、加载 RAM 盘、挂载根文件系统。linux-1.0/drivers/

By Ne0inhk
WSL2 + Ubuntu 22.04 全流程安装与避坑指南(适配 D 盘)

WSL2 + Ubuntu 22.04 全流程安装与避坑指南(适配 D 盘)

适用于:Windows 10/11 用户 目标:在 D 盘上部署完整可联网的 Ubuntu 22.04 + GPU 支持的开发环境 作者:jiahao(实际踩坑实践) 更新时间:2025-10 📋 一、前置条件检查 * Windows 已升级到 21H2 或更高版本; * 已安装 NVIDIA 显卡驱动 ≥ 510(支持 CUDA 12); * Windows 已安装 PowerShell 7+; * 本机具备管理员权限; * 可联网。 🧹 二、彻底清理旧版 WSL 环境 很多用户安装不干净是因为旧版本遗留。执行以下命令可完全重置。 1️⃣ 查看已安装发行版 wsl --list --all 如果看到:

By Ne0inhk
【鸿蒙2025领航者闯关】从技术突破到生态共建,开发者的成长与远航

【鸿蒙2025领航者闯关】从技术突破到生态共建,开发者的成长与远航

文章目录 * 前言 * 第一章 鸿蒙开发入门:认知全场景操作系统的核心魅力 * 1.1 鸿蒙操作系统的核心定位 * 1.2 鸿蒙开发的核心技术底座 * 1.2.1 分布式技术:设备协同的“灵魂” * 1.2.2 ArkUI:全场景UI开发的“利器” * 1.2.3 鸿蒙应用的两种形态:FA与HAP * 第二章 技术成长突破:从单端开发到跨设备协同的蜕变 * 2.1 成长痛点:单端开发的“能力天花板” * 2.2 核心突破一:掌握ArkUI多端自适应开发 * 2.2.1 声明式编程的思维转变 * 2.2.2 多端自适应的核心技术:布局约束与媒体查询 * 2.

By Ne0inhk
Flutter 三方库 frontend_server_client 深入鸿蒙编译后端极限热接驳管线适配:以桥连中继重组增量渲染图节点并强推微秒级热重载指令下发-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 frontend_server_client 深入鸿蒙编译后端极限热接驳管线适配:以桥连中继重组增量渲染图节点并强推微秒级热重载指令下发-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 frontend_server_client 深入鸿蒙编译后端极限热接驳管线适配:以桥连中继重组增量渲染图节点并强推微秒级热重载指令下发提振终端即时可视效能 在鸿蒙应用的跨平台引擎开发、自定义开发工具链或高频的热重载(Hot Reload)性能优化设计中,如何精准地控制 Dart 源码到 Kernel 文件(.dill)的编译转换过程?frontend_server_client 提供了一套与 Dart Frontend Server 通信的标准化客户端。本文将详解该库在 OpenHarmony 上的适配要点。 前言 什么是 frontend_server_client?它是 Dart SDK 中前端编译服务的封装包。它通过特定的交互协议,允许外部程序(如 IDE 插件或自定义 CLI

By Ne0inhk