manifest.json 的 orientation 配置仅对 App 生效,H5 和小程序完全忽略;iOS 需在 app-plus.distribute.ios.orientation 填数组(如 "landscape-primary"),Android 在 app-plus.distribute.android.orientation 填字符串(如 "landscape"),且必须云打包生效。

manifest.json 里 orientation 配置只对 App 生效,别在 H5 或小程序里折腾
App 端横竖屏锁定必须走原生配置,manifest.json 中的 orientation 字段只影响 iOS/Android 打包结果,H5 和小程序完全无视它——你改了 h5 或 mp-weixin 下的配置,真机上没任何反应,不是 bug,是设计如此。
iOS 和 Android 的写法不同,不能混用:
- iOS 必须在
app-plus.distribute.ios.orientation下填数组,值只能是"landscape-primary"或"landscape-secondary"(不能写"landscape") - Android 对应字段是
app-plus.distribute.android.orientation,填字符串"landscape"或"portrait"即可 - 改完必须重新云打包或制作自定义基座,“运行到手机”热重载不会生效
plus.screen.lockOrientation 是唯一能运行时切方向的 API,但仅限 Android
iOS 系统禁止 App 运行时强制旋转屏幕,plus.screen.lockOrientation 在 iOS 真机上静默失败,不报错也不生效;Android 则支持,但有硬性前提:
- targetSdkVersion ≥ 28
- 对应 Activity 未在
AndroidManifest.xml中硬编码android:screenOrientation - 调用后返回的是 Promise,必须检查
result字段,失败时返回{ result: 'fail', errMsg: 'xxx' },不是 throw 异常 - 推荐在
onShow里调用,onLoad只触发一次,无法应对用户从后台切回、tabBar 切换等场景
pages.json 的 pageOrientation 在 App 端完全无效
pages.json 里给单页配 pageOrientation: "landscape",只对微信/支付宝小程序和 H5 生效。App 端打包时直接忽略——这不是配置漏了,是 uni-app 架构决定的:App 页面共用同一个 Activity,无法靠 JS 层声明实现“某页横屏、某页竖屏”。
想实现页面级方向隔离,只有两条路:
- Android:把目标页面做成独立 Activity(通过 subNVue 或原生插件注册)
- iOS:需原生插件调用
[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeRight) forKey:@"orientation"],纯 Vue 页面做不到
video 组件横屏失效?先关 controls 和 enable-danmu
uni-app 的 <video> 在 iOS 上会接管屏幕方向控制权,导致 plus.screen.lockOrientation 失效。根本解法不是换 API,而是让播放器交出控制权:
- 设
controls="false",自己实现播放/暂停按钮 - 设
enable-danmu="false",避免弹幕触发全屏专用渲染路径 - 再配合
onReady调用plus.screen.lockOrientation,并在fullscreen-change事件里做方向同步 - 页面离开前记得调用
plus.screen.unlockOrientation或restoreOrientation,否则下次进页面可能卡死方向


















