Windows Share の連絡先を順位付けする

アプリでは、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);
}

ランク値の参照

特徴 Guidance
プロパティキー "Rank" 注釈の ProviderProperties ディクショナリ内
値タイプ 負でない整数。
Direction 小さい値は、アプリの一覧内で優先されます。 ランク 0 は "無視" ではありません。同じ値の小さい順に従います。
一意性 リスト内の各連絡先に一意のランクを割り当てます。 重複するランクの動作が指定されていません。
Scope アプリのランクは、独自のリスト内でのみ優先度を表します。 Windowsは、すべてのShare注釈を読み取り、使用状況に基づいて内部ロジックを使用してアプリ間で連絡先を並べ替えます。 すべての注釈を読み込むことは、Windows に表示される提案の数とは別です。
誰が値を定義するのか ご自身のアプリ。 計算方法を選択します。たとえば、新しさや相互作用の頻度から計算します。

連絡先ランクの更新

Windows に格納されている連絡先のランクを更新するタイミングは、アプリの裁量によって行われます。 Windows では、最適なユーザー エクスペリエンスを提供するために、ランク付けされたリストを定期的に更新することをお勧めします。 ランク付けされたリストを更新する必要がある場合は常に、いくつかの手順に従う必要があります。

  1. ContactAnnotationListを削除します。

    アプリに上位連絡先の更新されたリストが表示されたら、注釈リストを削除し、上位の連絡先の注釈を更新した新しい注釈リストを作成できます。

    await this.contactAnnotationList.DeleteAsync();
    
  2. 新しい ContactAnnotationList を作成します。 連絡先のランクセクションの手順に従って、新しい注釈リストを作成し、上位の連絡先のランクを格納します。

ランク付けのベスト プラクティス

[シートの共有候補] 行でアプリの連絡先の関連性を最大化するには、次のランク付け原則に従います。

新しさと頻度で並べ替え

ランクを次の組み合わせとして計算します。

  • 最新のやり取り: ユーザーが各連絡先と最後にやり取りした日時
  • 頻度: ユーザーが各連絡先と対話する頻度

低いランク値が優先されるため、連絡先を最高から最低のスコアで並べ替え、ランク 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共有シートの候補行にアプリの上位の連絡先が表示されます。 このパスは現在、People の連絡先をサポートしています。

連絡先が表示されるようにするには:

  1. UserDataAccount で DisplayName = "com.microsoft.peoplecontract" を作成する
  2. 必須フィールド (FirstName、 RemoteId、 DisplayPicture) を含む連絡先を格納する
  3. ランクを持つ ContactAnnotationList を作成する (低い値が優先されます)
  4. 各注釈に SupportedOperations = Share を設定する
  5. 新しさと頻度に基づいて定期的にランキングを更新する
  6. ユーザーが 30 日以上やり取りしていない連絡先を、順位付けされたリストから削除する

完全な共有シート統合ガイドについては、「 アプリからコンテンツを共有 する」と 「アプリのコンテンツを受信 する」を参照してください。