Uživatelé Windows

Windows je ideální platformou pro aplikace třetích stran k integraci jejich nejlepších kontaktů. Tato integrace umožňuje uživatelům pracovat s postavami pro různé zážitky s lidmi. Windows teď poskytuje WinUI a další aplikace třetích stran s identitou balíčku prostřednictvím rozhraní API pro ukládání všech svých kontaktů.

Jakmile vaše aplikace ukládají své kontakty ve Windows, uživatelé budou moct tyto návrhy kontaktů zobrazit na panelu Sdílet ve Windows, aby je mohli bez problémů sdílet se svými hlavními kontakty. Další informace o panelu Sdílení najdete v tématu Jak sdílet soubory v Průzkumníku souborů ve Windows.

Vytvoření uživatelského účtu pro smlouvu People Contract

Začněte vytvořením uživatelského datového účtu. Je nutné, aby aplikace třetích stran vytvořily uživatelský účet UserDataAccount s UserDisplayName jako "com.microsoft.peoplecontract".

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

Dále přidejte "com.microsoft.windows.system" do seznamu ExplictReadAccessPackageFamilyNames pro účet. Tím zajistíte omezený přístup kontaktů třetích stran k prostředím Windows.

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

Ukládání kontaktů

Prvním krokem při ukládání kontaktů je vytvoření seznamu kontaktů. Aby to bylo možné, musí aplikace třetích stran vytvořit nový seznam kontaktů pro UserDataAccount v ContactStore Windows. Aplikace si můžou ponechat výchozí OtherAppReadAccess typ přístupu pro seznam kontaktů a zároveň ho nastavit tak, aby None ostatní aplikace neměly přístup k těmto kontaktům. Úplný seznam dostupných typů přístupu najdete v výčtu ContactListOtherAppReadAccess .

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

Při ukládání kontaktu musí aplikace třetích stran zahrnovat všechny relevantní informace potřebné pro využití kontaktu v prostředích systému Windows.

Při ukládání kontaktu jsou vyžadována následující pole:

  • FirstName
  • RemoteId
  • DisplayPicture

Následující pole jsou volitelná:

  • LastName
  • Phones
  • Emails

Tento fragment kódu ukazuje, jak uložit 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);
}

Poznámka:

DisplayName pro Kontakt je vytvořen pomocí FirstName a LastName. Pokud by nebylo uvedeno příjmení, DisplayName bude totožný s řetězcem zadaným pro křestní jméno.

Ukládání pořadí kontaktů

Můžete vytvořit seznam poznámek pro UserDataAccount k uložení pořadí vašich kontaktů. Aplikace můžou ukládat pořadí svých hlavních kontaktů přidáním poznámek do kontaktů. Tyto poznámky se ukládají jako součást seznamu poznámek v úložišti kontaktů.

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

Pořadí hlavních kontaktů můžete ukládat pomocí poznámek u kontaktů. Pořadí jsou uložena jako součást ProviderProperties na poznámce kontaktu. Spolu s pořadím musí aplikace nastavit SupportedOperations na poznámce kontaktu 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);
}

Aktualizace pořadí kontaktů

Je na uvážení aplikací, kdy aktualizovat pořadí kontaktů uložených ve Windows. Systém Windows doporučuje pravidelně aktualizovat seřazené seznamy, aby poskytovaly co nejlepší uživatelské prostředí. Kdykoli potřebujete aktualizovat seřazený seznam, budete muset provést několik kroků.

  1. Odstraňte ContactAnnotationList.

    Jakmile má aplikace aktualizovaný seznam hlavních kontaktů, můžete seznam poznámek odstranit a vytvořit nový seznam poznámek s aktualizovanými poznámkami pro jejich nejlepší kontakty.

    await this.contactAnnotationList.DeleteAsync();
    
  2. Vytvořte nové ContactAnnotationList. Podle pokynů v části Ukládání pořadí kontaktů vytvořte nový seznam poznámek a uložte pořadí pro vaše nejlepší kontakty.

Osvědčené postupy pro řazení

Pokud chcete maximalizovat relevanci kontaktů své aplikace v řádku návrhů na panelu Sdílet, postupujte podle těchto zásad řazení:

Seřadit podle aktuálnosti a četnosti

Výpočet pořadí jako kombinace:

  • Aktuálnost: Kdy uživatel naposledy komunikoval s jednotlivými kontakty
  • Frekvence: Jak často uživatel komunikuje s jednotlivými kontakty

Například kontakt, kterému uživatel včera poslal zprávu, může mít hodnocení 95, zatímco kontakt, kterému uživatel poslal zprávu před 2 týdny, může mít hodnocení 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;
}

Odebrání zastaralých kontaktů

Kontakty, se kterými uživatel během 30 dnů nepracuje, by se měly výrazně odebrat nebo snížit pořadí. Díky tomu budou návrhy aktuální a relevantní:

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

Pravidelně aktualizujte hodnocení

Naplánujte aktualizace pořadí podle tempa, které dává smysl pro vaši aplikaci – denně pro aplikace pro zasílání zpráv, týdenní pro e-mail nebo měsíční aplikace kalendáře. V případě potřeby použijte úlohy na pozadí:

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

Přispívejte pouze výslovně zadané kontakty

Vaše aplikace by měla přispívat jenom kontakty, které uživatel explicitně přidal nebo autorizoval. Nikdy:

  • Nahrání celého adresáře
  • Automatická synchronizace kontaktů bez souhlasu uživatele
  • Sdílení kontaktů z podnikových adresářů bez explicitního oprávnění

Před uložením kontaktů v systému Lidé požádejte o oprávnění:

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

Respektovat nastavení ochrany osobních údajů uživatele

Umožnit uživatelům:

  • Výběr kontaktů, které se mají sdílet s Windows
  • Odhlášení z integrace osob
  • Odstranění kontaktů z Windows kdykoli
// Provide a setting to disable sync
if (this.ShouldSyncContactsWithWindows)
{
    await SyncContactsAsync();
}
else
{
    // Clear contacts if the user disables sync
    await ClearWindowsContactsAsync();
}

Integrace se sdíleným listem

Když své kontakty seřadíte a budete je spravovat podle výše uvedených pokynů, uživatelé uvidí nejčastější kontakty vaší aplikace v řádku návrhů na panelu Sdílení ve Windows. Tato cesta aktuálně podporuje kontakty lidí.

Pokud chcete zajistit, aby se vaše kontakty zobrazily:

  1. Vytvořte UserDataAccount pomocí DisplayName = "com.microsoft.peoplecontract"
  2. Ukládání kontaktů s požadovanými poli (FirstName, RemoteId, DisplayPicture)
  3. Vytvořit ContactAnnotationList s pořadími
  4. Nastavit SupportedOperations = Share u každé poznámky
  5. Pravidelně aktualizovat pořadí na základě aktuálnosti a četnosti.
  6. Vyřazení zastaralých kontaktů po 30+ dnech

Úplného průvodce integrací Share Sheetu najdete v tématu Sdílení obsahu z aplikace a v tématu Příjem obsahu v aplikaci.