Приложение Windows Store WinJS - как передать строку запроса, параметры хеша на стартовую страницу

У нас есть веб-приложение SPA, которое мы пытаемся преобразовать в проект WinJS в качестве собственного приложения Магазина Windows. По большей части Javascript работает, за исключением манипуляций с DOM, которые считаются небезопасными.

Одна вещь, которая не кажется очевидной, это то, как стартовая страница приложения (например, index.html) может быть снабжена строкой запроса и параметрами хэша? Главная страница нашего сайта разработана, чтобы вести себя по-разному в зависимости от параметров.

например, index.html? contextId = xxxxx # enviroment = xxxxx

Я попытался изменить значение в package.appxmanifest безрезультатно. Это вызовет ошибки в строках запроса, а параметры хеша не будут сохраняться.

ОБНОВЛЕНИЕ: История проекта

Кратко о том, что делает наше приложение, а затем о том, почему вышеуказанное наивное желание не сработает, и ответ ниже, как мы решили эту проблему.

Наше веб-приложение - это высокодинамичное приложение, управляемое данными, которое полностью полагается на данные, чтобы выяснить, что следует отображать. Поэтому параметр? ContextId = xxxxx настолько важен, что он сообщает нашей системе загружать данные, что дополнительно информирует о том, какие типы визуальных компонентов загружать, и рекурсивно формирует совершенно разные пользовательские интерфейсы.

Поэтому мы стремились найти некоторые средства для предоставления этих параметров, таких как традиционные параметры командной строки, одному и тому же исполняемому файлу для создания различных пользовательских интерфейсов. И, таким образом, различные "приложения" путем простых изменений этих параметров. Подобно механизму "config transform" для web.config в веб-проектах ASP.NET, это было бы очень кстати.

Однако дальнейшие испытания показали, что это невозможно; один проект приложения магазина Windows имеет GUID, который входит в комплект поставки приложения. Сборка одного и того же проекта несколько раз с разными "конфигурациями сборки" будет означать просто перезапись предыдущей установки, поскольку это одно и то же приложение с увеличивающимися номерами версий. Ответ подробно описывает, как мы пошли по этому поводу.

2 ответа

Решение

Первым шагом является преобразование нашего проекта Магазина Windows (8.1) в структуру универсального приложения, которая затем будет выделять отдельный проект Windows Phone WinJS (это хорошо, когда мы хотим настроить таргетинг на Windows Phone позже) и общий проект.

Практически все из проекта Магазина Windows перемещается в общий проект (включая default.html или index.html). В проекте Магазина Windows остается настроенный файл config.js с параметрами

window.customWin8 = {
    contextId: xxxxxxxxxx,
    customParam: 'xxxxxxxxxx'
};

Нижестоящие модули, которые определяют параметры строки запроса / хеш-функции, затем прибегнут к этому альтернативному объекту, если он существует для сбора необходимых данных.

Теперь для каждого отличающегося приложения, которое мы хотим развернуть, на данный момент может потребоваться отдельный проект Магазина Windows, поэтому он получает собственный GUID и не конфликтует с другими приложениями. Все эти проекты будут ссылаться на один и тот же общий проект благодаря универсальной структуре, которую предоставляет Visual Studio. Единственным недостатком является то, что Visual Studio 2013 не имеет прямого метода пользовательского интерфейса для создания этой ссылки на общий ресурс и должен быть ручным кодом в файле jsproj.

<Import Project="..\Common.Shared\Common.Shared.projitems" Label="Shared" />

С этой настройкой они могут все собрать и упаковать с их изолированной "конфигурацией сборки".

Приложения Магазина Windows не работают с параметрами URI при запуске из их основной плитки. В этом случае вы должны убедиться, что в приложении по умолчанию установлены подходящие значения, например, если вы предполагали указать значения по умолчанию в манифесте, а затем использовать значения по умолчанию в обработчике активации приложения для случая ActivationKind.launch, когда eventObject.detail.arguments пустой.

Есть два других способа запустить приложение, которое может предоставить другие аргументы.

Первый - запустить через вторичную плитку. Когда вы создаете плитку из приложения (которая зависит от согласия пользователя), вы предоставляете аргументы запуска. В вашем обработчике активации для ActivationKind.launch эти аргументы будут находиться в свойстве eventObject.detail.arguments.

Во-вторых, запустить приложение через ассоциацию URI. Для этого вы используете пользовательскую схему, которая объявлена ​​в манифесте. Затем приложение увидит ActivationKind.protocol, а eventObject.detail.uri будет содержать полный URI, включая любые параметры. Запуск URI можно выполнить из другого приложения, введя URI в адресную строку браузера или с помощью ярлыка, который пользователь может настроить на начальном экране.

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