Osoby na Windows

System Windows to idealna platforma dla aplikacji innych firm do integracji kontaktów z najlepszymi osobami. Ta integracja umożliwia użytkownikom interakcję z personami dla różnych doświadczeń użytkowników. System Windows udostępnia teraz WinUI innych firm i inne aplikacje z tożsamością pakietu, wykorzystując interfejsy API do przechowywania wszystkich kontaktów.

Gdy aplikacje będą przechowywać swoje kontakty w systemie Windows, użytkownicy będą mogli zobaczyć te sugestie kontaktowe w panelu Udostępnianie w systemie Windows, aby bezproblemowo udostępniać swoje najważniejsze kontakty. Aby uzyskać więcej informacji na temat panelu Udostępnianie, zobacz Jak udostępniać pliki w Eksploratorze plików w systemie Windows.

Tworzenie konta UserDataAccount dla kontraktu Osób

Zacznij od utworzenia konta danych użytkownika. Aby utworzyć konto UserDataAccount, konieczne jest użycie aplikacji innych firm z UserDisplayName jako "com.microsoft.peoplecontract".

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

Następnie dodaj "com.microsoft.windows.system" do listy explictReadAccessPackageFamilyNames dla konta. Zapewni to ograniczony dostęp kontaktom zewnętrznym do środowisk korzystania z systemu Windows.

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

Przechowywanie kontaktów

Pierwszym krokiem przechowywania kontaktów jest utworzenie listy kontaktów. W tym celu aplikacje innych firm muszą utworzyć nową listę kontaktów dla elementu UserDataAccount w sklepie Windows ContactStore. Aplikacje mogą zachować domyślny OtherAppReadAccess typ dostępu dla listy kontaktów, ustawiając je tak, aby None uniemożliwiły innym aplikacjom dostęp do tych kontaktów. Aby uzyskać pełną listę dostępnych typów dostępu, zobacz wyliczenie ContactListOtherAppReadAccess .

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

Podczas przechowywania kontaktu aplikacje innych firm muszą zawierać wszystkie istotne informacje wymagane przez środowiska systemu Windows do obsługi kontaktu.

Podczas przechowywania kontaktu wymagane są następujące pola:

  • FirstName
  • RemoteId
  • DisplayPicture

Poniższe pola są polami opcjonalnymi:

  • LastName
  • Phones
  • Emails

Ten fragment kodu pokazuje, jak przechowywać kontakt:

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);
}

Uwaga

Element DisplayName dla kontaktu skonstruowano przy użyciu FirstName i LastName. Jeśli nazwisko nie zostanie podane, DisplayName będzie identyczne z ciągiem podanym dla imienia.

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 annotationsLst.TrySaveAnnotationAsync(annotation);
}

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

Na przykład kontakt, do którego użytkownik napisał wczoraj, może mieć ranking 95, podczas gdy kontakt, do którego użytkownik napisał 2 tygodnie temu, może mieć ranking 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;
}

Usuń nieaktualne kontakty

Kontakty, z którymi użytkownik nie wchodził w interakcję w ciągu 30 dni, powinny zostać znacznie usunięte lub sklasyfikowane w dół. Dzięki temu sugestie są świeże i istotne:

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);
            }
        }
    }
}

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);
}

Dodawaj tylko jawne kontakty

Aplikacja powinna współtworzyć tylko kontakty, które użytkownik jawnie dodał lub autoryzował. Nigdy:

  • Prześlij całą książkę adresową
  • Automatyczna synchronizacja kontaktów bez zgody użytkownika
  • Udostępnianie kontaktów z katalogów firmowych bez jawnego uprawnienia

Poproś o uprawnienie przed zapisaniem kontaktów w systemie People:

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;
}

Przestrzegaj ustawień prywatności użytkownika

Pozwól użytkownikom:

  • Wybieranie kontaktów, które mają być udostępniane Windows
  • Zrezygnuj z integracji z funkcją People
  • Usuwanie kontaktów z Windows w dowolnym momencie
// Provide a setting to disable sync
if (this.ShouldSyncContactsWithWindows)
{
    await SyncContactsAsync();
}
else
{
    // Clear contacts if the user disables sync
    await ClearWindowsContactsAsync();
}

Integracja z arkuszem udziałów

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 obiekt ContactAnnotationList z rankingami
  4. Ustaw SupportedOperations = Share dla każdej adnotacji
  5. Regularnie aktualizuj rankingi na podstawie aktualności i częstotliwości
  6. Usuń nieaktualne kontakty po ponad 30 dniach

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