Cordova 3.5.0 中的 iPhone 屏幕方向没有改变

Posted

技术标签:

【中文标题】Cordova 3.5.0 中的 iPhone 屏幕方向没有改变【英文标题】:iPhone screen orientation doesn't change in cordova 3.5.0 【发布时间】:2014-07-31 08:48:23 【问题描述】:

当我使用 iPhone 在我的应用程序中旋转屏幕时,它始终保持纵向并且没有任何变化。但是它适用于 iPad。我可以旋转它并改变方向。

如何让我的 App 在 iPhone 转动时改变屏幕方向?

config.xml 我有:

<preference name="Orientation" value="default" />

我能找到的唯一解决方案是在科尔多瓦代码中的 MainViewController.m 中更改方法 shouldAutorotateToInterfaceOrientation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    // Return YES for supported orientations
--    return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation];
++    return true;

但这对我来说似乎是一个丑陋的解决方案,我真的很想找到这样做的正常方法。

理想情况下,除了 PortraitUpsideDown 之外,iPad 和 iPhone 的所有方向都很好,但我不知道我是否可以梦想它。

还有其他人对 iPhone 和 cordova 有类似的问题吗?我已经用谷歌搜索了好几天了,除了科尔多瓦代码中的这个 hack 之外什么都找不到。

【问题讨论】:

这是一个 javascript 解决方案:***.com/a/28203969/533454 【参考方案1】:

在广泛搜索此问题的解决方案后,不幸的是,我得出的结论是这是一个 Cordova 问题。

<preference name="Orientation" value="default" />

代码实际上应该更改 ios 配置文件 (/platform/ios/~app_name~/~app_name~.plist) 中的平台 UISupportedInterfaceOrientations 键以包含以下值:

"UIInterfaceOrientationLandscapeLeft"; "UIInterfaceOrientationLandscapeRight"; "UIInterfaceOrientationPortrait";和(我认为) “UIInterfaceOrientationPortraitUpsideDown”

不幸的是,更改 config.xml 文件并不会更改 plist 文件,这很烦人。希望这能很快得到解决,从网上找到的线程来看,这浪费了很多人寻找解决方案的时间。

我找到的最简单的解决方案是手动更改 ~app_name~.plist 文件以包含上述值。我一直在 Xcode 中这样做,这很容易做到。

希望这会有所帮助。如果有更好的解决方案或 Cordova 解决了这个疏忽,请告诉我。

【讨论】:

作为旁注,值得注意的是其他哪些 config.xml 选项不起作用。有其他的请留言,以免浪费更多时间...... 我不喜欢修改 Cordova 生成的代码。这是一个 Javascript 解决方案。 ***.com/a/28203969/533454【参考方案2】:

我在 XCode 中创建了一个使用 PListBuddy 的构建阶段,这样每当您运行 cordova build ios 时,它就会运行构建阶段并更新 PList 文件。这样做的好处是,如果您更改 config.xml 并更改 PList,则构建阶段会介入并确保值存在。

我从这里接受的答案中得到了这个想法:Is there a way of automatically writing custom values to the bundle's .plist during a build phase?

#Grabs info from plist
plist=$SRCROOT"/"$INFOPLIST_FILE
orientations=`/usr/libexec/PlistBuddy -c "Print :UISupportedInterfaceOrientations" "$plist"`

#And changes it before writing out the plist again
if [ "$orientations" ]
then
/usr/libexec/PlistBuddy -c "Delete :UISupportedInterfaceOrientations array" "$plist"
fi
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations array" "$plist"
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations:0 string \"UIInterfaceOrientationPortrait\"" "$plist"
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations:0 string \"UIInterfaceOrientationPortraitUpsideDown\"" "$plist"
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations:0 string \"UIInterfaceOrientationLandscapeLeft\"" "$plist"
/usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations:0 string \"UIInterfaceOrientationLandscapeRight\"" "$plist"

顺便说一句,我们不应该为了吃蛋糕而费尽心机,但无论如何。

【讨论】:

这真的很酷,谢谢。我正在做一些烦人的字符串替换,以尽可能地自动化我的构建,但这更好【参考方案3】:

我创建了一个从这里引用的挂钩文件: https://***.com/a/27063466/4519033

#!/usr/bin/env node

var fs = require('fs');
var plist = 'platforms/ios/<app-name>/<app-name>-Info.plist';

var iphoneModes = [
    "UIInterfaceOrientationLandscapeLeft",
    "UIInterfaceOrientationLandscapeRight",
    "UIInterfaceOrientationPortrait"
];

var ipadModes = [
    "UIInterfaceOrientationLandscapeLeft",
    "UIInterfaceOrientationLandscapeRight"
];

function getOrientationModeStr(modes) 
    var s = "<key>$1</key>\n\t<array>\n\t";
    modes.forEach(function(mode, index) 
        s += "\t<string>"+mode+"</string>\n\t";
    );
    return s;


if (fs.existsSync(plist)) 
    var p = fs.readFileSync(plist, 'utf8');
    // replace iphone modes
    p = p.replace(
        /<key>(UISupportedInterfaceOrientations)<\/key>[\r\n ]*<array>[\s\S]*?(?=<\/array>)/ig,
        getOrientationModeStr(iphoneModes)
    );
    // replace ipad modes
    p = p.replace(
        /<key>(UISupportedInterfaceOrientations~ipad)<\/key>[\r\n ]*<array>[\s\S]*?(?=<\/array>)/ig,
        getOrientationModeStr(ipadModes)
    );
    fs.writeFileSync(plist, p, "utf8");

希望它有所帮助。

【讨论】:

以上是关于Cordova 3.5.0 中的 iPhone 屏幕方向没有改变的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 3.5.0 iOS 应用程序中的暂存文件夹需要啥?

无法在 Phonegap / Cordova 3.5.0-0.2.4 上运行联系人插件

Cordova 应用程序无法在 iPhone X(模拟器)上正确显示

css Cordova Chrome Apps中的全屏背景,使用背景大小:封面

在运行时使用phonegap将url添加到iphone中cordova.plist文件中的白名单

cordova+vue 项目打包成Android(apk),启动黑屏问题