Windows'da kişiler

Windows, üçüncü taraf uygulamaların en iyi insanlarla olan kişilerini entegre etmesi için ideal bir platformdur. Bu tümleştirme, kullanıcıların çeşitli kişi deneyimleri için kişiliklerle etkileşim kurmasını sağlar. Windows artık üçüncü taraf WinUI ve diğer uygulamalara, tüm kişilerini depolaması için API'lerle paket kimliği sunar.

Uygulamalarınız kişilerini Windows'ta depoladıktan sonra, kullanıcılar bu kişi önerilerini Windows'taki Paylaş panelinde görebilir ve en iyi kişileriyle sorunsuz bir şekilde paylaşabilir. Paylaşım paneli hakkında daha fazla bilgi için bkz. Windows'da Dosya Gezgini'nde dosyaları paylaşma.

Kişiler İçin Kullanıcı Verisi Hesabı Oluşturma Sözleşmesi

Başlangıç olarak bir kullanıcı veri hesabı oluşturun. UserDisplayName olarak bir "com.microsoft.peoplecontract" oluşturmak için üçüncü taraf uygulamalar gereklidir.

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

Ardından, "com.microsoft.windows.system" hesabın ExplicitReadAccessPackageFamilyNames listesine ekleyin. Bu, üçüncü taraf kişilerin Windows deneyimlerine kısıtlanmış erişimini sağlar.

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

Kişileri depolama

Kişileri depolamanın ilk adımı bir kişi listesi oluşturmaktır. Bunu yapmak için, üçüncü taraf uygulamaların Windows ContactStore'nda için UserDataAccount yeni kişi listesini oluşturması gerekir. Uygulamalar kişi listesi için varsayılan OtherAppReadAccess erişim türünü korumayı seçebilirken, bunu olarak ayarlamak None diğer uygulamaların bu kişilere erişmesini engeller. Tam erişim türleri listesini görmek için ContactListOtherAppReadAccess enum türüne bakın.

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

Bir kişiyi depolarken üçüncü taraf uygulamalar, Windows deneyimlerinin bir Kişiyi desteklemek için gerekli tüm ilgili bilgileri içermesi gerekir.

Bir kişiyi kaydederken gerekli olan alanlar şunlardır:

  • FirstName
  • RemoteId
  • DisplayPicture

Aşağıdaki alanlar isteğe bağlıdır:

  • LastName
  • Phones
  • Emails

Bu kod parçacığı, bir iletişim bilgisinin veya kaydının nasıl depolandığını gösterir.

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

Uyarı

DisplayName İletişim için FirstName ve LastName kullanılarak oluşturulur. Soyadı belirtilmezse, DisplayName ad için belirtilen dizeyle aynı olacaktır.

Kişiler için dereceleri depolama

Kişilerinizin derecelendirmelerini depolamak için bir UserDataAccount ek açıklama listesi oluşturabilirsiniz. Uygulamalar, kişilere ek açıklamalar ekleyerek en önemli bağlantılarının sıralamalarını depolayabilir. Bu ek açıklamalar, iletişim deposundaki bir ek açıklama listesinin parçası olarak depolanır.

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

Kişilerdeki ek açıklamaları kullanarak en iyi kişilerinizin derecelerini depolayabilirsiniz. Dereceler, bir kişi ek açıklamasında ProviderProperties'in bir parçası olarak depolanır. Derecelendirmenin yanı sıra, uygulamaların kişi ek açıklamasında SupportedOperations değerini olarak Shareayarlaması gerekir.

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

Kişi derecelerini güncelleştirme

Windows'ta depolanan kişilerin derecelerinin güncelleştirilirken uygulamaların takdirine bağlıdır. Windows, en iyi kullanıcı deneyimini sağlamak için dereceli listelerin düzenli olarak güncelleştirilmiş olmasını önerir. Dereceli listeyi güncelleştirmeniz gerektiğinde birkaç adımı izlemeniz gerekir.

  1. ContactAnnotationList öğesini silin.

    Uygulama güncellenmiş en iyi kişiler listesine sahip olduktan sonra, ek açıklama listesi silinebilir ve en iyi kişiler için güncellenmiş ek açıklamalar bulunduran yeni bir ek açıklama listesi oluşturulabilir.

    await this.contactAnnotationList.DeleteAsync();
    
  2. Yeni bir ContactAnnotationListoluşturun. Yeni bir açıklama listesi oluşturmak ve en iyi kişilerinize ait sıralamaları depolamak için Kişiler için Derecelendirmeleri Depolama bölümündeki adımları izleyin.

Derecelendirme için en iyi yöntemler

Paylaşım Sayfası'nın öneri satırındaki uygulamanızın kişilerinin alaka düzeyini en üst düzeye çıkarmak için şu sıralama ilkelerini izleyin:

Güncellik ve sıklığa göre sırala

Sıralamayı şunların birleşimi olarak hesaplayın:

  • Güncellik: Kullanıcının her bir kişiyle en son ne zaman etkileşim kurduğu
  • Sıklık: Kullanıcının her bir kişiyle etkileşim kurma sıklığı

Örneğin, kullanıcının dün mesaj olarak iletmiş olduğu bir kişi 95. sırada, 2 hafta önce iletilmiş bir kişi ise 60. dereceye sahip olabilir.

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

Eski kişileri kaldırma

Kullanıcının 30 günden fazla süredir etkileşim kurmadığı kişiler kaldırılmalıdır veya önemli ölçüde düşük dereceye alınmalıdır. Bu, önerileri güncel ve ilgili tutar:

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

Düzenli olarak derecelendirmeleri güncelleştirme

Güncelleştirmeleri uygulamanız için anlamlı bir tempoda (mesajlaşma uygulamaları için günlük, e-posta için haftalık veya takvim uygulamaları için aylık) zamanlayın. Gerekirse arka plan görevlerini kullanın:

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

Yalnızca açıkça belirtilen kişileri ekleyin

Uygulamanız yalnızca kullanıcının açıkça eklediği veya yetkilendirdiği kişilere katkıda bulunmalıdır. Hiçbir zaman:

  • Adres defterinin tamamını karşıya yükleyin
  • Kullanıcı onayı olmadan kişileri otomatik eşitleme
  • Kurumsal dizinlerdeki kişileri açık izin olmadan paylaşma

Kişileri Kişiler sisteminde depolamadan önce izin isteyin:

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

Kullanıcı gizlilik ayarlarına saygı gösterin

Kullanıcıların şunları yapmasına izin ver:

  • Windows ile paylaşacak kişileri seçme
  • Kişiler entegrasyonunu devre dışı bırakın
  • Kişilerini Windows’tan istediğiniz zaman silin
// Provide a setting to disable sync
if (this.ShouldSyncContactsWithWindows)
{
    await SyncContactsAsync();
}
else
{
    // Clear contacts if the user disables sync
    await ClearWindowsContactsAsync();
}

Paylaşım Sayfası ile tümleştirme

Yukarıdaki yönergelerle kişilerinizi derecelerine göre sıraladığınızda ve koruduğunuzda, kullanıcılar uygulamanızın en önemli kişilerini Windows Paylaşım Sayfası'nın öneriler satırında görür. Bu yol şu anda People kişilerini destekliyor.

Kişilerinizin görünmesini sağlamak için:

  1. DisplayName = "com.microsoft.peoplecontract" ile bir UserDataAccount oluşturun
  2. Zorunlu alanları bulunan kişileri kaydedin (FirstName, RemoteId, DisplayPicture)
  3. ContactAnnotationList sıralamalarla oluşturun
  4. Her ek açıklama için SupportedOperations = Share ayarlayın
  5. Sıralamaları güncellik ve sıklığa göre düzenli olarak güncelleyin
  6. 30 günden fazla süre sonra eski kişileri ayıklama

Sayfa Paylaşma tümleştirme kılavuzunun tamamı için bkz. Uygulamanızdan içerik paylaşma ve Uygulamanızda içerik alma .