uni-app App端强制横屏必须原生配置:iOS在manifest.json配app-plus.distribute.ios.orientation为["landscape-primary","landscape-secondary"],Android配app-plus.distribute.android.orientation为"landscape",且需云打包或自定义基座生效。

uni-app 无法靠纯 JS 或 CSS 实现真正的 App 端强制横屏——uni.setScreenOrientation 在 iOS 真机基本无效,Android 12+ 也常被系统拦截;所谓“CSS 旋转”只是视觉模拟,会导致触摸坐标错乱、Canvas 拉伸、键盘异常等实际问题。真正生效的方案必须分平台配置原生层,且需严格遵循时机和打包要求。
manifest.json 必须配对 iOS 和 Android 的 orientation
不配这个,后续所有 JS 调用都白搭。iOS 和 Android 配置项互不兼容,不能混用:
- iOS 需在
manifest.json的app-plus.distribute.ios.orientation下填数组:["landscape-primary", "landscape-secondary"];填"landscape"或单个值会被忽略 - Android 对应位置是
app-plus.distribute.android.orientation,填字符串"landscape"即可(不区分主次) - 改完必须重新云打包或制作自定义基座——真机调试时点“运行到手机”不会生效
- 若只希望某页面横屏(如游戏页),全局配置后仍需配合页面级控制,否则其他页面也会被锁住
pages.json 中 pageOrientation 只对小程序/H5 生效
pageOrientation: "landscape" 在 pages.json 的页面 style 或 globalStyle 里写,仅在微信小程序、支付宝小程序、H5 有效。App 端完全无视该配置:
- 小程序端:支持
mp-weixin、mp-alipay等子节点下配置,值为"landscape"即可 - H5 端:部分浏览器允许
screen.orientation.lock('landscape'),但失败静默,需加.catch捕获并降级提示 - App 端:写在这里等于没写,别浪费时间调试
- 注意:小程序横屏切换时可能闪白屏,建议加
backgroundColor避免视觉跳变
App 端动态调用 uni.setScreenOrientation 的真实表现
该 API 在 App 端不是“有时失效”,而是有明确平台边界:
- 仅在 Android 部分旧机型(targetSdkVersion { result: 'fail', errMsg: 'not supported' }
- 必须在
onShow中调用(非onLoad或onReady),因用户切后台再回来时方向可能已变 - 返回值是 Promise,但失败时 resolve 而非 reject,务必检查
res.result === 'fail' - 如果已配好 manifest,又想临时切回竖屏(如视频播放结束),可在
plus.video.Player.onstatechanged回调中调用plus.screen.lockOrientation('portrait-primary')
游戏/视频类页面建议走「独立横屏 Activity」路线
与其折腾 JS 层锁定,不如让横屏页对应一个原生层就固定为 landscape 的页面:
- Android:在
android/app/src/main/AndroidManifest.xml中,为对应 Activity 添加android:screenOrientation="landscape" - iOS:需修改
ios/Podfile或通过原生插件注入[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeRight) forKey:@"orientation"] - 跳转用
uni.navigateTo({ url: '/pages/game/game' }),该页面的 WebView 容器从启动起就是横屏,Canvas 尺寸、触摸坐标、键盘行为全部正常 - 此时
uni.getSystemInfo返回的screenWidth/screenHeight才是当前朝向下的真实视口尺寸
最易被忽略的一点:横屏后退出,页面方向不会自动恢复。尤其视频全屏退出时,必须手动调用原生 API 还原,否则后续页面会卡在横屏状态——这和 Vue 生命周期无关,得监听原生播放器事件来触发。


















