Personer på Windows

Windows är en idealisk plattform för appar från tredje part för att integrera kontakter med de främsta personerna. Den här integreringen gör det möjligt för användare att interagera med personas för olika personers upplevelser. Windows tillhandahåller nu WinUI från tredje part och andra appar med paketidentitet med API:er för att lagra alla sina kontakter.

När dina appar har lagrat sina kontakter i Windows kan användarna se dessa kontaktförslag på panelen Dela i Windows för att sömlöst dela med sina främsta kontakter. Mer information om panelen Dela finns i Dela filer i Utforskaren i Windows.

Skapa ett användarkonto för personkontrakt

Börja med att skapa ett användarkonto. Det krävs appar från tredje part för att skapa ett UserDataAccount med UserDisplayName som "com.microsoft.peoplecontract".

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

Lägg sedan till "com.microsoft.windows.system" i listan över ExplictReadAccessPackageFamilyNames för kontot. Detta ger begränsad åtkomst för kontakter från tredje part till Windows-upplevelser.

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

Lagra kontakter

Det första steget i att lagra kontakter är att skapa en kontaktlista. För att göra detta måste appar från tredje part skapa den nya kontaktlistan för en UserDataAccount i Windows ContactStore. Appar kan välja att behålla standardåtkomsttypen OtherAppReadAccess för kontaktlistan, men om du ställer in den None på kommer andra appar inte att ha åtkomst till dessa kontakter. Se ContactListOtherAppReadAccess-uppräkningen för den fullständiga listan över tillgängliga åtkomsttyper.

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

När du lagrar en kontakt måste appar från tredje part innehålla all relevant information som krävs för att Windows-upplevelser ska kunna driva en kontakt.

Följande fält krävs när du lagrar en kontakt:

  • FirstName
  • RemoteId
  • DisplayPicture

Följande fält är valfritt.

  • LastName
  • Phones
  • Emails

Det här kodfragmentet visar hur du lagrar en 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);
}

Anmärkning

DisplayName konstrueras för kontakten med hjälp av FirstName och LastName. Om efternamnet inte anges DisplayName är det identiskt med strängen som anges för förnamnet.

Lagra rangordningar för kontakter

Du kan skapa en annoteringslista för UserDataAccount för att lagra rangordningar för dina kontakter. Appar kan lagra rangordningar för sina främsta kontakter genom att lägga till anteckningar i kontakterna. Dessa anteckningar lagras som en del av en anteckningslista i kontaktarkivet.

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

Du kan lagra rangordningar för dina främsta kontakter med hjälp av anteckningarna på kontakter. Rangordningar lagras som en del av ProviderEgenskaper på en kontaktanteckning. Tillsammans med rangordningen måste appar ange SupportedOperations på en kontaktanteckning som 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);
}

Uppdatera kontaktleden

Det är efter apparnas gottfinnande när du ska uppdatera rangordningen för de kontakter som lagras i Windows. Windows rekommenderar att rangordnade listor uppdateras regelbundet för att ge bästa möjliga användarupplevelse. När du behöver uppdatera en rangordnad lista måste du följa flera steg.

  1. Ta bort ContactAnnotationList.

    När appen har en uppdaterad lista över de vanligaste kontakterna kan anteckningslistan tas bort och en ny anteckningslista med uppdaterade anteckningar för de översta kontakterna kan skapas.

    await this.contactAnnotationList.DeleteAsync();
    
  2. Skapa en ny ContactAnnotationList. Följ stegen i avsnittet Lagra rangordningar för kontakter för att skapa en ny anteckningslista och lagra rangordningar för dina främsta kontakter.

Metodtips för rangordning

Om du vill maximera relevansen för appens kontakter på raden Share Sheet-förslag följer du dessa rankningsprinciper:

Sortera efter aktualitet och frekvens

Beräkna rangordning som en kombination av:

  • Svarstid: När användaren senast interagerade med varje kontakt
  • Frekvens: Hur ofta användaren interagerar med varje kontakt

Till exempel kan en kontakt som användaren skickade ett meddelande till igår ha rankningen 95, medan en kontakt som användaren skickade ett meddelande till för 2 veckor sedan kan ha rankningen 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;
}

Ta bort inaktuella kontakter

Kontakter som användaren inte har interagerat med på över 30 dagar bör tas bort eller rangordnas ned avsevärt. Detta håller förslagen fräscha och relevanta:

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

Uppdatera rangordningar regelbundet

Schemalägg rankningsuppdateringar på en takt som passar din app – dagligen för meddelandeappar, varje vecka för e-post eller månadsvis för kalenderappar. Använd bakgrundsuppgifter om det behövs:

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

Bidra endast med explicita kontakter

Appen bör endast bidra med de kontakter som användaren uttryckligen har lagt till eller godkänt. Aldrig:

  • Ladda upp hela adressboken
  • Synkronisera kontakter automatiskt utan användarens medgivande
  • Dela kontakter från företagskataloger utan uttryckligt tillstånd

Be om behörighet innan du lagrar kontakter i personsystemet:

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

Respektera inställningar för användarsekretess

Låt användare:

  • Välj vilka kontakter som ska delas med Windows
  • Avregistrera dig från personintegrering
  • Ta bort sina kontakter från Windows när som helst
// Provide a setting to disable sync
if (this.ShouldSyncContactsWithWindows)
{
    await SyncContactsAsync();
}
else
{
    // Clear contacts if the user disables sync
    await ClearWindowsContactsAsync();
}

Integration med delningspanelen

När du rangordnar och underhåller dina kontakter med vägledningen ovan ser användarna appens främsta kontakter på förslagsraden i Windows Share Sheet. Denna sökväg stöder för närvarande People-kontakter.

Så här ser du till att dina kontakter visas:

  1. Skapa en UserDataAccount med DisplayName = "com.microsoft.peoplecontract"
  2. Lagra kontakter med obligatoriska fält (FirstName, RemoteId, DisplayPicture)
  3. Skapa en ContactAnnotationList med rangordning
  4. Ange SupportedOperations = Share för varje anteckning
  5. Uppdatera rankningar regelbundet baserat på aktualitet och frekvens
  6. Rensa inaktuella kontakter efter 30+ dagar

Se Dela innehåll från din app och Ta emot innehåll i din app för den fullständiga integreringsguiden för Share Sheet.