App端强制横屏必须修改原生配置,JS层uni.setScreenOrientation在真机上无效,因iOS和Android 12+系统禁止Web层控制屏幕方向,文档中“支持”仅适用于模拟器或低版本targetSdkVersion。

App端强制横屏必须改原生配置,JS层uni.setScreenOrientation基本无效
真机上uni.setScreenOrientation调用后既不报错也不生效,不是你代码写错了,而是 iOS 和 Android 系统从 12+ 开始禁止 Web 层控制屏幕方向。文档里写的“支持”仅适用于模拟器或 targetSdkVersion
常见错误是反复调试onLoad里调用该 API、或在 H5 小程序配置里套用 App 写法——这些全无效。真正起效的只有一条路:让原生容器本身锁定方向。
- iOS 必须修改
unpackage/res/ios/Info.plist,添加UISupportedInterfaceOrientations键,值为数组:UIInterfaceOrientationLandscapeLeft和UIInterfaceOrientationLandscapeRight - Android 必须修改
unpackage/res/android/AndroidManifest.xml,在每个<activity></activity>标签里加android:screenOrientation="landscape"(包括主 Activity 和 subNVue 页面对应的 activity) -
manifest.json中的app-plus.distribute.ios.orientation和app-plus.distribute.android.orientation只是“指令”,不改原生文件等于白配
manifest.json 配置写法与平台差异
manifest.json 的 app-plus 节点下配置必须严格区分 iOS 和 Android,填错字段或格式会静默失效。
- iOS:
"orientation": ["landscape-primary", "landscape-secondary"]—— 必须是数组,填"landscape"或单个字符串会被忽略 - Android:
"orientation": "landscape"—— 字符串即可,不区分主次方向,系统自动适配 - 切勿把小程序用的
pageOrientation: "landscape"写进pages.json的 App 页面 style 里,App 端完全无视该字段
只让某页面横屏(如游戏页、视频页)的可行路径
App 端无法靠 Vue 页面级逻辑实现“部分页面横屏 + 其他竖屏”,因为屏幕方向是原生 Activity 或 ViewController 级别的属性,不是 JS 控制的 CSS 效果。
- Android:可为特定页面单独声明一个
<activity></activity>,并在其标签中设置android:screenOrientation="landscape",再通过uni.navigateTo跳转过去 - iOS:纯 JS 无解,必须用原生插件调用
[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeRight) forKey:@"orientation"],且需用户手动关闭系统“竖排方向锁定”开关 - CSS
transform: rotate(90deg)是假横屏,会导致 Canvas 尺寸错乱、触摸坐标偏移、键盘弹不出等问题,游戏/视频类场景严禁使用
真机调试不生效的三个硬性前提
改完配置却没反应?大概率卡在这三步中的某一步:
- 没删
unpackage目录 —— 缓存残留导致旧配置继续运行 - 没重新云打包或重装自定义基座 —— “运行到手机”按钮走的是调试基座,不读 manifest 新配置
- iOS 真机未关闭系统“竖排方向锁定” —— 即使原生配置正确,系统级开关也会拦截旋转
多端 UI 适配的关键在于:H5 和小程序走 CSS 媒体查询 + screen.orientation.lock(失败需降级),App 端则彻底放弃 JS 控制,把方向决策权交给原生层。混淆这两套逻辑,是绝大多数横屏问题的根源。


















