page contents

Python移动应用开发:将PySide6带到iOS

从Qt 6.12起,用Python开发移动应用终于覆盖到了iOS。PySide6开发者沿用现有的Android与桌面端代码,就能直接发布原生iOS应用,既不用Swift或Objective-C重写,也不用再维护第二套需要同步的代码。

attachments-2026-09-YOFZhIZk6ab47ea48124c.png从Qt 6.12起,用Python开发移动应用终于覆盖到了iOS。PySide6开发者沿用现有的Android与桌面端代码,就能直接发布原生iOS应用,既不用Swift或Objective-C重写,也不用再维护第二套需要同步的代码。

自Qt 6.5让PySide6应用跑上Android之后,大家自然会追问:那iOS呢?iOS的难点和Android完全不是一回事,但从Qt 6.12开始,Python开发者不必为了把应用发布到iPhone和iPad而改用其他工具链,留在PySide6生态里就能完成。

能用Python开发iOS应用吗?

可以。从Qt 6.12起,PySide6应用已经能在iOS上原生运行。为iOS交叉编译PySide6会得到一组静态 .a库,它们会连同Qt自带的静态框架、以及BeeWare的Python.xcframework,一起直接链接进应用的Xcode工程(在正式提供iOS支持的Python 3.15发布之前,都沿用这个方案)。这样一来,所有内容最终都打包进同一个应用二进制文件,而不是在运行时动态加载。 

iOS为什么不能沿用Android的做法?

iOS要求把Qt静态链接进应用二进制文件。面向iOS的Qt是以静态库形式发布的,而不是动态库(.dylib)。如果PySide6模块按动态文件加载,Qt的符号就会出现两份,加载时会直接报重复符号错误。 

解决办法是:把每个PySide6模块都静态链接进二进制文件,并在Py_Initialize之前预先注册到Python解释器中。 

Qt是如何接管iOS应用生命周期的?

iOS应用由UIApplicationMain驱动,它会接管整个进程并且永不返回。Qt的iOS平台插件提供了qt_main_wrapper,用Qt自己的application delegate去调用UIApplicationMain,从而让完整的Qt平台集成生效——包括信号与槽机制和事件循环。再通过设置Xcode的LD_ENTRY_POINT构建设置,Qt就能从进程启动那一刻起掌握控制权。 

之后,Qt的运行循环集成(run loop integration)会把控制权交回给main(),由它初始化Python并运行应用脚本。 

怎样让PySide6应用跑在iPhone或iPad上?

把PySide6应用跑到iOS上一共三步:每个Qt版本交叉编译一次PySide6,在配置文件里写清楚应用信息,然后生成并构建Xcode工程。 

第一步 · 交叉编译PySide6

python pyside-setup/tools/cross_compile_ios/main.py build --qt-install-path ~/Qt/6.12.0 

这条命令会下载Python.xcframework,生成CMake工具链文件,并针对ios_arm64交叉编译shiboken6和PySide6,产出静态库。 

这一步每个Qt版本只需执行一次,产物可以在您所有的iOS应用中复用。  

第二步 · 描述应用信息

生成Xcode工程需要一个pyside6-ios.toml文件,里面写明配置工程所需的信息。目前这个文件要手动编写,从现有PySide6项目自动生成的功能正在开发中。 

[app]name = "My PySide6 App"bundle-id = "com.example.mypyside6app"output-dir = "generated"
[pyside6]modules = ["QtCore", "QtGui", "QtWidgets"]
[python]version = "3.14"scripts = ["scripts/main.py"]
[signing]style = "Automatic"

第三步 · 生成并构建Xcode工程

python pyside-setup/tools/cross_compile_ios/main.py generate -c pyside6-ios.toml
open generated/MyPySide6App.xcodeproj

这一步会生成

main.mm:初始化Python,把所有PySide6模块注册为内置模块,然后运行Python脚本; 

Info.plist:iOS应用的元数据; 

project.pbxproj:链接全部Qt框架、PySide6静态库(.a)、Python.xcframework和iOS系统框架,并设置LD_ENTRY_POINT。 

在Xcode中选好设备,点击运行 ▶️ 即可。  

一套代码,同时覆盖Android与iOS

PySide6现在同时支持Android(Qt 6.5起)和iOS(Qt 6.12起),一套PySide6代码就能覆盖这两大主流移动平台。底层的构建与打包方式确实不同——iOS走静态链接,Android走动态加载——但应用代码本身不需要为此改动。一个PySide6项目,不用重写就能部署到桌面、Android以及iOS。  

PySide6在iOS上的现有限制

这将是首个包含iOS部署支持的版本,因此有几点限制需要提前了解。如果您愿意为其中任何一项提交修复方案,我们很乐意评审: 

暂不支持第三方包。带C扩展的包(numpy、Pillow等)目前无法使用,PyPI上还没有iOS平台的wheel包。 

暂不支持iOS模拟器。目前测试必须使用真机,模拟器支持仍在研究中。 

Xcode工程需手动生成。我们计划提供pyside6-ios-deploy控制台脚本(对应Android端的pyside6-android-deploy),取代目前“先生成、再打开工程”的手动步骤。 

目前依赖BeeWare的Python.xcframework。待Python 3.15正式发布后,我们打算切换到Python官方的iOS支持。 

常见问题

能用 Python 开发 iOS 应用吗?

可以。用PySide6搭配Qt 6.12或更高版本,就能把Python应用静态编译成原生iOS应用二进制文件,在iPhone或iPad上运行。前提是为ios_arm64交叉编译PySide6并生成Xcode工程,但应用代码本身就是标准的PySide6代码。 

除了PySide6,还有别的方式用Python开发iOS应用吗?

有。例如BeeWare的Briefcase(PySide6的iOS工具链正是复用了它的Python.xcframework),以及kivy-ios。区别在于,PySide6能提供完整的原生Qt Widgets与QML工具集。 

Python支持跨平台移动开发吗?

支持。有了PySide6,同一套代码现在可以同时面向Android和iOS。底层构建流程因平台而异(Android用动态库加载,iOS需要静态链接),但应用逻辑和UI代码在两个平台上可以共用。 

Python在iOS上目前有哪些限制?

眼下主要有三点:带C扩展的第三方包还用不了(PyPI上还没有iOS平台的wheel包)、不支持iOS模拟器、以及Xcode工程仍需手动生成,还没有做到一条命令完成部署。这三项都在推进中。 

把PySide6应用发布到iOS,需要会Swift或Objective-C吗?

不需要。生成的Xcode工程已经处理好原生iOS的入口点和应用生命周期(main.mm、Info.plist、LD_ENTRY_POINT)。应用逻辑仍然写在PySide6里,Xcode只负责构建和签名,不用您写原生代码。 

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg


你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2436 篇文章

作家榜 »

  1. Pack 2436 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章