Klasyfikowanie kontaktów dla Udostępniania w systemie Windows

Aplikacje mogą przypisywać rangi swoim najważniejszym kontaktom, dodając adnotacje kontaktowe dla Windows Share. W tym artykule opisano tworzenie listy adnotacji, przechowywanie rankingów za pomocą operacji Share, aktualizowanie listy rankingowej i najlepsze praktyki dotyczące rankingowania.

Przed rozpoczęciem dodaj swoje kontakty do systemu Windows.

Przechowywanie rang dla kontaktów

Możesz utworzyć listę adnotacji dla UserDataAccount elementu , aby przechowywać rangi dla kontaktów. Aplikacje mogą przechowywać rangi dla swoich najważniejszych kontaktów, dodając adnotacje do kontaktów. Te adnotacje są przechowywane jako część listy adnotacji w bazie kontaktów.

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

Rankingi dla najważniejszych kontaktów można przechowywać przy użyciu adnotacji w kontaktach. Rangi są przechowywane w ramach właściwości ProviderProperties w adnotacji kontaktu. Oprócz rangi aplikacje muszą ustawić SupportedOperations w adnotacji kontaktowej jako 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 this.contactAnnotationList.TrySaveAnnotationAsync(annotation);
}

Wartość referencyjna rangi

Aspect Guidance
Klucz właściwości "Rank"w słowniku ProviderPropertiesadnotacji
Typ wartości Nieujemna liczba całkowita.
Direction Niższe wartości mają pierwszeństwo na liście w Twojej aplikacji. Ranga 0 nie jest "ignorowana"; jest uporządkowana według tej samej kolejności typu lower-value-first.
Unikatowość Przypisz unikatową rangę do każdego kontaktu na liście. Zachowanie w przypadku duplikujących się rang nie jest określone.
Scope Pozycje Twojej aplikacji określają priorytet tylko na Twojej własnej liście. Windows odczytuje wszystkie Share adnotacje i używa logiki wewnętrznej na podstawie użycia do porządkowania kontaktów w aplikacjach. Odczytywanie wszystkich adnotacji jest niezależne od liczby sugestii wyświetlanych przez system Windows.
Kto definiuje wartość Twoja aplikacja. Wybierz sposób jej obliczania, na przykład na podstawie recency i częstotliwości interakcji.

Aktualizowanie rang kontaktów

Jest to według uznania aplikacji, kiedy należy zaktualizować szeregi kontaktów przechowywanych w systemie Windows. System Windows zaleca regularne aktualizowanie list rankingowych w celu zapewnienia najlepszych wrażeń użytkownika. Zawsze, gdy musisz zaktualizować listę sklasyfikowaną, musisz wykonać kilka kroków.

  1. Usuń element ContactAnnotationList.

    Gdy aplikacja ma zaktualizowaną listę najważniejszych kontaktów, można usunąć listę adnotacji, a można utworzyć nową listę adnotacji ze zaktualizowanymi adnotacjami dla najważniejszych kontaktów.

    await this.contactAnnotationList.DeleteAsync();
    
  2. Utwórz nowy element ContactAnnotationList. Wykonaj kroki opisane w sekcji Przechowywanie rang dla kontaktów , aby utworzyć nową listę adnotacji i zapisać rangi dla najważniejszych kontaktów.

Najlepsze rozwiązania dotyczące klasyfikowania

Aby zmaksymalizować trafność kontaktów w aplikacji w wierszu sugestii w arkuszu udostępniania, postępuj zgodnie z następującymi zasadami ustalania rankingu:

Ranking według aktualności i częstotliwości

Oblicz rangę jako kombinację:

  • Recency: Kiedy użytkownik ostatnio wchodził w interakcję z każdym kontaktem
  • Częstotliwość: jak często użytkownik wchodzi w interakcję z każdym kontaktem

Ponieważ niższe wartości rankingu mają pierwszeństwo, posortuj kontakty według wyniku od najwyższego do najniższego i przypisz rangi 1, 2, 3 itd. Na przykład kontakt, z którym użytkownik pisał wczoraj, może uzyskać rangę 1, podczas gdy kontakt, z którym użytkownik pisał 2 tygodnie temu, może uzyskać rangę 5.

// lastInteraction and interactionCount come from your app's own interaction
// telemetry. The Windows Contact class does not expose interaction history.
private int CalculateScore(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;
}

// A higher score means a more relevant contact, so it gets a lower rank value.
// Assign unique ranks 1, 2, 3, ... in descending score order.
var rankedContacts = this.AllTrackedContacts
    .OrderByDescending(c => CalculateScore(c.LastInteractionDate, c.InteractionCount))
    .Select((c, index) => (Contact: c, Rank: index + 1));

Usuń nieaktualne kontakty

Kontakty, z którymi użytkownik nie wchodził w interakcję w ciągu 30 dni, należy usunąć z listy rankingowej. Dzięki temu sugestie są świeże i istotne:

// Exclude stale contacts when you rebuild the ranked list. Don't save a rank of 0
// for them: lower values take precedence, so 0 is the highest priority.
var staleCutoff = DateTime.Now.AddDays(-30);
var activeContacts = this.AllTrackedContacts
    .Where(c => c.LastInteractionDate >= staleCutoff);

Regularnie aktualizuj rangę

Zaplanuj aktualizacje rangi w zakresie, który ma sens dla aplikacji — codziennie w przypadku aplikacji do obsługi wiadomości, co tydzień dla poczty e-mail lub co miesiąc dla aplikacji kalendarza. W razie potrzeby użyj zadań w tle:

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

Lista kontrolna dotycząca wiersza sugestii

Gdy uszeregujesz i będziesz aktualizować swoje kontakty zgodnie z powyższymi wskazówkami, użytkownicy zobaczą najważniejsze kontakty Twojej aplikacji w wierszu sugestii w arkuszu udostępniania systemu Windows. Ta ścieżka obecnie obsługuje kontakty z aplikacji People.

Aby upewnić się, że kontakty są wyświetlane:

  1. Utwórz UserDataAccount za pomocą DisplayName = "com.microsoft.peoplecontract"
  2. Przechowuj kontakty z wymaganymi polami (FirstName, RemoteId, DisplayPicture)
  3. Utwórz element ContactAnnotationList z rangami (niższe wartości mają pierwszeństwo)
  4. Ustaw SupportedOperations = Share dla każdej adnotacji
  5. Regularnie aktualizuj rankingi na podstawie aktualności i częstotliwości
  6. Usuń kontakty, z którymi użytkownik nie wchodził w interakcję od 30 dni lub dłużej z listy rankingowej

Pełny przewodnik integracji z Share Sheet znajdziesz w sekcjach Udostępnianie zawartości z aplikacji i Odbieranie zawartości w aplikacji.