Команда сборки Cordova 5 удаляет настройки ориентации устройства iOS
В Cordova 5.1.1 при выполнении "cordova build ios" все параметры ориентации устройства, ранее выбранные в проекте XCode, удаляются, а флажки параметров ориентации не устанавливаются.
Несмотря на то, что настройки конфигурации "ориентация" могут предоставлять средства для принудительной ориентации, мне нужно иметь возможность устанавливать различные настройки ориентации для iPad и iPhone.
Все предыдущие версии Cordova (ниже 5) соответствовали этим настройкам. Есть идеи?
Использование XCode 6.3.2.
3 ответа
РЕДАКТИРОВАТЬ:
По словам Abhinav Gujjar, проблема, вызывающая cordova prepare
в ручную замену внесены изменения, внесенные в настройки ориентации в.plist. Однако, AFAIK, до сих пор нет способа установить различные настройки ориентации для iPad и iPhone в config.xml, поэтому ответ ниже.
ОБНОВЛЕНИЕ:
Я создал плагин https://github.com/dpa99c/cordova-custom-config, который завершает описанную ниже зацепку и означает, что в config.xml могут быть определены специфические для платформы пользовательские блоки конфигурации (такие как эти параметры ориентации). Таким образом, вы можете использовать плагин, а не создавать вручную хук ниже.
Это было введено в CLI Cordova 5.0.0 - см. Здесь.
В то же время я использовал хук after_prepare в качестве обходного пути. Просто поместите следующее в <your_project>/hooks/after_prepare/some_file.js
и измените настройки ориентации соответствующим образом:
#!/usr/bin/env node
// Set support for all orienations in iOS .plist - workaround for this cordova bug: https://issues.apache.org/jira/browse/CB-8953
var platforms = process.env.CORDOVA_PLATFORMS.split(',');
platforms.forEach(function(p) {
if (p == "ios") {
var fs = require('fs'),
plist = require('plist'),
xmlParser = new require('xml2js').Parser(),
plistPath = '',
configPath = 'config.xml';
// Construct plist path.
if (fs.existsSync(configPath)) {
var configContent = fs.readFileSync(configPath);
// Callback is synchronous.
xmlParser.parseString(configContent, function (err, result) {
var name = result.widget.name;
plistPath = 'platforms/ios/' + name + '/' + name + '-Info.plist';
});
}
// Change plist and write.
if (fs.existsSync(plistPath)) {
var pl = plist.parseFileSync(plistPath);
configure(pl);
fs.writeFileSync(plistPath, plist.build(pl).toString());
}
process.exit();
}
});
function configure(plist) {
var iPhoneOrientations = [
'UIInterfaceOrientationLandscapeLeft',
'UIInterfaceOrientationLandscapeRight',
'UIInterfaceOrientationPortrait',
'UIInterfaceOrientationPortraitUpsideDown'
];
var iPadOrientations = [
'UIInterfaceOrientationLandscapeLeft',
'UIInterfaceOrientationLandscapeRight',
'UIInterfaceOrientationPortrait',
'UIInterfaceOrientationPortraitUpsideDown'
];
plist["UISupportedInterfaceOrientations"] = iPhoneOrientations;
plist["UISupportedInterfaceOrientations~ipad"] = iPadOrientations;
}
Примечание: вам нужно установить модули узлов plist и xml2js, если у вас их еще нет.
Если вы хотите, вы можете сделать это программно на стороне JS.
Для iOS ориентация может управляться программно путем определения обратного вызова JavaScript в окне
/**
// @param {Number} degree - UIInterfaceOrientationPortrait: 0,
// UIInterfaceOrientationLandscapeRight: 90,
// UIInterfaceOrientationLandscapeLeft: -90,
// UIInterfaceOrientationPortraitUpsideDown: 180
* @returns {Boolean} Indicating if rotation should be allowed.
*/
function shouldRotateToOrientation(degrees) {
return true;
}
Установите допустимые ориентации в вашем config.xml
файл
<platform name="ios">
<preference name="Orientation" value="all" />
</platform>
И добавить shouldRotateToOrientation(degrees)
onDeviceReady: function() {
app.receivedEvent('deviceready');
window.shouldRotateToOrientation = function(degrees) {
//if device an iPad ?
if ( navigator.userAgent.match(/iPad/i) ) {
return true;
}
//else if device an iPhone ?
else if (navigator.userAgent.match(/iPhone/i)) {
if (degrees == 0) { //orientation is portrait
return true;
}
return false; //refuse all other orientations for iPhone
}
return true;
};
}
Эта проблема была исправлена, и теперь вы можете указать ориентацию как "все" в config.xml
<platform name="ios">
<preference name="Orientation" value="all" />
</platform>