Люди на Windows

Windows — это идеальная платформа для сторонних приложений для интеграции своих лучших контактов пользователей. Эта интеграция позволяет пользователям взаимодействовать с персонажами для различных впечатлений от взаимодействия с людьми. Windows теперь предоставляет сторонние приложения WinUI и другие приложения с удостоверением пакета с API для хранения всех контактов.

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

Создание учетной записи UserDataAccount для взаимодействия с пользователями

Начните с создания учетной записи данных пользователя. Сторонние приложения необходимы для создания UserDataAccount с UserDisplayName как "com.microsoft.peoplecontract".

UserDataAccountStore udas =
    await UserDataAccountManager.RequestStoreAsync(UserDataAccountStoreAccessType.AppAccountsReadWrite);
UserDataAccount uda = await udas.CreateAccountAsync("com.microsoft.peoplecontract");

Затем добавьте "com.microsoft.windows.system" в список ExplictReadAccessPackageFamilyNames для учетной записи. Это обеспечит ограниченный доступ сторонних контактов к интерфейсам Windows.

uda.ExplictReadAccessPackageFamilyNames.Add("com.microsoft.windows.system");
await uda.SaveAsync();

Хранение контактов

Первым шагом в хранении контактов является создание списка контактов. Для этого сторонние приложения должны создать новый список контактов в UserDataAccount Windows ContactStore. Приложения могут сохранить тип доступа по умолчанию OtherAppReadAccess для списка контактов, а установка в None предотвратит доступ к этим контактам для других приложений. Полный список доступных типов доступа см. в перечислении ContactListOtherAppReadAccess.

ContactStore store = await ContactManager.RequestStoreAsync(ContactStoreAccessType.AppContactsReadWrite);
this.contactList = await store.CreateContactListAsync(contactListsName, uda.Id);
contactList.OtherAppReadAccess = ContactListOtherAppReadAccess.None;
await contactList.SaveAsync();

При сохранении контакта сторонние приложения должны включать все необходимые сведения, необходимые для работы с Windows для управления контактом.

При хранении контакта требуются следующие поля:

  • FirstName
  • RemoteId
  • DisplayPicture

Следующие поля необязательные:

  • LastName
  • Phones
  • Emails

В этом фрагменте кода показано, как сохранить контакт:

foreach (var appContact in AppContacts)
{
  var cont = new Contact
  {
    FirstName = appContact.FirstName,
    LastName = appContact.LastName,
    RemoteId = appContact.Id,
    SourceDisplayPicture = RandomAccessStreamReference.CreateFromUri(new Uri(appContact.ProfilePicPath)),
    Phones = { new ContactPhone { Number = appContact.Phone } }
  };

  await this.contactList.SaveContactAsync(cont);
}

Примечание.

DisplayNameКонтакт создается с помощью FirstName иLastName. Если фамилия не указана, DisplayName будет идентична строке, предоставленной для первого имени.

Хранение рангов для контактов

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

ContactAnnotationStore annotationStore = await
    ContactManager.RequestAnnotationStoreAsync(ContactAnnotationStoreAccessType.AppAnnotationsReadWrite);
this.contactAnnotationList = await annotationStore.CreateAnnotationListAsync(uda.Id);

Вы можете сохранять рейтинги для лучших контактов, используя аннотации в контактах. Ранги хранятся в рамках ProviderProperties в аннотации контакта. Наряду с рангом, приложения должны установить SupportedOperations в аннотации контакта как Share.

foreach (var appContact in topAppContacts)
{
  Contact contact = await list.GetContactFromRemoteIdAsync(topAppContact.RemoteID);
  var annotation = new ContactAnnotation
  {
    ContactId = contact.Id,
    SupportedOperations = ContactAnnotationOperations.Share
  };
  annotation.ProviderProperties.Add("Rank", rank);
  await annotationsLst.TrySaveAnnotationAsync(annotation);
}

Обновление рангов контактов

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

  1. Удалите ContactAnnotationList.

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

    await this.contactAnnotationList.DeleteAsync();
    
  2. Создайте новый ContactAnnotationList. Выполните действия в разделе "Хранение рейтингов для контактов", чтобы создать новый список аннотаций и сохранить рейтинги для лучших контактов.

Рекомендации по ранжированию

Чтобы максимально повысить релевантность контактов вашего приложения в строке предложений листа общего доступа, выполните следующие принципы ранжирования:

Сортировка по давности и частоте

Рассчитайте ранг как комбинацию:

  • Недавность: Когда пользователь в последний раз взаимодействовал с каждым контактом
  • Частота: как часто пользователь взаимодействует с каждым контактом

Например, контакт, который пользователь написал вчера, может иметь 95 ранг, в то время как контакт, отправленный 2 недели назад, может иметь 60 ранг.

// lastInteraction and interactionCount come from your app's own interaction
// telemetry. The Windows Contact class does not expose interaction history.
private int CalculateRank(DateTime lastInteraction, int interactionCount)
{
    TimeSpan daysSinceLastInteraction = DateTime.Now - lastInteraction;
    int frequencyScore = interactionCount * 10; // Max ~100
    int recencyScore = Math.Max(0, 100 - (daysSinceLastInteraction.Days * 3));

    return (recencyScore + frequencyScore) / 2;
}

Удаление устаревших контактов

Контакты, с которыми пользователь не взаимодействовал в 30 и более дней, следует удалить или значительно снизить рейтинг. Это позволяет рекомендациям оставаться свежими и актуальными:

private async Task PruneStaleContactsAsync()
{
    var now = DateTime.Now;
    var staleCutoff = now.AddDays(-30);
    
    foreach (var contact in this.AllTrackedContacts)
    {
        if (contact.LastInteractionDate < staleCutoff)
        {
            // Remove the annotation or set rank to 0
            var annotation = await GetAnnotationForContactAsync(contact);
            if (annotation != null)
            {
                annotation.ProviderProperties["Rank"] = 0;
                await this.contactAnnotationList.TrySaveAnnotationAsync(annotation);
            }
        }
    }
}

Регулярно обновляйте рейтинг

Запланируйте обновления ранжирования по курсу, который имеет смысл для вашего приложения — ежедневно для приложений для обмена сообщениями, еженедельно для электронной почты или ежемесячно для приложений календаря. При необходимости используйте фоновые задачи:

// Example: Update ranks when the app comes to foreground or on a timer
private async void UpdateRanksOnAppActivated()
{
    var topContacts = GetTopContactsByRecentActivity(50);
    await UpdateAnnotationRanksAsync(topContacts);
}

Добавляйте только явно указанные контакты

Ваше приложение должно внести только те контакты, которые пользователь явно добавил или авторизован. Никогда:

  • Отправка всей адресной книги
  • Автоматически синхронизировать контакты без согласия пользователя
  • Предоставление общего доступа к контактам из корпоративных каталогов без явного разрешения

Попросите разрешение перед хранением контактов в системе "Люди":

private async Task<bool> RequestContactStoreAccessAsync()
{
    // Requesting a writable ContactStore prompts the user for consent.
    // Your app must declare the contacts capability in its manifest.
    ContactStore store = await ContactManager.RequestStoreAsync(
        ContactStoreAccessType.AppContactsReadWrite);
    return store != null;
}

Соблюдение параметров конфиденциальности пользователей

Разрешить пользователям:

  • Выбор контактов для совместного использования с Windows
  • Отказ от интеграции "Люди"
  • Удаление контактов из Windows в любое время
// Provide a setting to disable sync
if (this.ShouldSyncContactsWithWindows)
{
    await SyncContactsAsync();
}
else
{
    // Clear contacts if the user disables sync
    await ClearWindowsContactsAsync();
}

Интеграция с листом общего доступа

Если вы ранжируете контакты и управляете ими в соответствии с приведёнными выше рекомендациями, пользователи увидят наиболее релевантные контакты вашего приложения в строке предложений окна «Поделиться» Windows. Сейчас этот вариант поддерживает только контакты People.

Чтобы убедиться, что ваши контакты отображаются:

  1. Создайте UserDataAccount с помощью DisplayName = "com.microsoft.peoplecontract"
  2. Хранение контактов с обязательными полями (FirstName, RemoteId, DisplayPicture)
  3. Создайте ContactAnnotationList с рангами
  4. Задать SupportedOperations = Share для каждой заметки
  5. Регулярно обновляйте рейтинги с учетом давности и частоты
  6. Удалить устаревшие контакты старше 30 дней

См. Общий доступ к содержимому из вашего приложения и Получение содержимого в вашем приложении, чтобы ознакомиться с полным руководством по интеграции с меню «Поделиться».