Tuesday, May 19, 2015

Фиксим смену ориентации в VisualStudio/Cordova Windows Phone 8.0 приложениях

После перехода на VS2015RC неожиданно обнаружилось, что не работает смена ориентации в приложениях для WP8.0

В остальных операционках всё работает как должно. И сборки из предыдущих версий VS также работают как надо. Причём если выставить заданную ориентацию, то приложение откроется в ней. Не работает именно смена ориентации.

Анализ ситуации показал, что проблема в конфигурационном файле (MainPage.xaml), который впрочем генерируется автоматически.

В отношении ориентации девайса, с разрешенной сменой оной в указанном файле должна быть строчка:

Orientation="Portrait" SupportedOrientations="PortraitOrLandscape"

VS2015RC же при выборе Default ориентации вообще не вставляет ни какой строки в MainPage.xaml, или же после некоторых манипуляций вставляется строка вида

Orientation="Portrait" SupportedOrientations="Portrait"

Что тоже не способствует решению задачи. 
Покопавшись в дебрях nodejs, нашел скрипт w8_parser.js , wp8_parser.js (находится приблизительно тут C:\Users\***\AppData\Roaming\npm\node_modules\vs-tac\node_modules\cordova\4.3.0\node_modules\cordova\node_modules\cordova-lib\src\cordova\metadata\), в котором сделал изменения, установив значения напрямую, завместо  закомментированных:

    var orientation = this.helper.getOrientation(config);
    if (orientation && !this.helper.isDefaultOrientation(orientation)) {

        mainPageXAML.getroot().attrib['Orientation'] = orientation;
        mainPageXAML.getroot().attrib['SupportedOrientations'] = orientation;

        if (!this.helper.isGlobalOrientation(orientation)) {
           delete mainPageXAML.getroot().attrib['SupportedOrientations'];
        }

    } else {
        //delete mainPageXAML.getroot().attrib['SupportedOrientations'];
        mainPageXAML.getroot().attrib['Orientation'] = "Portrait";
        mainPageXAML.getroot().attrib['SupportedOrientations'] = 'PortraitOrLandscape';
//delete mainPageXAML.getroot().attrib['Orientation'];

    }



(осторожно с копированием кода - амперсанды могу заменяться на &)

Это помогло в конкретном случае, но не помогло в общем. Ибо при переходе на таргет Windows Phone 8.1 приложение опять перестало собираться с ошибкой из той же темы - неизвестная установка ориентации.

В этом случае решается всё довольно просто - переводим в режим редактирования кода файл config.xml  и удаляем всё, что связано с ориентацией устройства.

PS Возможно это проблемы установленного у меня Cordova CLI 4.3 и с переходом на CLI5.0 всё будет работать как надо.

PSS Возможно с выходом релиза VS2015 также всё будет работать, как работало на ранних бета версиях VS, без ручного вмешательства в дебри.

PSSS Как вариант может помочь переустановка vs-tac

UPD В VS2015 RTM всё тоже самое, фиксится также.

UPD2 В VS2015U3 / Cordova 5.4.1 всё тоже самое, оно и понятно, legacy код не меняется веками.

No comments: