2015-06-15 12 views
5

W Cordova 5.1.1 podczas wykonywania "cordova build ios" wszelkie ustawienia orientacji urządzenia wybrane wcześniej w projekcie XCode są usuwane, a pola wyboru ustawień orientacji są niezaznaczone.Polecenie Cordova 5 build usuwa ustawienia orientacji urządzenia iOS

Podczas gdy preferencja konfiguracji "orientacji" może zapewniać orientację wymuszoną, muszę mieć możliwość ustawienia różnych preferencji orientacji dla iPada i iPhone'a.

Wszystkie poprzednie wersje Cordova (poniżej 5) przestrzegały tych ustawień. Jakieś pomysły?

Korzystanie z XCode 6.3.2.

Odpowiedz

4

EDIT:

Według @Abhinav Gujjar kwestia powodując cordova prepare nadpisać ręcznych zmian dokonanych w ustawieniach orientacja w .plist został naprawiony. Jednak AFAIK nadal nie ma możliwości ustawienia różnych preferencji orientacji dla iPada i iPhone'a w pliku config.xml, więc poniżej znajduje się odpowiedź.

UPDATE:

stworzyłem wtyczkę cordova-custom-config, który owija się haczyk poniżej i oznacza bloki zwyczaj konfiguracyjne specyficzne dla platformy (takie jak te ustawienia orientacyjnie) można zdefiniować w config.xml. Możesz więc użyć wtyczki zamiast ręcznie tworzyć hak poniżej.


Zostało to wprowadzone w Cordova 5.0.0 CLI - see here.

W międzyczasie używam haka after_prepare jako obejścia. Wystarczy umieścić następujące w <your_project>/hooks/after_prepare/some_file.js i zmienić ustawienia orientacji odpowiednio:

#!/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; 
} 

Uwaga: trzeba zainstalować moduły plist i xml2js węzłów, jeśli nie masz ich.

+0

To rozwiązanie sprawdza się doskonale Dave. Na początku zainstalowałem plist i xml2js bez sudo i miałem problemy. Po odinstalowaniu obu i ponownym zainstalowaniu za pomocą sudo wszystko działało idealnie.Dzięki jeszcze raz. – sdesapio

3

JEŚLI chcesz, możesz to programowo po stronie JS.

Dla iOS, orientację można programowo kontrolowane poprzez zdefiniowanie javascript zwrotna na oknie

/** 
// @param {Number} degree - UIInterfaceOrientationPortrait: 0, 
// UIInterfaceOrientationLandscapeRight: 90, 
// UIInterfaceOrientationLandscapeLeft: -90,  
// UIInterfaceOrientationPortraitUpsideDown: 180 
* @returns {Boolean} Indicating if rotation should be allowed. 
*/ 
function shouldRotateToOrientation(degrees) { 
    return true; 
} 

Set dozwolone orientacje w pliku

<platform name="ios"> 
    <preference name="Orientation" value="all" /> 
</platform> 

config.xml i dodać 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; 
    }; 
} 
+0

A gdzie wyrzucasz ten kod? Tylko w pliku index.html aplikacji AngularJS? –

+1

Edytowałem swoją odpowiedź, to może ci pomóc – Niko

+0

Dziękuję bardzo za kontynuację. Miałem trochę czasu z tym. Uaktualniłem wersję wtyczki Cordo i iOS w mojej aplikacji i złamałem rotację orientacji - do tego przynajmniej. –

0

Ten problem został rozwiązany i można teraz określić orientację jako 'wszystko' w config.xml

<platform name="ios"> 
     <preference name="Orientation" value="all" /> 
</platform> 

Docs

+0

Błąd powodując nadpisanie preferencji orientacji mogło zostać naprawione, ale pierwotne pytanie brzmiało "Muszę mieć możliwość ustawienia różnych preferencji orientacji dla iPada i iPhone'a" i AFAIK to nadal nie jest możliwe do zrobienia przy użyciu ustawień w pliku config.xml – DaveAlden

+0

Masz rację - OP chce różnych specyfikacji dla typów urządzeń. Przyjechałem tutaj, ponieważ blokował mnie portret. Zgaduję, że byłem podekscytowany, że to zostało naprawione. –

+0

Nadal dobrze wiedzieć, że błąd został naprawiony - dziękuję za aktualizację :-) – DaveAlden

Powiązane problemy