Windows 공유에 대한 연락처 우선순위 지정

앱은 Windows Share용 연락처 주석을 추가하여 상위 연락처에 대한 순위를 제공할 수 있습니다. 이 문서에서는 주석 목록 만들기, Share 작업을 사용해 순위 저장, 순위 목록 업데이트 및 순위 지정 모범 사례에 대해 설명합니다.

시작하기 전에 Windows에 연락처를 추가하세요.

연락처에 대한 순위 저장

UserDataAccount에 연락처의 순위를 저장할 주석 목록을 만들 수 있습니다. 앱은 연락처에 주석을 추가하여 상위 연락처의 순위를 저장할 수 있습니다. 이러한 주석은 연락처 저장소에 주석 목록의 일부로 저장됩니다.

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

연락처의 주석을 사용하여 상위 연락처의 순위를 저장할 수 있습니다. 순위는 연락처 주석에 ProviderProperties의 일부로 저장됩니다. 순위와 함께 앱은 연락처 주석에서 SupportedOperations 를 다음과 같이 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 this.contactAnnotationList.TrySaveAnnotationAsync(annotation);
}

순위 값 참조

Aspect Guidance
속성 키 "Rank" 주석의 ProviderProperties 사전에서
값 형식 음수가 아닌 정수.
Direction 낮은 값은 앱 목록 내에서 우선 적용됩니다. 0의 우선순위 값은 "무시"가 아닙니다. 동일한 하위 값 우선 순서를 따릅니다.
고유성 목록의 각 연락처에 고유한 순위를 할당합니다. 중복 순위에 대한 동작은 지정되지 않습니다.
Scope 앱의 순위는 자신의 목록 내에서만 우선 순위를 표시합니다. Windows는 모든 Share 주석 항목을 읽고 사용량을 기반으로 한 내부 논리로 여러 앱에서 연락처 순서를 정합니다. 모든 주석을 읽는 것은 Windows에 표시되는 제안 수와는 별개입니다.
누가 값을 정의합니까 회원님의 앱. 예를 들어 상호 작용의 최신성 및 빈도에서 계산하는 방법을 선택합니다.

연락처 순위 업데이트

Windows에 저장된 연락처의 순위를 업데이트해야 하는 경우 앱의 재량에 따라 결정됩니다. Windows에서는 최상의 사용자 환경을 제공하기 위해 순위가 지정된 목록을 정기적으로 업데이트하는 것이 좋습니다. 순위가 지정된 목록을 업데이트해야 할 때마다 몇 가지 단계를 수행해야 합니다.

  1. ContactAnnotationList를 삭제합니다.

    앱에 상위 연락처의 업데이트된 목록이 있으면 주석 목록을 삭제하고 상위 연락처에 대한 주석이 업데이트된 새 주석 목록을 만들 수 있습니다.

    await this.contactAnnotationList.DeleteAsync();
    
  2. 새 ContactAnnotationList를 만듭니다. 연락처에 대한 순위 저장 섹션의 단계에 따라 새 주석 목록을 만들고 상위 연락처에 대한 순위를 저장합니다.

순위에 대한 모범 사례

Share Sheet 제안 행에서 앱 연락처의 관련성을 최대화하려면 다음 순위 원칙을 따릅니다.

최신성 및 빈도순 정렬

다음의 조합으로 순위를 계산합니다.

  • Recency: 사용자가 각 연락처와 마지막으로 상호 작용한 경우
  • 빈도: 사용자가 각 연락처와 상호 작용하는 빈도

낮은 순위 값이 우선하기 때문에 연락처를 점수를 높은 순에서 낮은 순으로 정렬하고 순위 1, 2, 3 등을 할당합니다. 예를 들어 어제 사용자가 메시지를 보낸 연락처는 순위 1을 받을 수 있지만 2주 전에 메시지를 보낸 연락처는 순위 5를 얻을 수 있습니다.

// lastInteraction and interactionCount come from your app's own interaction
// telemetry. The Windows Contact class does not expose interaction history.
private int CalculateScore(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;
}

// A higher score means a more relevant contact, so it gets a lower rank value.
// Assign unique ranks 1, 2, 3, ... in descending score order.
var rankedContacts = this.AllTrackedContacts
    .OrderByDescending(c => CalculateScore(c.LastInteractionDate, c.InteractionCount))
    .Select((c, index) => (Contact: c, Rank: index + 1));

부실 연락처 제거

사용자가 30일 이상 상호 작용하지 않은 연락처는 순위가 지정된 목록에서 제거해야 합니다. 이렇게 하면 제안이 신선하고 관련성이 유지됩니다.

// Exclude stale contacts when you rebuild the ranked list. Don't save a rank of 0
// for them: lower values take precedence, so 0 is the highest priority.
var staleCutoff = DateTime.Now.AddDays(-30);
var activeContacts = this.AllTrackedContacts
    .Where(c => c.LastInteractionDate >= staleCutoff);

정기적으로 순위 업데이트

앱에 적합한 주기에 따라 순위 업데이트를 예약합니다( 메시징 앱의 경우 매일, 메일의 경우 매주 또는 일정 앱의 경우 매월). 필요한 경우 백그라운드 작업을 사용합니다.

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

제안 행에 대한 검사 목록

위의 지침에 따라 연락처의 순위를 지정하고 유지 관리하는 경우 사용자는 Windows 공유 시트의 제안 행에 앱의 상위 연락처를 볼 수 있습니다. 이 경로는 현재 피플 연락처를 지원합니다.

연락처가 표시되도록 하려면 다음을 수행합니다.

  1. UserDataAccount로 DisplayName = "com.microsoft.peoplecontract" 만들기
  2. 필수 필드가 있는 연락처 저장(FirstName, RemoteId, DisplayPicture)
  3. 순위가 있는 ContactAnnotationList 항목 만들기(낮은 값이 우선)
  4. 각 주석에 SupportedOperations = Share을(를) 설정하세요.
  5. 최근성과 빈도에 따라 순위를 정기적으로 업데이트하세요.
  6. 사용자가 30일 이상 동안 상호 작용하지 않은 연락처를 순위 목록에서 제거합니다.

전체 공유 시트 통합 가이드 는 앱에서 콘텐츠 공유 및 앱의 콘텐츠 받기 를 참조하세요.