
前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载Flet 提供了一套跨平台的设备信息查询 API其中IosDeviceInfo是面向 iOS/iPadOS 运行时的设备信息快照类型封装了型号、系统版本、内存、磁盘、内核信息等十余项字段。本文基于 Flet 开源仓库中的类型定义与源码实现系统讲解IosDeviceInfo含嵌套类型IosUtsname的完整字段语义、获取方式Page.get_device_info()以及底层从 Python 到 Flutter 再到原生系统的调用链帮助你基于该 API 实现设备能力检测、模拟器判断、系统版本适配等移动端实战需求。IosDeviceInfo 是什么IosDeviceInfo是 Flet 在 iOS/iPadOS 运行时返回给 Python 侧的设备信息数据类定义于 device_info.py。它在 Flet 的设备信息类型体系中扮演iOS 专属快照的角色同一体系还包括AndroidDeviceInfo/AndroidBuildVersionAndroidMacOsDeviceInfomacOSLinuxDeviceInfoLinuxWindowsDeviceInfoWindowsWebDeviceInfo/WebBrowserNameWeb以及所有平台共有的基类DeviceInfo提供locales字段IosDeviceInfo使用value(kw_onlyTrue)装饰器标记为 dataclass所有字段均为关键字参数字段来源是 Flutter 社区插件device_info_plus的IosDeviceInfo经过 Dart 侧序列化为 Map 后再通过 Flet 协议传输并在 Python 侧反序列化为本类型。完整字段详解以下字段全部继承自 device_info.py 中IosDeviceInfo的定义并附上字段类型、含义与典型取值。基础标识与系统信息字段类型说明modelstr系统报告的设备型号来自UIDevice.model如iPhone、iPadmodel_namestr商用/用户熟知的型号名称如iPhone 16 Pro、iPad Pro 11-Inch 3localized_modelstr本地化后的设备型号名称来自UIDevice.localizedModelnamestr设备名称。注意 iOS 版本差异iOS 16 返回用户自定义的设备名iOS 16 时若工程没有相应 entitlement则只返回通用设备名system_namestr当前操作系统名称来自UIDevice.systemName通常为iOS或iPadOSsystem_versionstr当前操作系统版本字符串来自UIDevice.systemVersion如18.0is_physical_devicebool是否物理真机。在模拟器Simulator中运行时为False真机为Trueis_ios_app_on_macbool当前进程是否是运行在 Mac 上的 iPhone/iPad 应用Apple Silicon Mac 上的 iOS app来自NSProcessInfo.isiOSAppOnMacidentifier_for_vendorOptional[str]标识当前设备的 UUID来自UIDevice.identifierForVendor可能为None例如应用没有相应的访问条件时内存与存储字段类型说明physical_ram_sizeint设备物理 RAM 总量单位是兆字节MBavailable_ram_sizeint当前未分配的可用 RAM 大小单位也是 MBtotal_disk_sizeint磁盘总容量单位是字节bytesfree_disk_sizeint空闲磁盘容量单位是字节bytes注意内存与磁盘字段的单位并不一致RAM 相关字段以 MB 计磁盘相关字段以字节计换算时需分别按 1024² 和 1 处理。嵌套类型 IosUtsnameutsname字段的类型是IosUtsname定义于同一文件的 第 775-797 行其信息来源于 POSIX 标准库sys/utsname.h用于描述底层内核信息字段类型说明machinestr硬件类型标识如iPhone7,1对应 iPhone 6 Plus这类机型标识符node_namestr网络节点名hostnamereleasestr内核发布级别release levelsys_namestr操作系统名称如Darwinversionstr内核版本级别version levelutsname.machine是与硬件架构最直接相关的字段可用于在真机上区分具体机型标识例如iPhone15,2、iPad13,1等。基类字段 localesIosDeviceInfo继承自DeviceInfo基类第 23-49 行因此还包含字段类型说明localeslist[Locale]系统报告的全部受支持区域设置locale列表按优先级排序索引越小越优先第一个元素即主 locale。该值变化时会触发Page.on_locale_change事件locales用于指导应用界面应该采用的语言与格式化约定是国际化i18n功能的关键输入。如何获取 IosDeviceInfo通过 Page.get_device_info()在 iOS 平台上调用Page.get_device_info()即可获得IosDeviceInfo实例。该方法的定义位于 page.py 第 1361-1384 行async def get_device_info(self) - Optional[DeviceInfo]: info await self._invoke_method(get_device_info) if self.web: return from_dict(WebDeviceInfo, info) elif self.platform in [PagePlatform.ANDROID, PagePlatform.ANDROID_TV]: return from_dict(AndroidDeviceInfo, info) elif self.platform PagePlatform.IOS: return from_dict(IosDeviceInfo, info) elif self.platform PagePlatform.MACOS: return from_dict(MacOsDeviceInfo, info) # ... 其他平台从源码可以看到方法是一个async方法内部通过_invoke_method(get_device_info)向 Flutter 前端发起请求前端返回 JSON Map 后Python 侧根据page.platform判定平台在 iOS 时通过from_dict(IosDeviceInfo, info)反序列化为IosDeviceInfo对象from_dict.py 中的from_dict支持 dataclass、嵌套 dataclass、枚举、列表、Optional 等结构的递归转换。若平台无法识别则返回None。完整的实战示例由于get_device_info()是异步方法示例程序需要以 async 方式运行使用ft.run(main)。以下是一个展示 iOS 设备核心信息的完整示例import flet as ft async def main(page: ft.Page): page.scroll ft.ScrollMode.AUTO info await page.get_device_info() if info is None: page.add(ft.Text(无法获取设备信息当前平台不支持)) return # 在 iOS 真机/模拟器上info 是 flet.IosDeviceInfo if hasattr(info, model_name): rows [ ft.ListTile(titleft.Text(型号名称), subtitleft.Text(info.model_name)), ft.ListTile(titleft.Text(系统版本), subtitleft.Text(f{info.system_name} {info.system_version})), ft.ListTile(titleft.Text(物理内存 (MB)), subtitleft.Text(str(info.physical_ram_size))), ft.ListTile(titleft.Text(可用内存 (MB)), subtitleft.Text(str(info.available_ram_size))), ft.ListTile(titleft.Text(总磁盘 (bytes)), subtitleft.Text(str(info.total_disk_size))), ft.ListTile(titleft.Text(空闲磁盘 (bytes)), subtitleft.Text(str(info.free_disk_size))), ft.ListTile(titleft.Text(真机), subtitleft.Text(str(info.is_physical_device))), ft.ListTile(titleft.Text(硬件标识 (utsname.machine)), subtitleft.Text(info.utsname.machine)), ft.ListTile(titleft.Text(内核 (utsname.sys_name)), subtitleft.Text(info.utsname.sys_name)), ] page.add(*rows) else: page.add(ft.Text(f设备信息: {info})) if __name__ __main__: ft.run(main)说明hasattr(info, model_name)是一种简单但不够严谨的平台判别方式更规范的做法是直接检查page.platform如page.platform ft.PagePlatform.IOS或直接使用类型标注isinstance(info, ft.IosDeviceInfo)。info.utsname是IosUtsname对象可继续访问其machine、node_name、release、sys_name、version五个属性。由于get_device_info()返回类型在静态上为Optional[DeviceInfo]涉及 iOS 专属字段时建议先做isinstance判断以获得类型收窄。仓库中还有官方示例 device_locale/main.py 展示了利用(await page.get_device_info()).locales读取初始 locale 列表、并配合page.on_locale_change监听语言变化的用法可作为 i18n 场景的参考initial_locales (await page.get_device_info()).locales page.add(ft.Text(fInitial locales: {format_locales(initial_locales)}))底层调用链从 Python 到原生系统IosDeviceInfo的数据并非由 Python 侧生成而是完整的端到端链路Python 侧发起调用Page.get_device_info()调用_invoke_method(get_device_info)通过 Flet 协议将方法名发送到 Flutter 客户端page.py。Flutter 侧分发page.dart 中的case get_device_info: return await getDeviceInfo();将请求交给getDeviceInfo()。插件采集数据device_info.dart 中调用DeviceInfoPlugin().deviceInfo即device_info_plus插件获取平台原生数据在 iOS 分支第 85-109 行将插件的IosDeviceInfo字段逐一映射为 Maputsname的nodename/sysname等也在此完成重命名并额外附带locales来自PlatformDispatcher.instance.locales。Python 侧反序列化from_dict(IosDeviceInfo, info)依据 dataclass 的类型注解递归构造IosDeviceInfo与嵌套的IosUtsname对象。从源码结构可以推断Dart 侧的device_info_plus在 iOS 上会进一步调用UIDevicemodel、systemName、systemVersion、identifierForVendor、localizedModel、name、NSProcessInfoisiOSAppOnMac以及NSFileManager属性磁盘容量等原生 API。典型应用场景与注意事项判断真机 / 模拟器is_physical_device是区分真机与模拟器最直接的字段可用于在开发阶段隐藏仅真机可用的功能或上报统计时过滤模拟器数据info await page.get_device_info() if isinstance(info, ft.IosDeviceInfo): if not info.is_physical_device: page.add(ft.Text(当前运行在 iOS 模拟器中))系统版本适配system_version为字符串如18.0若需比较版本号建议先解析为数值再比较避免字符串字典序导致的误判。结合utsname.machine的硬件标识还可以做更细粒度的机型级适配。设备命名在 iOS 16 的差异按源码 docstring 的说明name字段在 iOS 16 及以后若工程缺少获取用户自定义设备名的 entitlement将返回通用设备名。因此不要把name当作持久化设备标识使用需要唯一标识时应考虑identifier_for_vendor注意它也可能为None。内存与磁盘单位不一致physical_ram_size/available_ram_size以MB计total_disk_size/free_disk_size以字节计。展示给用户前务必先换算例如磁盘字节数除以1024 ** 3得到 GB。Mac 上的 iOS 应用is_ios_app_on_mac用于识别运行在 Apple Silicon Mac 上的 iOS app 场景。这类环境在硬件资源、存储路径等方面与普通 iPhone 不同需要时可通过该字段分流处理。相关类型与延伸阅读嵌套类型IosUtsname的类型文档页iosutsname.md其字段同样来自sys/utsname.h标准。设备信息基类与全部平台子类AndroidDeviceInfo、MacOsDeviceInfo、LinuxDeviceInfo、WindowsDeviceInfo、WebDeviceInfo统一定义于 device_info.py。平台相关的其他类型文档可参见 types 目录其中包含androiddeviceinfo.md、linuxdeviceinfo.md等同类 API 引用页。Flet 移动端打包与真机/模拟器运行流程可参考 publish/ios.md 与 getting-started/testing-on-mobile.md。赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐Flet Charts 交互事件详解LineChartEvent 的完整字段、事件类型与实战用法Flet Charts 交互事件详解LineChartEvent 的完整字段、事件类型与实战用法 LineChartEvent 是 Flet 图表扩展 fl前端跨平台桌面应用移动开发Flet IosUtsname 详解通过 POSIX utsname 读取 iOS 设备系统信息Flet IosUtsname 详解通过 POSIX utsname 读取 iOS 设备系统信息 IosUtsname 是 Flet 在 iOS/iPadOS前端跨平台桌面应用移动开发Flet ContextMenuDismissEvent 事件详解字段、触发时机与实战用法Flet ContextMenuDismissEvent 事件详解字段、触发时机与实战用法 ContextMenuDismissEvent 是 Flet 框架前端跨平台桌面应用移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考