Опубликован: 15.05.2013 | Доступ: свободный | Студентов: 264 / 9 | Длительность: 24:25:00
Специальности: Системный архитектор
Лекция 2:

Поиск

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Запуск приложений: сопоставления типов файлов и схем URI

Разработчики приложений для Windows 8 часто спрашивают, может ли одно приложение запускать другое. Ответ на этот вопрос положителен, с некоторыми ограничениями (не удивлены ли вы!). Во-первых, приложения можно запускать только посредством сопоставления типа файла или схемы URI, а не напрямую по названию или через исполняемый файл. Говоря точнее, единственный способ, которым может воспользоваться Windows 8 для того, чтобы запустить другое приложение – это касается и классических приложений – это воспользоваться API Windows.System.Launcher (http://msdn.microsoft.com/library/windows/apps/windows.system.launcher.aspx ), которое представляет две возможности:

  • launchFileAsync – запускает другое приложение, связанное с заданным объектом StorageFile. Необязательный объект LauncherOptions позволяет задавать некоторые подробности (смотрите ниже)
  • launchUriAsync – запускает другое приложение, связанное с заданной схемой URI, снова, с объектом LauncherOptions или без него.

Примечание. И для launchFileAsync, и для launchUriAsync справедливо то, что Windows 8 намеренно блокирует приложения от открытия любого файла или схемы URI, которые обрабатываются системным компонентом. Сценарий, при котором приложение Windows 8 участвует в подобной обработке, недопустим. Материалы "Обработка активации файла" (http://msdn.microsoft.com/library/windows/apps/hh452684.aspx" ) и "Обработка активации протокола" (http://msdn.microsoft.com/library/windows/apps/hh452686.aspx ) содержат список специальных типов файлов и схем URI, о которых идет речь. Схема URI file:// допустима в launchUriAsync, но только для URI, которые принадлежат локальной сети, и тогда, когда в манифесте приложения объявлена возможность Частные сети (клиент и сервер) (Private Networks (Client & Server)).

Результат этих асинхронных методов, который передается в обработчик завершения, имеет логический тип: они возвращают true, если запуск произошел успешно, и false – если нет. Таким образом, если не произойдет катастрофический сбой, такой, как нехватка памяти, при котором асинхронная операция не будет выполнена, эти операции обычно сообщают об успешном результате в обработчик завершения, в логическом значении, указывающем на результат. Вы получите результат false, если попытаетесь запустить файл, который содержит исполняемый код, или другие файлы, заблокированные по соображениям безопасности.

Однако, невозможно знать заранее, каким будет результат. По этой причине используется параметр LauncherOptions (http://msdn.microsoft.com/library/windows/apps/windows.system.launcheroptions.aspx), посредством которого вы можете обеспечить механизмы обратной связи:

  • Опция treatAsUntrusted (логического типа, значение по умолчанию – false) отобразит предупреждение пользователю о том, что будет произведено переключение на другое приложение, если выполнение операции продолжится (сморите изображение ниже). Этот подход полезно использовать, когда вы не уверены в источнике сопоставления, как, например, при открытии URI, найденного внутри PDF-файла или другого документа, и хотите предупредить столкновение пользователя с классическим проявлением недобросовестной рекламы!

  • Опция displayApplicationPicker (логического типа, значение по умолчанию – false) позволяет пользователю выбирать, какое приложение запускать для обработки (смотрите изображение ниже). Отметим, что этот пользовательский интерфейс позволяет пользователю изменять приложение по умолчанию для последующих вызовов. Кроме того, свойство LauncherOptions.ui можно использовать для управления размещением средства выбора приложения.

  • Опции preferredApplicationDisplayName и preferredApplicationPackageFamilyName предоставляют пользователю предложения по загрузке из Магазина Windows конкретных приложений, если ни одно другое приложение не способно обслужить запрос. Это очень полезно с особыми схемами URI или типами файлов, для работы с которыми вы предоставляете приложение.
  • Похожим образом, fallbackUri задает URI, по которому будет перенаправлен пользователь, если не будет найдено приложения для обработки запроса, и у вас нет конкретных предложений приложений из Магазина Windows.
  • И, наконец, для launchUriAsync, опция contentType идентифицирует тип содержимого, ассоциированного с URI, который управляет тем, какое приложение будет запущено. Это особенно полезно, когда URI не содержит конкретной схемы, а просто ссылается на файл в сети, используя схему наподобие http или file, которая обычно обрабатывается браузером для загрузки файлов. С использованием contentType, будет запущено приложение, которое зарегистрировано для данного типа содержимого, а не для схемы. Это приложение, конечно, должно иметь возможность использовать URI для доступа к файлу. Другими словами, эта опция является способом передать URI, а не передать весь файл, в обработчик приложения, о котором известно, что оно может работать с данным URI.

Сценарии 1 и 2 примера "Запуск приложения для сопоставленных типов файлов и протоколов" ( http://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec), предоставляют демонстрацию ипользования этих методов с некоторыми из опций, таким образом, вы сможете увидеть их действие. С другой стороны, как показано в Сценариях 2 и 3 того же примера, это вопрос о том, как приложение связывает себя с типом файла или схемой URI для того, чтобы оно могло быть запущено подобным образом. Эти сопоставления составляют контракт Активация файла (File Activation) и контракт Активация протокола (Protocol activation). В обоих случаях целевое приложение должно объявить о типе файла и/или схеме URI, которые оно намеревается обслуживать, в манифесте, и затем должно предоставить способы активации для этих целей, как мы увидим в следующем разделе.

Опять же, сопоставление файла или схемы URI – это единственное средство, с помощью которого приложение Windows 8 может запустить другое приложение, таким образом, нет гарантии, что вы действительно запустите конкретное приложение. Конечно, чем уникальнее и специфичнее тип файла или схема URI, тем менее вероятно, что у пользователя будет несколько приложений для обработки подобного сопоставления, или даже то, что несколько подобных приложений будут присутствовать в Магазине Windows. На самом деле, разработка уникального интерфейса схемы URI, где схема вполне очевидно специфична для приложения, действительно лучший способ для того, чтобы запущенное Windows 8-приложение могло передавать другому выполнение задачи, так как посредством строки URI можно передать любые данные. Приложение Maps (Карты) в Windows 8, например, поддерживает схему bingmaps для выполнения задач, связанных с картами, поступающих от других приложений. Вы можете представить то же самое для биржевого приложения, для календаря, почтового клиента (помимо mailto) и так далее. Если вы создаете подобную схему и хотите, чтобы другие приложения могли ей пользоваться, вам, конечно, нужно представить документацию с подробностями ее использования, что подразумевает, что другие приложения могут реализовать ту же самую схему, и, таким образом, представлять собой альтернативу в Магазине Windows. Таким образом, нет гарантии, даже с весьма специфической схемой, что вы можете быть уверены в том, что запустите другое известное приложение, но это все, что можно получить от данной возможности .

Обработка активации файла

Для того, чтобы добавить в приложение возможность обрабатывать файлы, для начала пройдите в раздел Объявления (Declaration) редактора манифеста и добавьте Сопоставление типов файлов (File Type Associations), интерфейс Visual Studio для выполнения данной задачи показан на рис. 2.5. У каждого типа файла может быть множество конкретных обозначений (обратите внимание на кнопку Добавить (Add new) ниже раздела Поддерживаемый типы файлов (Supported File Types), например, у файлов формата JPEG могут быть расширения .jpg и .jpeg. Обратите внимание на то, что обработка файлов некоторых типов запрещена для приложений, смотрите их полный список в материале "Обработка активации файла" (http://msdn.microsoft.com/library/windows/apps/hh452684.aspx ).

В группе Свойства (Properties), Отображаемое имя (Display name) – это общее имя для группы типов файлов (это не обязательный параметр; он не нужен, если речь идет лишь об одном типе файла). Параметр Имя (Name), с другой стороны, необходим – это внутренний идентификатор для группы файла, и то, что должно оставаться неизменным в течение всего времени существования приложения, не меняться при обновлениях. В некотором смысле, свойства Имя/Отображаемое имя для группы файлов напоминают настоящее имя, а отдельные типы файлов напоминают псевдонимы – любой из них, в конечном счете, относится к сущности типа файла и к вашему приложению.

Подсказка (Info Tip) – это текст всплывающей подсказки, которая появляется, когда пользователь наводит указатель на файл данного типа и приложение является основным приложением для обработки этого типа файлов. Параметр Значок (Logo) имеет некоторые особенности. Здесь, в Visual Studio, вы просто ссылаетесь на базовое имя для файла изображение, как обычно делается с другими изображениями в манифесте. В проекте же вам следует иметь несколько файлов для одного и того же изображения с различными целевыми размерами (не имеющими отношения к масштабированию разрешения): 16x16, 32x32, 48x48, и 256x256. Пример "Запуск приложения для сопоставленных типов файлов и протоколов" (http://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec ) использует подобные изображения с суффиксами targetsize-* в имени файла . Использование изображений различных размеров помогает Windows предоставлять наилучший опыт взаимодействия на устройствах различных типов.

Интерфейс Объявления (Declaration) > Сопоставление типов файлов (File Type Associations) в редакторе манифеста Visual Studio

Рис. 2.5. Интерфейс Объявления (Declaration) > Сопоставление типов файлов (File Type Associations) в редакторе манифеста Visual Studio

В группе параметров Флаги изменения (Edit Flags) можно управлять тем, будет ли доступно действие Открыть (Open) для загруженных файлов данного типа: установка параметра Безопасное открытие (Open Is Safe) активирует эту команду в различных частях пользовательского интерфейса Windows; установка параметра Всегда небезопасно (Always Unsafe) отключает эту команду. Если оставить оба этих флага неустановленными, доступность команды будет зависеть от того, откуда поступил файл, а так же от других установок системы.

В самой нижней части этого окна вы так же можете установить отдельную начальную страницу (Start page) для обработки активации, однако, обычно используют основной обработчик активации, как показано в js/default.js примера обработки сопоставлений (посмотрите в js/scenario3.js).

Там вы примете вид активации file, в подобном случае eventArgs.detail будет объектом типа WebUIFileActivatedEventArgs (http://msdn.microsoft.com/library/windows/apps/windows.ui.webui.webuifileactivatedeventargs.aspx ), его свойство files содержит массив объектов StorageFile из Windows.System.Launcher.launchFileAsync, и его свойство verb будет иметь значение "open". В ответ, конечно, приложение открывает файл и представляет его содержимое соответствующим образом.

Конечно, так как файл может поступить откуда угодно, воспринимайте его как содержимое, которому нельзя доверять, как мы уже упоминали в разговоре о целевых объектах общего доступа. Избегайте выполнения на основе содержимых таких файлов действий, последствия которых нельзя отменить.

Как и в случае с контрактом Поиск, протестируйте обработку активации файла, когда приложение уже исполняется, и когда оно должно быть запущено. Во всех случаях убедитесь в том, что загружаете параметры приложения и восстанавливаете состояние сеанса, если

 eventArgs.detail.previousExecutionState содержит значение terminated.
Обработка активации протокола

Создание сопоставления со схемой URI очень похоже на сопоставление с типом файла. В разделе редактора манифеста Объявления (Declarations), добавьте объявление Протокол (Protocol), как показано на рис. 2.6.

 Интерфейс Объявления (Declaration) > Протокол (Protocol) в редакторе манифеста Visual Studio

Рис. 2.6. Интерфейс Объявления (Declaration) > Протокол (Protocol) в редакторе манифеста Visual Studio

В разделе Свойства (Properties) свойства Значок (Logo), Отображаемое имя (Display Name) и Имя (Name) имеют то же значение, что и для настройки сопоставления типа файла (смотрите предыдущий раздел). Похожим образом, хотя вы можете задать отдельную начальную страницу, обычно активацию протокола обрабатывают в основном обработчике активации, как показано в js/default.js примера об обработке активации файлов и протоколов (пройдите в js/scenario4.js).

Здесь вы принимаете вид активации protocol, в подобном случае eventArgs.detail является объектом типа WebUIProtocolActivatedEventArgs (http://msdn.microsoft.com/library/windows/apps/windows.ui.webui.webuiprotocolactivatedeventargs.aspx ), его свойство uri содержит URI из Windows.System.Launcher.launchUriAsync.

Снова хочу предупредить, что URI с уникальными схемами могут поступать отовсюду, в том числе – из потенциально вредоносных источников. Опасайтесь любых данных или запросов в URI и старайтесь не выполнять, основываясь на них, необратимых изменений. Например, вы, возможно, можете перейти на новую страницу, но не меняйте записи базы данных, пытаясь выполнить команду eval для чего-либо, переданного в URI.

Тем не менее, сопоставление протокола является основным способом, с помощью которого приожение может, когда это необходимо, предоставить ценные услуги другим приложениям. Встроенное приложение Maps (Карты), например, поддерживает схему URI bingmaps:// и сопоставление с ней, что позволяет вам просто открыть URI соответствующего формата для того, чтобы показать пользователю интерактивную карту вместо того, чтобы пытаться реализовать подобную функциональность самостоятельно. Это похоже на то, как при использовании почтовго клиента применяют схему mailto:; другие приложения могут просто создать интерфейс для схемы URI для работы с другими сервисами и рабочими процессами.

Совет. Для отладки активации для обработки протокола вам нужно иметь возможность запускать приложение в отладчике при активации. Для того, чтобы это сделать, откройте свойства проекта (команда меню Проект > Свойства (Project > Properties) в Visual Studio) и затем в разделе Свойства конфигурации > Отладка (Configuration Properties > Debugging) установить параметр Запустить приложение (Launch Application) в значение Нет (No).

Поставщики средства выбора файлов

Возвращаясь к Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", где мы рассматривали использование средств выбора файлов и папок для получения доступа не только к файловой системе, но и к содержимому, которым управляют другие приложения, или даже к такому, которой создается по запросу другими приложениями. Внесем ясность в этот вопрос: приложения, которые используют средство выбора файлов, делают это для получения объектов StorageFile или StorageFolder для каких-либо целей. Но это не означает, что приложения-поставщики, которые могут быть активированы с помощью средства выбора файлов, обязательно управляют своими данными как файлами или папками. Их задача заключается в том, чтобы упаковать любые данные, которыми они управляют так, чтобы они выглядели, для средства выбора файлов, как файлы или папки.

В Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", например, мы видели, как приложение Windows 8 для работы с камерой может быть использовано для получения фотографий и передачи их с помощью средства выбора файлов. Подобные фотографии не существуют, когда активируется целевое приложение. Вместо этого, оно отображает интерфейс, посредством которого пользователь может создать файл своими силами, который потом будет передан с помощью средства выбора файла. Таким образом, приложение для работы с камерой ускоряет весь процесс по созданию нового изображения, предоставляя эту функцию в точности тогда, когда пользователь пытается выбрать файл изображения. В противном случае пользователь запустил бы приложение Camera (Камера) отдельно, сделал бы фотографию, сохранил бы ее в локальной файловой системе, переключился бы к исходному приложению для того, чтобы запустить средство выбора файлов и найти эту новую фотографию.

Конечно, средство выбора файлов не ограничено фотографиями: оно работает с файлами любых типов, в зависимости от того, что запрашивает вызывающее его приложение. Одно приложение может позволить пользователю просматривать библиотеку музыки, покупать и загружать записи, и передавать полученный файл средству выбора файлов. Другое может выполнять какие-то запросы к базе данных и возвращать результат в виде файла, еще какое-нибудь приложение может позволить пользователю просматривать онлайновую базу данных с сущностями, представляемыми в виде файлов, скрывая детали загрузки и упаковки этих данных в файлы, как и ожидает пользователь от средства выбора файлов. Причем, такое поведение не зависит от того, осуществляется ли работа с локальной файловой системой, с онлайновыми ресурсами или с приложениями, которые создают данные динамически. Возможно создать приложение, которое генерирует или получает данные, похожие на файлы, как приложение Camera (Камера), которое позволяет делать фотографии, или приложение для работы со звуком, которое может записывать новые звуки. В подобном случае, однако, помните что контракт Средство выбора файлов создан для выполнения сравнительно быстрых операций по работе с файлами. По этой причине приложению следует предоставлять лишь базовые средства редактирования данных (наподобие кадрирования фотографии или обрезки звука) в данном контексте.

Как в случае с целевыми объектами контрактов Поиск и Общий доступ, Visual Studio и Blend предоставляют шаблон элемента для поставщиков средства выбора файлов, в частности, это Контракт средства выбора файлов для открытия (File Open Picker contract item), в окне, которое появляется по команде Добавить > Создать элемент (Add > New Item), которое мы видели ранее (этот пункт скрыт выше списка, показанного на рис. 22.4). Этот элемент предоставляет вам базовую структуру для выбора файлов, построенную на основе элемента управления ListView, но не более того. Здесь мы не будем использовать этот шаблон, вместо этого возьмем соответствующие элементы из примеров. Говоря в общем, при обслуживании контракта Средство выбора файлов, приложению следует использовать тот же самый режим просмотра и интерфейс, который оно имеет при обычном запуске, таким образом, сохраняя единообразие опыта работы с ним при обоих сценариях.

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >