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


Практическое руководство. Интеграция с уведомлениями Microsoft Graph (UWP для Windows)

С помощью клиентского пакета SDK уведомлений Graph для Windows приложение UWP для Windows может выполнить необходимые действия регистрации, чтобы стать принимающей конечной точкой, которая получает уведомления, публикуемые с вашего сервера приложений и предназначенные для какого-либо пользователя. Затем этот пакет SDK используется для управления уведомлениями на стороне клиента, включая получение полезных данных новых уведомлений, поступивших в клиент, управление состоянием уведомлений и получение журнала уведомлений. Дополнительные сведения о службе уведомлений Microsoft Graph и ее использовании для доставки уведомлений, предназначенных для пользователей, см. в разделе Microsoft Graph Notifications (уведомления Microsoft Graph).

На странице Справочник по API приведены ссылки на справочную документацию, относящуюся к сценариям с использованием уведомлений.

Предварительная настройка для доступа к платформе подключенных устройств для использования уведомлений Graph

Для интеграции уведомлений Graph необходимо выполнить несколько шагов.

  • Регистрация приложения для использования учетных записей Майкрософт или AAD.
  • Подключение к Центру разработки для предоставления удостоверения кроссплатформенного приложения и учетных данных службы push-уведомлений.
  • Добавление пакета SDK и инициализация платформы подключенных устройств.
  • Связывание службы уведомлений с платформой подключенных устройств.

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

Регистрация для аутентификации с помощью учетных записей Майкрософт и AAD

Регистрация для аутентификации с помощью учетных записей Майкрософт (MSA) или Azure Active Directory (AAD) является обязательной для всех компонентов пакета SDK, включая уведомления, за исключением интерфейсов API обмена с устройствами поблизости.

Если у вас нет учетной записи Майкрософт и вы хотите ее использовать, зарегистрируйтесь на сайте account.microsoft.com.

Далее, если вы используете учетные записи Майкрософт в качестве платформы аутентификации и идентификации пользователей, необходимо зарегистрировать свое приложение в корпорации Майкрософт, следуя указаниям на портале регистрации приложений (если у вас нет учетной записи разработчика Майкрософт, сначала необходимо ее создать). Вы должны получить строку идентификатора клиента для приложения. Обязательно запомните ее расположение или сохраните ее. Позже она потребуется при подключении службы уведомлений Graph. Обратите внимание на то, что приложение, использующее аутентификацию MSA, должно быть зарегистрировано как приложение Live SDK, как показано ниже. Портал регистрации приложений

Если вы создаете приложение, которое использует AAD в качестве платформы аутентификации и идентификации рабочих или учебных учетных записей, его необходимо зарегистрировать с помощью библиотек аутентификации Azure Active Directory, чтобы получить идентификатор клиента, как показано ниже. Портал регистрации AAD При создании регистрации приложения существует несколько разрешений, необходимых для использования уведомлений Graph и других возможностей платформы подключенных устройств. Ознакомьтесь с ними ниже. Портал регистрации AAD — параметры — необходимые разрешения

  • Добавьте разрешение для входа пользователя, как показано ниже. Необходимые разрешения — профиль пользователя AAD
  • Добавьте разрешения для службы управления, чтобы получать данные устройств, как показано ниже. Необходимые разрешения — устройства
  • Добавьте разрешение для уведомлений Graph в области интерфейсов API службы веб-каналов действий, как показано ниже. Необходимые разрешения — устройства
  • Наконец, если вы создаете кроссплатформенное приложение, включая приложение UWP для Windows, обязательно добавьте разрешение для службы уведомлений Windows, как показано ниже. Необходимые разрешения — WNS

Далее необходимо подключиться к Центру разработки для Microsoft Windows, чтобы получить доступ к платформе подключенных устройств. Это необходимо для интеграции возможностей работы на нескольких устройствах, включая использование уведомлений Graph. Если вы это уже сделали, перейдите к следующему разделу.

Регистрация приложения в Центре разработки для Microsoft Windows для работы на нескольких устройствах

Далее необходимо зарегистрировать свое приложение для использования возможностей работы на нескольких устройствах, предлагаемых панелью мониторинга для разработчиков Майкрософт. Эта процедура отличается от регистрации приложения для использования учетных записей Майкрософт и AAD, описанной выше. Основная цель этого процесса — сопоставить удостоверения приложения для конкретных платформ с удостоверением кроссплатформенного приложения, которое распознается платформой подключенных устройств и в то же время позволяет службе уведомлений Microsoft Graph отправлять уведомления с помощью собственных служб push-уведомлений, соответствующих каждой платформе ОС. В этом случае это позволяет службе уведомлений Graph отправлять уведомления на конечные точки приложения UWP для Windows с помощью WNS (служба уведомлений Windows). Перейдите к панели мониторинга Центра разработки, выберите "Cross-Device Experiences" (Работа на нескольких устройствах) в области навигации слева и выберите "Configure a new cross-device app" (Настроить новое приложение для нескольких устройств), как показано ниже. Панель мониторинга Центра разработки — работа на нескольких устройствах

Процесс подключения в Центре разработки включает в себя следующие действия.

  • Выберите поддерживаемые платформы. Выберите целевые платформы для своего приложения, поддерживающего работу на нескольких устройствах. В случае интеграции уведомлений Graph можно выбрать Windows, Android и (или) iOS. Это показано ниже. Работа на нескольких устройствах — поддерживаемые платформы

  • Укажите идентификаторы приложения для каждой из целевых платформ для своего приложения. Это показано ниже. Работа на нескольких устройствах — идентификаторы приложения

Примечание.

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

  • Введите или выберите идентификаторы приложения из данных регистрации приложения для использования учетных записей Майкрософт и (или) AAD. Эти идентификаторы клиента, соответствующие регистрации приложения для использования учетных записей Майкрософт или AAD, были получены на предыдущих шагах регистрации приложения в этих службах, описанных выше. Это показано ниже. Работа на нескольких устройствах — регистрация приложения для использования учетных записей Майкрософт и AAD
  • Уведомления Graph и другие возможности платформы подключенных устройств используют каждую из собственных платформ уведомлений для основных платформ, чтобы отправлять уведомления на конечные точки клиента приложения, а именно WNS (для приложений UWP для Windows), GCM (для Android) и APNs (для iOS). Укажите свои учетные данные для этих платформ уведомлений, чтобы служба уведомлений Graph могла доставлять уведомления для сервера приложений, когда вы публикуете уведомления, предназначенные для пользователей. Это показано ниже. Работа на нескольких устройствах — учетные данные службы push-уведомлений

Примечание.

Для приложений UWP для Windows включение службы push-уведомлений WNS является необходимым условием, чтобы использовать уведомления Microsoft Graph. Дополнительные сведения см. в разделе Обзор служб push-уведомлений Windows (WNS). После завершения подключения можно ввести учетные данные службы push-уведомлений для платформы подключенных устройств через Центр разработки для Windows.

  • Последним шагом является проверка домена приложения для нескольких устройств. Она позволяет подтвердить, что ваше приложение является владельцем этого домена, который выполняет роль удостоверения приложения на нескольких устройствах для зарегистрированного вами приложения. Это показано ниже.
    Работа на нескольких устройствах — проверка домена Теперь все настроены с подключением! Вы можете перейти к следующему разделу.

Далее необходимо добавить пакет SDK для Project Rome в проект и инициализировать платформу подключенных устройств. Если вы это уже сделали, перейдите к следующему разделу.

Добавление пакета SDK

Вставьте приведенные ниже ссылки на репозиторий в файл build.gradle в корне проекта.

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
        maven { url 'https://projectrome.bintray.com/maven/' }
    }
}

Затем вставьте приведенную ниже зависимость в файл build.gradle, который находится в папке проекта.

dependencies { 
    ...
    implementation 'com.microsoft.connecteddevices:connecteddevices-sdk:0.11.0'
}

Если вы хотите использовать ProGuard в приложении, добавьте правила ProGuard для этих новых интерфейсов API. Создайте файл с именем proguard-rules.txt в папке приложения проекта и вставьте содержимое ProGuard_Rules_for_Android_Rome_SDK.txt.

В элемент <manifest> в файле AndroidManifest.xml проекта добавьте следующие разрешения (если они еще не существуют). Это обеспечит приложению разрешение для подключения к Интернету и включения обнаружения Bluetooth на устройстве.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Примечание.

Разрешения для Bluetooth необходимы только для использования обнаружения Bluetooth. Они не нужны для других возможностей платформы подключенных устройств. Кроме того, ACCESS_COARSE_LOCATION требуется только для пакетов SDK для Android версии 21 и более поздних версий. В пакетах SDK для Android версии 23 и более поздних версиях разработчик должен также предлагать пользователю предоставить доступ к расположению во время выполнения.

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

import com.microsoft.connecteddevices.*;

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

Инициализация платформы подключенных устройств

Прежде чем можно будет использовать какие-либо возможности подключенных устройств, платформу необходимо инициализировать в приложении. Действия по инициализации должны осуществляться в методе onCreate или onResume класса main, так как они должны быть выполнены перед тем, как смогут быть реализованы другие сценарии с применением подключенных устройств.

Необходимо создать экземпляр класса Platform. Конструктор Platform принимает три параметра: Context для приложения, NotificationProvider и UserAccountProvider.

Параметр NotificationProvider требуется только для определенных сценариев. В случае использования уведомлений Microsoft Graph он является обязательным. Пока что оставьте для него значение null и узнайте, как позволить клиентскому пакету SDK обрабатывать входящие уведомления для пользователей, передаваемые по собственным каналам push-уведомлений, ознакомившись со следующим разделом.

Параметр UserAccountProvider необходим для передачи маркера доступа OAuth 2.0 для текущего обращения пользователя к платформе подключенных устройств. Он будет вызван при первом выполнении приложения и по истечении срока действия маркера обновления, управляемого платформой.

Чтобы упростить подключение к платформе для разработчиков, мы предоставили реализации поставщика учетных записей для iOS и Android. Эти реализации, приведенные в примере поставщика аутентификации, можно использовать для получения маркера доступа OAuth 2.0 и маркера обновления для приложения.

Настройка аутентификации и управление учетными записями

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

Если вы хотите реализовать интерфейс ConnectedDevicesAccountManager самостоятельно, запишите следующие сведения.

Если вы используете учетную запись Майкрософт, необходимо включить следующие области в запрос на вход: "wl.offline_access", "ccs.ReadWrite", "dds.read", "dds.register", "wns.connect", "asimovrome.telemetry" и "https://activity.windows.com/UserActivity.ReadWrite.CreatedByApp".

Если вы используете учетную запись AAD, необходимо запросить следующие аудитории: "https://cdpcs.access.microsoft.com", "https://cs.dds.microsoft.com", "https://wns.windows.com/" и "https://activity.microsoft.com".

Примечание.

Учетные записи Azure Active Directory (AAD) не поддерживаются интерфейсами API Device Relay.

Вне зависимости от того, применяете вы предоставленную реализацию ConnectedDevicesAccountManager или нет, если вы используете AAD, то потребуется указать следующие разрешения в регистрации приложения на портале Azure (portal.azure.com > Azure Active Directory > "Регистрация приложений"):

  • Служба веб-канала действий Майкрософт
    • доставка и изменение уведомлений пользователя для этого приложения;
    • чтение и запись действий приложений в веб-канале действий пользователей;
  • Служба уведомлений Windows
    • подключение устройства к службе уведомлений Windows;
  • Служба каталогов устройств Майкрософт
    • просмотр списка устройств;
    • добавление в список устройств и приложений;
  • Служба команд Майкрософт
    • взаимодействие с устройствами пользователей;
    • чтение устройств пользователей.

В следующем коде mSignInHelper ссылается на MSAAccountProvider, также инициализированный ниже. Этот предоставленный класс реализует интерфейс UserAccountProvider.

private MSAAccountProvider mSignInHelper;

// ...

// Create sign-in helper from helper lib, which does user account and access token management for us
// Takes two parameters: a client id for msa, and the Context
mSignInHelper = new MSAAccountProvider(Secrets.MSA_CLIENT_ID, getContext());

// add an event listener, which changes the button text when account state changes
mSignInHelper.addUserAccountChangedListener(new EventListener<UserAccountProvider, Void>() {
    @Override
    public void onEvent(UserAccountProvider provider, Void aVoid){
        if (mSignInHelper.isSignedIn()) {
            // update the UI indicating a user is signed in.
        }
        else
        {
            // update the UI indicating a user is not signed in.
        }
    }
});

Теперь вы можете создать экземпляр Platform. Вы можете поместить приведенный ниже код в отдельный вспомогательный класс.

// Platform helper class:

private static Platform sPlatform;

//...

// This is the main Platform-generating method
public static synchronized Platform getOrCreatePlatform(Context context, UserAccountProvider accountProvider, NotificationProvider notificationProvider) {
    // check whether the local platform variable is already initialized.
    Platform platform = getPlatform();

    if (platform == null) {
        // if it is not initialized, do so:
        platform = createPlatform(context, accountProvider, notificationProvider);
    }
    return platform;
}

// gets the local platform variable
public static synchronized Platform getPlatform() {
        return sPlatform;
}

// creates and returns a new Platform instance
public static synchronized Platform createPlatform(Context context, UserAccountProvider accountProvider, NotificationProvider notificationProvider) {
    sPlatform = new Platform(context, accountProvider, notificationProvider);
    return sPlatform;
}

В класс main, в котором инициализируется mSignInHelper, добавьте следующий код.

private Platform mPlatform;

//...

mPlatform = PlatformHelperClass.getOrCreatePlatform(this, mSignInHelper, null);

Когда приложение завершает работу на переднем плане, следует завершить работу платформы.

mPlatform.shutdownAsync();

Наконец, настройте свое приложение для получения push-уведомлений. Если вы это уже сделали, перейдите к следующему разделу.

Свяжите платформу подключенных устройств с собственной службой push-уведомлений для каждой мобильной платформы.

Как упоминалось ранее, клиентам приложения необходимо передать сведения о собственном конвейере push-уведомлений, используемом для каждой мобильной платформы, в клиентский пакет SDK и на платформу подключенных устройств во время регистрации. Это позволит службе уведомлений Graph могла передавать уведомления на каждую конечную точку клиента приложения, когда сервер приложений публикует уведомление для пользователя интерфейсы API Microsoft Graph.

На описанных ранее этапах вы инициализировали платформу с помощью параметра null notificationProvider. Сейчас нужно создать и передать объект, реализующий NotificationProvider. Первое, на что стоит обратить внимание, это метод getNotificationRegistrationAsync, который должен возвращать экземпляр NotificationRegistration. NotificationRegistration отвечает за предоставление платформе подключенных устройств маркера доступа (и связанных сведений) для службы уведомлений.

private NotificationRegistration mNotificationRegistration;

// ...

/**
* NotificationRegistration is constructed with four parameters:
* Type: This is the notification platform type.
* Token: This is the string that GCM or FCM sends to your registration intent service.
* SenderId: This is the numeric Sender ID that you received when you registered your app for push notifications.
* DisplayName: This should be the name of the app that you used when you registered it on the Microsoft dev portal. 
*/
mNotificationRegistration = new NotificationRegistration(NotificationType.FCM, token, FCM_SENDER_ID, "MyAppName");

Укажите эту регистрацию в реализации NotificationProvider. Затем вызов инициализации Platform должен предоставить локальному экземпляру Platform доступ к службе push-уведомлений, позволяя приложению получать данные от службы уведомлений Microsoft Graph на стороне сервера.

Передача входящих push-уведомлений в клиентский пакет SDK

Теперь следует расширить прослушиватель класса собственной службы прослушивателя (в данном случае это FirebaseMessagingService, так как в этом руководстве используется Firebase Cloud Messaging) с помощью специальной перегрузки метода onMessageReceived (метод обработки уведомлений).

Ввиду соблюдения соответствия требованиям, соображений безопасности и потенциальных оптимизаций входящее уведомление Google Cloud Messaging, поступающее от службы уведомлений Graph на стороне сервера, может быть просто сигналом, который не содержит каких-либо данных, изначально опубликованных сервером приложений. Получение фактического содержимого уведомления, опубликованного сервером приложений, защищено интерфейсами API клиентского пакета SDK. По этой причине пакет SDK может предоставить последовательный шаблон программирования, в котором клиент приложения всегда передает входные полезные данные Google Cloud Messaging в пакет SDK. Благодаря этому пакет SDK может определить, относится ли это уведомление к сценариям платформы подключенных устройств (в случае, если собственный канал Google Cloud Messaging для Android используется клиентом приложения для других целей), а также каким сценариям и возможностям соответствует это входящее уведомление (уведомления Graph, действия пользователя и т. д.). Затем клиентом приложения может быть выполнена специальная логика для обработки различного типа сценариев.

/**
* Check whether it's a Connected Devices Platform notification or not.
* If it is a Connected Devices Platform notification, it will notify the apps with the information in the notification.
* @param from describes message sender.
* @param data message data as String key/value pairs.
*/
@Override
public void onMessageReceived(String from, Bundle data) {
    Log.d(TAG, "From: " + from);

    // Ensure that the Platform is initialized here before going on
    // ...

    // This method passes the data to the Connected Devices Platform if is compatible.
    if (!NotificationReceiver.Receive(data)) {
        // a value of false indicates a non-Rome notification
        Log.d(TAG, "GCM client received a message that was not a Rome notification");
    }
}

Теперь ваше приложение может обрабатывать уведомления от платформы подключенных устройств.

Инициализация канала уведомлений Graph

В общем пакет SDK позволяет вашему приложению подписаться на различные каналы, чтобы получать различного типа данные пользователей и управлять этими данными, включая уведомления Graph, действия пользователей и многое другое. Для их хранения и синхронизации используется UserDataFeed. UserNotification — это класс и тип данных, соответствующий уведомлению для пользователя, отправленного с помощью службы уведомлений Graph. Чтобы интегрировать уведомления Graph и начать прием UserNotification, публикуемых сервером приложений, необходимо сначала инициализировать веб-канал данных пользователя, создав UserNotificationChannel. Это действие следует рассматривать как инициализацию платформы, описанную выше. Оно должно проверяться и, возможно, повторяться каждый раз, когда приложение перемещается на передний план (но не перед инициализацией платформы).

Создайте UserNotificationReader для получения входящих UserNotifications и доступа к журналу UserNotification.

При наличии ссылки на UserNotificationChannel вам потребуется UserNotificationReader, чтобы пакет SDK мог получить фактическое содержимое уведомления с сервера. В данном случае UserNotificationReader обеспечивает доступ клиента приложения к этому веб-каналу данных для получения последних полезных данных уведомления через прослушиватель событий или для обращения к полной коллекции UserNotification, которую можно использовать как модель представления для журнала уведомлений пользователя.

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


public async Task SetupChannel()
{
    var account = m_accoutProvider.SignedInAccount;

    if (m_feed == null)
    {
        await Task.Run(() =>
        {
            lock (this)
            {
                if (m_feed == null)
                {
                    m_platform = new ConnectedDevicesPlatform(m_accoutProvider, this);

                    Logger.Instance.LogMessage($"Create feed for {account.Id} {account.Type}");
                    m_feed = new UserDataFeed(account, m_platform, "graphnotifications.sample.windows.com");
                    m_feed.SyncStatusChanged += Feed_SyncStatusChanged;
                    m_feed.AddSyncScopes(new List<IUserDataFeedSyncScope>
                    {
                        UserNotificationChannel.SyncScope
                    });

                    m_channel = new UserNotificationChannel(m_feed);
                    m_reader = m_channel.CreateReader();
                    m_reader.DataChanged += Reader_DataChanged;
                }
            }
        });
    }
}

Получение объектов UserNotification

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

Совет

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

В приведенном ниже коде показано, как пример приложения выбирает отображение локального всплывающего уведомления для всех входящих объектов UserNotification в состоянии "Active" и удаляет соответствующее уведомление из пользовательского интерфейса в представлении приложения, если уведомление удалено.


private void Reader_DataChanged(UserNotificationReader sender, object args)
{
    ReadNotifications(sender, true);
}

private async void ReadNotifications(UserNotificationReader reader, bool showToast)
{
    var notifications = await reader.ReadBatchAsync(UInt32.MaxValue);

    foreach (var notification in notifications)
    {

        if (notification.Status == UserNotificationStatus.Active)
        {
            m_newNotifications.RemoveAll((n) => { return (n.Id == notification.Id); });
            if (notification.UserActionState == UserNotificationUserActionState.NoInteraction)
            {
                // new notification, show this to user using the Windows local toast notification APIs
                m_newNotifications.Add(notification);
                if (!string.IsNullOrEmpty(notification.Content) && showToast)
                {
                    ShowToastNotification(BuildToastNotification(notification.Id, notification.Content));
                }
            }

            m_historicalNotifications.RemoveAll((n) => { return (n.Id == notification.Id); });
            m_historicalNotifications.Insert(0, notification);
        }
        else
        {
            // Existing notification is marked as deleted, remove from display
            m_newNotifications.RemoveAll((n) => { return (n.Id == notification.Id); });
            m_historicalNotifications.RemoveAll((n) => { return (n.Id == notification.Id); });
            RemoveToastNotification(notification.Id);
        }
    }
}

Обновление состояния существующего объекта UserNotification

В предыдущем разделе мы уже упоминали, что иногда изменение UserNotification, полученное из средства чтения, может быть обновлением состояния существующего объекта UserNotification, вне зависимости от того, помечен он как "закрытый" или "прочитанный". В этом случае клиент приложения может выбрать, что делать дальше. Например, он может выполнить универсальное закрытие, удалив соответствующее видимое уведомление на этом устройстве. Если вернуться немного назад, часто именно клиент приложения изначально является инициатором этого изменения объекта UserNotification, только на другом устройстве. Можно выбрать время для обновления состояния объектов UserNotifications, но обычно они обновляются, когда пользователь реагирует на соответствующее видимое уведомление на этом устройстве или когда уведомление подвергается дальнейшей обработке пользователем в специально реализованном вами интерфейсе приложения. Ниже приведен пример такого потока операций. Сервер приложений публикует уведомление, адресованное пользователю А. Пользователь A получает это уведомление на своем компьютере и телефоне, на которых установлены клиенты приложения. Пользователь щелкает это уведомление на компьютере и переходит в приложение, чтобы выполнить соответствующую задачу. Клиент приложения на этом компьютере отправит вызов к пакету SDK платформы подключенных устройств, чтобы обновить состояние соответствующего объекта UserNotification. Это позволит синхронизировать это обновление на всех устройствах данного пользователя. Другие клиенты приложения, получив это обновление состояния в реальном времени, удалят соответствующее видимое оповещение, сообщение или всплывающее уведомление из центра уведомлений, области уведомлений или центра действий на устройстве. Так происходит универсальное закрытие уведомлений на устройствах пользователя.

Совет

Класс UserNotification в настоящее время предоставляет два типа обновления состояния. Вы можете изменить UserNotificationReadState или UserNotificationUserActionState и определить собственную логику, выполняемую после обновления уведомлений. Например, можно помечать состояние UserActionState как "активированное" или "закрытое" и выводить сводку по этому значению, чтобы реализовать универсальное закрытие. В качестве альтернативного или дополнительного метода можно помечать состояние ReadState как "прочитанное" и "непрочитанное", и на основе этого состояния определять, какие уведомления должны отображаться в представлении журнала уведомлений в приложении. Ниже приведен фрагмент кода, в котором показано, как пометить состояние UserNotificationUserActionState уведомления как "Dismissed" (Закрыто).

public async void Dismiss(string id)
{
    var notification = m_newNotifications.Find((n) => { return (n.Id == id); });
    if (notification != null)
    {
        notification.UserActionState = UserNotificationUserActionState.Dismissed;
        await notification.SaveAsync();
    }
}