Személyek a Windowsban

A Windows ideális platform a külső alkalmazások számára, hogy integrálhassák a legfelső szintű kapcsolattartóikat. Ez az integráció lehetővé teszi a felhasználók számára, hogy interakcióba lépjenek a különböző felhasználói élmények személyeivel. A Windows mostantól harmadik féltől származó WinUI-t és más alkalmazásokat biztosít csomagidentitással API-kkal az összes névjegy tárolásához.

Miután az alkalmazások a Windowsban tárolják a névjegyeiket, a felhasználók a Windows Megosztás paneljén láthatják ezeket a partnerjavaslatokat, hogy zökkenőmentesen megoszthassák őket a legfontosabb partnerekkel. A Megosztás panelről további információt a Fájlok megosztása a Windows Fájlkezelőben című témakörben talál.

UserDataAccount for People-szerződés létrehozása

Először hozzon létre egy felhasználóiadat-fiókot. Harmadik féltől származó alkalmazásokra van szükség a UserDataAccount létrehozásához a következővel UserDisplayName : "com.microsoft.peoplecontract".

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

Ezután adja hozzá a "com.microsoft.windows.system" elemet a ExplictReadAccessPackageFamilyNames listájához a fiókhoz. Ez korlátozott hozzáférést biztosít a külső partnerek számára a Windows-szolgáltatásokhoz.

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

Névjegyek tárolása

A partnerek tárolásának első lépése egy partnerlista létrehozása. Ehhez a külső alkalmazásoknak létre kell hozniuk egy új partnerlistát a UserDataAccount Windows ContactStore-ban. Az alkalmazások dönthetnek úgy, hogy megtartják a partnerlista alapértelmezett OtherAppReadAccess hozzáférési típusát; a None beállítása esetén más alkalmazások nem férhetnek hozzá ezekhez a névjegyekhez. A teljes hozzáférési lista megtekintéséhez lásd a ContactListOtherAppReadAccess enumerációt.

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

A névjegyek tárolásakor a külső alkalmazásoknak tartalmazniuk kell a Windows-szolgáltatásokhoz szükséges összes releváns információt a névjegyek használatához.

A kapcsolatok tárolásához a következő mezők szükségesek:

  • FirstName
  • RemoteId
  • DisplayPicture

Az alábbi mezők nem kötelezőek:

  • LastName
  • Phones
  • Emails

Ez a kódrészlet bemutatja, hogyan tárolhat partnereket:

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

Megjegyzés:

A DisplayName a és FirstName segítségével van felépítve. Ha a vezetéknév nincs megadva, DisplayName az megegyezik az utónévhez megadott sztringgel.

Kapcsolatokhoz tartozó rangok tárolása

Létrehozhat egy annottációs listát a UserDataAccount kapcsolatok rangjainak tárolására. Az alkalmazások megjegyzések hozzáadásával tárolhatják a legfontosabb névjegyeik rangsorát. Ezek az annotációk egy annotációs lista részeként vannak tárolva a kapcsolattárolóban.

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

A kapcsolatokon lévő jegyzetek használatával tárolhatja a legfontosabb kapcsolatok rangsorát. A rangok a ProviderProperties részeként vannak tárolva egy partnerjegyzeten. A rangsorolás mellett az alkalmazásoknak a SupportedOperations tulajdonságot is be kell állítaniuk egy kapcsolat-jegyzetbe 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);
}

Kapcsolati szempontok frissítése

Az alkalmazások saját belátása szerint frissítik a Windowsban tárolt névjegyek rangját. A Windows azt javasolja, hogy a rangsorolt listák rendszeresen frissüljenek a legjobb felhasználói élmény érdekében. Minden alkalommal, amikor frissítenie kell egy rangsorolt listát, több lépést kell követnie.

  1. Törölje a ContactAnnotationList elemet.

    Miután az alkalmazás frissítette a legfontosabb névjegyek listáját, a megjegyzéslista törölhető, és létrehozható egy új megjegyzéslista, amely frissített megjegyzéseket tartalmaz a legfontosabb névjegyekhez.

    await this.contactAnnotationList.DeleteAsync();
    
  2. Hozzon létre egy újat ContactAnnotationList. A Partnerek rangsorolása szakaszban található lépéseket követve hozzon létre egy új jegyzetlistát, és tárolja a rangsorokat a legfontosabb partnerek számára.

Ajánlott eljárások a rangsoroláshoz

Ha szeretné maximalizálni az alkalmazás névjegyeinek relevanciáját a Share Sheet javaslatsorában, kövesse az alábbi rangsorolási alapelveket:

Rangsorolás a frissesség és a gyakoriság alapján

Számítsa ki a rangot a következők kombinációjaként:

  • Recency: Amikor a felhasználó utoljára kommunikált az egyes partnerekkel
  • Gyakoriság: Milyen gyakran lép kapcsolatba a felhasználó az egyes partnerekkel?

Előfordulhat például, hogy a felhasználó tegnapi üzenete 95. rangot kapott, míg a két héttel ezelőtti üzenetben szereplő partner 60- os rangot kaphat.

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

Elavult névjegyek eltávolítása

A felhasználó által 30+ nap alatt nem kommunikált partnereket jelentősen el kell távolítani vagy le kell őket rangsorolni. Így a javaslatok frissek és relevánsak maradnak:

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

Frissítse rendszeresen a rangsorokat.

A rangsorfrissítések ütemezése az alkalmazás számára ésszerű ütemben – naponta üzenetküldő alkalmazásokhoz, heti e-mailekhez vagy naptáralkalmazásokhoz havonta. Szükség esetén használjon háttérfeladatokat:

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

Csak kifejezett kapcsolatokat adjon meg

Az alkalmazásnak csak azokat a névjegyeket kell hozzáadnia, amelyekhez a felhasználó kifejezetten hozzáadott vagy engedélyezett. Soha:

  • A teljes címjegyzék feltöltése
  • Névjegyek automatikus szinkronizálása felhasználói hozzájárulás nélkül
  • Partnerek megosztása a vállalati címtárakból kifejezett engedély nélkül

Kérjen engedélyt, mielőtt névjegyeket tárol a Kapcsolatok rendszerben:

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

A felhasználói adatvédelmi beállítások tiszteletben tartása

Lehetővé teszi a felhasználók számára, hogy:

  • Válassza ki, mely névjegyeket osztja meg a Windowszal
  • A People-integráció kikapcsolása
  • Bármikor törölheti a névjegyeit a Windowsból
// Provide a setting to disable sync
if (this.ShouldSyncContactsWithWindows)
{
    await SyncContactsAsync();
}
else
{
    // Clear contacts if the user disables sync
    await ClearWindowsContactsAsync();
}

Integráció a megosztási laplal

Ha a fenti útmutatással rangsorolja és tartja karban a névjegyeit, a felhasználók az alkalmazás legjobb partnereit látják a Windows Megosztás lap javaslatsorában. Ez az útvonal jelenleg támogatja a People névjegyeket.

Annak érdekében, hogy a névjegyek megjelenjenek:

  1. Hozzon létre egy UserDataAccount elemet DisplayName = "com.microsoft.peoplecontract" használatával
  2. Kapcsolatok mentése kötelező mezőkkel (FirstName, RemoteId, DisplayPicture)
  3. ContactAnnotationList Ranglétrehozás létrehozása
  4. Állítsa be a(z) SupportedOperations = Share beállítást minden annotáción
  5. A rangsorokat rendszeresen frissítse az aktualitás és a gyakoriság alapján
  6. 30+ nap után metsszük ki az elavult névjegyeket

A teljes Share Sheet integrációs útmutatót az alkalmazás tartalmainak megosztása és a Tartalom fogadása az alkalmazásban című témakörben találja.