Команда сборки 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>

Документы

Другие вопросы по тегам