app端强制横屏必须双端原生配置:ios在manifest.json的app-plus.distribute.ios.orientation设数组["landscape-primary","landscape-secondary"],android在app-plus.distribute.android.orientation设字符串"landscape";且需手动修正info.plist和androidmanifest.xml中所有activity的横屏属性,删unpackage后重新云打包。

manifest.json 配置必须双端分开写,不能混用
App 端强制横屏不是 JS 控制的事,而是原生层的启动约束。iOS 和 Android 的配置字段、格式、生效逻辑完全不同,填错一个字符就白配。
- iOS 必须在
app-plus.distribute.ios.orientation下写数组:["landscape-primary", "landscape-secondary"]—— 填"landscape"或单个值会被完全忽略 - Android 对应位置是
app-plus.distribute.android.orientation,只接受字符串:"landscape",不区分主次方向 - 这两个字段必须同时存在且正确,缺一不可;只配 iOS 不配 Android,安卓真机仍竖屏
原生文件必须手动改,manifest.json 只是“发指令”
uni-app 的 manifest.json 不会自动修改原生工程,它只是打包时的“配置源”。云打包或生成自定义基座时,才会把这里的值写入真正的原生文件。但很多情况它写不全,尤其 iOS 的 Info.plist 和 Android 的 AndroidManifest.xml 经常漏项。
- iOS:打开
unpackage/res/ios/Info.plist,确认存在UISupportedInterfaceOrientations键,且其子项只有两个字符串:UIInterfaceOrientationLandscapeLeft和UIInterfaceOrientationLandscapeRight - Android:打开
unpackage/res/android/AndroidManifest.xml,检查所有<activity></activity>标签(包括主页面、subNVue 页面、自定义插件 Activity),每个都必须有android:screenOrientation="landscape" - 改完必须删掉整个
unpackage目录,再重新云打包——热重载、“运行到手机”完全不触发原生配置更新
别信 uni.setScreenOrientation 在 App 真机上能生效
这个 API 在 App 端不是“偶尔失效”,而是平台级限制:iOS 真机调用后静默返回 { result: 'fail', errMsg: '' };Android 12+ 大部分机型也会被系统拦截,且仅对未硬编码 screenOrientation 的 Activity 有效。
- 它只应在 H5 或小程序环境里当主力方案;App 端写它等于加了个无用 Promise
- 即使成功,也只锁当前 Activity,跳转新页面后立即失效,无法维持“某页横屏、其他页竖屏”的逻辑
- 若你已在 AndroidManifest.xml 中锁死
screenOrientation="landscape",该 API 调用后必然无反应
横屏 UI 布局要避开 uni.getSystemInfo 的陷阱
很多开发者用 uni.getSystemInfoSync().screenWidth 当画布宽,结果横屏时 Canvas 拉伸、按钮点不准——因为这个 API 返回的是设备物理屏幕尺寸,不是当前朝向下的可用视口尺寸。
- 正确做法是监听
onResize事件,从res.size拿实时windowWidth/windowHeight: - 用 CSS 媒体查询做基础适配:
@media (orientation: landscape) { .container { flex-direction: row; } } - Canvas 渲染前务必用
plus.screen.getOrientation()或onResize动态计算 canvas.width/canvas.height,别写死
unpackage 目录、是否检查了每一个 activity 的 screenOrientation 属性、是否意识到 iOS 的 Info.plist 必须手动补全那两行字符串——这些步骤漏掉任意一个,横屏就永远只在模拟器里“成功”。











