Поделиться через


Запуск приложения на удаленном устройстве

В этой статье объясняется, как запустить приложение Windows на удаленном устройстве.

Начиная с Windows 10 версии 1607, приложение UWP может запускать приложение UWP или классическое приложение Windows удаленно на другом устройстве под управлением Windows 10 версии 1607 или более поздней версии, если оба устройства вошли с одной учетной записью Майкрософт (MSA). Это самый простой вариант использования Project Rome.

Функция удаленного запуска обеспечивает взаимодействие с пользователем, ориентированным на задачи; Пользователь может запустить задачу на одном устройстве и завершить ее на другом. Например, если пользователь слушает музыку на телефоне на своем автомобиле, он может передать функции воспроизведения на Xbox One, когда они прибывают домой. Удаленный запуск позволяет приложениям передавать контекстные данные в запущенное удаленное приложение, чтобы выбрать место, в котором была оставлена задача.

Предварительная настройка

Добавление возможности remoteSystem

Чтобы приложение запускалось на удаленном устройстве, необходимо добавить remoteSystem возможность в манифест пакета приложения. С помощью конструктора манифеста пакета его можно добавить, выбрав удаленную систему на вкладке "Возможности" или вручную добавьте следующую строку в файл Package.appxmanifest проекта.

<Capabilities>
   <uap3:Capability Name="remoteSystem"/>
</Capabilities>

Включение общего доступа между устройствами

Кроме того, клиентское устройство должно быть установлено, чтобы разрешить общий доступ между устройствами. Этот параметр, к которому осуществляется доступ в параметрах: общий доступ к системным>интерфейсам на разных устройствах> включен по умолчанию.

Страница параметров общего интерфейса

Поиск удаленного устройства

Сначала необходимо найти устройство, с которым вы хотите подключиться. Подробные сведения о том, как это сделать, рассматриваются удаленные устройства . Здесь мы будем использовать простой подход, который забыл фильтровать по типу устройства или подключения. Мы создадим наблюдатель за удаленными системами, который ищет удаленные устройства и обработчики записи для событий, возникающих при обнаружении или удалении устройств. Это предоставит нам коллекцию удаленных устройств.

Код в этих примерах требует наличия using Windows.System.RemoteSystems инструкции в файлах класса.

private async Task BuildDeviceList()
{
    RemoteSystemAccessStatus accessStatus = await RemoteSystem.RequestAccessAsync();

    if (accessStatus == RemoteSystemAccessStatus.Allowed)
    {
        m_remoteSystemWatcher = RemoteSystem.CreateWatcher();

        // Subscribing to the event raised when a new remote system is found by the watcher.
        m_remoteSystemWatcher.RemoteSystemAdded += RemoteSystemWatcher_RemoteSystemAdded;

        // Subscribing to the event raised when a previously found remote system is no longer available.
        m_remoteSystemWatcher.RemoteSystemRemoved += RemoteSystemWatcher_RemoteSystemRemoved;

        m_remoteSystemWatcher.Start();
    }
}

Первое, что необходимо сделать, прежде чем выполнять удаленный запуск, — это вызов RemoteSystem.RequestAccessAsync(). Проверьте возвращаемое значение, чтобы убедиться, что приложению разрешен доступ к удаленным устройствам. Одна из причин, по которой эта проверка может завершиться ошибкой, заключается в том, что вы не добавили remoteSystem в приложение возможность.

Обработчики событий наблюдателя системы вызываются, когда устройство, с которым мы можем подключиться, обнаруживается или больше недоступно. Эти обработчики событий будут использоваться для хранения обновленного списка устройств, к которым можно подключиться.

private void RemoteSystemWatcher_RemoteSystemRemoved(
    RemoteSystemWatcher sender, RemoteSystemRemovedEventArgs args)
{
    if ( m_deviceMap.ContainsKey(args.RemoteSystemId))
    {
        m_deviceList.Remove(m_deviceMap[args.RemoteSystemId]);
        m_deviceMap.Remove(args.RemoteSystemId);
    }
}

private void RemoteSystemWatcher_RemoteSystemAdded(
    RemoteSystemWatcher sender, RemoteSystemAddedEventArgs args)
{
    m_deviceList.Add(args.RemoteSystem);
    m_deviceMap.Add(args.RemoteSystem.Id, args.RemoteSystem);
}

Мы отслеживаем устройства по идентификатору удаленной системы с помощью словаря. ObservableCollection используется для хранения списка устройств, которые можно перечислить. ObservableCollection также упрощает привязку списка устройств к пользовательскому интерфейсу, хотя в этом примере мы этого не сделаем.

private RemoteSystemWatcher m_remoteSystemWatcher;
private ObservableCollection<RemoteSystem> m_deviceList = new ObservableCollection<RemoteSystem>();
private Dictionary<string, RemoteSystem> m_deviceMap = new Dictionary<string, RemoteSystem>();

Добавьте вызов BuildDeviceList() в код запуска приложения перед попыткой запуска удаленного приложения.

Запуск приложения на удаленном устройстве

Запустите приложение удаленно, передав устройство, которое вы хотите подключить к API RemoteLauncher.LaunchUriAsync. Для этого метода существует три перегрузки. Самый простой, демонстрирующий этот пример, указывает универсальный код ресурса (URI), который активирует приложение на удаленном устройстве. В этом примере URI открывает приложение Maps на удаленном компьютере с трехмерными представлениями Пробела.

Другие перегрузки RemoteLauncher.LaunchUriAsync позволяют указать такие параметры, как URI веб-сайта, чтобы просмотреть, если соответствующее приложение не может быть запущено на удаленном устройстве, и необязательный список имен семейств пакетов, которые можно использовать для запуска URI на удаленном устройстве. Вы также можете предоставить данные в виде пар "ключ-значение". Вы можете передать данные в приложение, которое вы активируют, чтобы предоставить контекст удаленному приложению, например имя песни для воспроизведения и текущее расположение воспроизведения при передаче воспроизведения с одного устройства на другое.

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

if ( m_deviceList.Count > 0)
{
    RemoteSystem SelectedDevice = m_deviceList[0];
    RemoteLaunchUriStatus launchUriStatus = 
        await RemoteLauncher.LaunchUriAsync(
            new RemoteSystemConnectionRequest(SelectedDevice), 
            new Uri("bingmaps:?cp=47.6204~-122.3491&sty=3d&rad=200&pit=75&hdg=165"));
}

Объект RemoteLaunchUriStatus , возвращаемый из RemoteLauncher.LaunchUriAsync(), содержит сведения о том, успешно ли выполнен удаленный запуск, и, если нет, причина, почему.

Справочник по API удаленных систем
Общие сведения о подключенных приложениях и устройствах (Project Rome)
Обнаружение удаленных устройств
В примере удаленных систем показано, как обнаружить удаленную систему, запустить приложение в удаленной системе и использовать службы приложений для отправки сообщений между приложениями, работающими в двух системах.