用途:让 Capacitor iOS 应用在窗口可调整大小时正常工作,适用于 iPad 多任务、台前调度、窗口化 iPad 应用、可折叠 iPhone 与外接显示器等场景。主要能力:审计 Info.plist、原生代码与插件中与窗口尺寸相关的假设,修复网页布局对宽度变化的响应,并检查插件的原生浮层在分屏下的尺寸与位置。
关键事实:iOS 27 会忽略 UIRequiresFullScreen 并调整场景尺寸(TN3192),删除该键前需用户自行测试决定;iOS 27 SDK 要求声明启动屏,缺失会以 ITMS-90870 拒绝上传;Xcode 27 要求场景生命周期,Capacitor 8.5 模板已带 SceneDelegate.swift,若缺少 UIApplicationSceneManifest 应先做 capacitor-uiscene-migration;保持 UIApplicationSupportsMultipleScenes = false,模板不支持多窗口,但单场景即可缩放;CAPBridgeViewController 仅依据 iPhone 方向键构建 supportedInterfaceOrientations,iPad 方向键可能被桥接掩码锁定;WKWebView 会随窗口缩放并触发 resize 事件,问题多来自按设备而非视口读取尺寸的布局代码;插件属第三方代码,不可直接改 node_modules,只能升级、上报上游或用 patch-package 临时修补且需用户同意。
使用方式:先只读检查 Info.plist、AppDelegate.swift、SceneDelegate.swift、@capacitor/ios 版本与 TARGETED_DEVICE_FAMILY,再运行扫描脚本 bash <skill>/scripts/scan-legacy-apis.sh .,并用 grep 检查网页代码中的 screen.width、window.orientation、100vh、navigator.userAgent 与 innerWidth 等用法。随后按网页层优先、原生代码次之、插件最后的顺序修复。
验证:运行 npx cap sync ios、xcrun simctl list devices available | grep -i ipad、npx cap run ios --target <iPad-simulator-UDID>,在 iPad 模拟器上切换窗口、拖拽边角、测试窄中宽尺寸与 Split View,轮换方向、开关键盘、检查插件原生浮层、前后台切换确认 JS pause/resume 正常。限制:不处理仅设置 CSS env(safe-area-inset-*)、AppDelegate 迁移 SceneDelegate、键盘遮挡、Tailwind 断点等,这些由相关技能负责;修改 UIRequiresFullScreen、方向键、共享原生方法签名或修补插件前必须先征求用户同意;修改原生代码时须保留所有 if/else 分支与 #available 守卫,不得用字面量替换动态值,也不得用一个全局对象替换另一个全局对象。