iPad 上的 Cordova 锁定方向失败

Posted

技术标签:

【中文标题】iPad 上的 Cordova 锁定方向失败【英文标题】:Cordova lock orientation on iPad fails 【发布时间】:2014-07-18 11:40:26 【问题描述】:

我正在使用 cordova 3.5.0-0.2.6(最后一个稳定版本)。 我在锁定 iPad 设备的方向时遇到问题。 在 iPhone 上它可以正常工作,但在 iPad 上没有锁定方向。

我想锁定整个应用,而不仅仅是页面。

这是我当前的 config.xml:

<?xml version="1.0" encoding="utf-8"?>
<widget id="com.domain"
        version="version"
        xmlns="http://www.w3.org/ns/widgets">
    <name>xxx</name>

    <description>Lorem ipsum</description>

    <access origin="*"/>

    <author email="x@x" href="https://x.com">x</author>

    <content src="index.html?platform=cordova"/>

    <feature ...></feature>

    <preference name="permissions" value="none"/>
    <preference name="orientation" value="portrait"/>
    <preference name="show-splash-screen-spinner" value="true"/>
    <preference name="auto-hide-splash-screen" value="true"/>
    <preference name="prerendered-icon" value="true"/>
    <preference name="disallowoverscroll" value="true"/>
    <preference name="webviewbounce" value="false"/>

    <preference name="StatusBarOverlaysWebView" value="false"/>
    <preference name="StatusBarBackgroundColor" value="#000000"/>
</widget>

生成的 plist 文件如下所示:

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations¨ipad</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

【问题讨论】:

这是由于 Cordova 中的一个错误 - issues.apache.org/jira/browse/CB-6026 有一个与方向有关的更大错误尚未修复 - issues.apache.org/jira/browse/CB-6462 【参考方案1】:

我尝试了很多解决此错误的方法,但大多数都失败了。幸运的是,我找到了一个 Cordova 插件,它可以让您通过 javascript 成功锁定屏幕方向。也在 iPad 上工作。

https://github.com/yoik/cordova-yoik-screenorientation

    添加插件:cordova plugin add net.yoik.cordova.plugins.screenorientation 在 JavaScript 中使用 screen.lockOrientation('portrait-primary') 锁定屏幕。请务必在文档的deviceready 触发后调用此函数。

【讨论】:

【参考方案2】:

围绕它有点破解,但解决这个问题的一种方法是通过 Cordova 钩子。例如,将其放在您的 hooks/before_compile 目录中:

var fs = require('fs');
var plist = './platforms/ios/YourProjectName/YourProjectName-Info.plist';
fs.exists(plist, function (exists) 
    if (exists) 
        var p = fs.readFileSync(plist, 'utf8');
        p = p.replace(
            /<key>(UISupportedInterfaceOrientations(\~ipad)*)<\/key>[\r\n ]*<array>[\s\S]*?(?=<\/array>)/ig,
            "<key>$1</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t"
        );
        fs.writeFileSync(plist, p, "utf8");
    
);

当您为 iOS (cordova build ios) 构建时,它现在应该会自动更改 plist。

【讨论】:

非常好的主意,因为它仍然不适合我。我不得不使用: p = p.replace( "", "\n\t\tUISupportedInterfaceOrientations~iphone\n\t\t\n\t \tUIInterfaceOrientationPortrait\n\t\t\n\t\tUISupportedInterfaceOrientations~ipad\n\t\t\n\t\ tUIInterfaceOrientationPortrait\n\t\tUIInterfaceOrientationLandscapeLeft\n\t\tUIInterfaceOrientationLandscapeRight\n\t\t\n\ t");虽然

以上是关于iPad 上的 Cordova 锁定方向失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中锁定手机屏幕方向? (不在选项卡/ iPad 中)

在iPad上锁定方向并禁用旋转

css 移动网站(iPad,iPhone)的“锁定”方向

使用常规选项卡,无法锁定 iPad 应用程序的设备方向

锁定方向在 ipad ios 8 swift xcode 6.2 上不起作用

在横向模式下锁定 Ipad 应用程序