Windowsのユーザー

Windows は、第三者のアプリがトップの連絡先を統合するための理想的なプラットフォームです。 この統合により、ユーザーはさまざまなユーザー エクスペリエンスのためにペルソナと対話できます。 Windows では、サードパーティの WinUI やその他のアプリに、すべての連絡先を格納するための API を含む パッケージ ID が提供されるようになりました。

アプリで連絡先を Windows に保存すると、ユーザーは Windows の [ 共有 ] パネルで連絡先の候補を確認し、上位の連絡先とシームレスに共有できるようになります。 Share パネルの詳細については、「Windows のエクスプローラーでファイルを共有する方法を参照してください。

People コントラクトの UserDataAccount の作成

まず、ユーザー データ アカウントを作成します。 UserDisplayNameとして"com.microsoft.peoplecontract"を作成するには、サード パーティ製アプリが必要です。

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

次に、アカウントの "com.microsoft.windows.system" の一覧にを追加します。 これにより、Windows エクスペリエンスへのサード パーティの連絡先へのアクセスが制限されます。

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

連絡先の保存

連絡先を保存する最初の手順は、連絡先リストを作成することです。 これを行うには、サード パーティ製アプリが Windows UserDataAccountの新しい連絡先リストを作成する必要があります。 アプリは、連絡先リストの既定の OtherAppReadAccess アクセスの種類を保持することを選択できますが、 None に設定すると、他のアプリがこれらの連絡先にアクセスできなくなります。 使用可能なアクセスの種類の完全な一覧については、 ContactListOtherAppReadAccess 列挙型を参照してください。

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

連絡先を保存する際、サード パーティ製アプリには、 Contactを強化するために Windows エクスペリエンスに必要なすべての関連情報が含まれている必要があります。

連絡先を保存する場合は、次のフィールドが必要です。

  • FirstName
  • RemoteId
  • DisplayPicture

オプションとして、次のフィールドを使用できます:

  • LastName
  • Phones
  • Emails

このコード スニペットは、連絡先を格納する方法を示しています。

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

メモ

DisplayNameは、FirstNameLastNameを使用して構築されます。 姓が指定されていない場合、DisplayName は名として指定された文字列と同じものになります。

連絡先のランクの保存

連絡先のランクを格納する UserDataAccount の注釈リストを作成できます。 アプリでは、連絡先に注釈を追加することで、上位の連絡先のランクを格納できます。 これらの注釈は、連絡先ストアの注釈リストの一部として格納されます。

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

連絡先の注釈を使用して、上位の連絡先のランクを格納できます。 ランクは、連絡先の注釈に ProviderProperties の一部として格納されます。 ランクと共に、アプリは連絡先注釈の SupportedOperationsShareとして設定する必要があります。

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

連絡先ランクの更新

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

  1. ContactAnnotationListを削除します。

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

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

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

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

新しさと頻度で並べ替え

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

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

たとえば、ユーザーが昨日メッセージを送信した連絡先のランクは 95 ですが、2 週間前にメッセージが表示された連絡先のランクは 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;
}

古い連絡先を削除する

ユーザーが 30 日以上対話していない連絡先は、大幅に削除または下位ランク付けする必要があります。 これにより、提案が最新かつ関連性の高い状態に保たれた状態になります。

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

定期的にランクを更新する

メッセージング アプリの場合は毎日、電子メールの場合は毎週、カレンダー アプリの場合は毎月など、アプリにとって意味のある頻度でランクの更新をスケジュールします。 必要に応じてバックグラウンド タスクを使用します。

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

明示的な連絡先のみを投稿する

アプリは、ユーザーが明示的に追加または承認した連絡先のみを提供する必要があります。 Never:

  • アドレス帳全体をアップロードする
  • ユーザーの同意なしに連絡先を自動同期する
  • 明示的なアクセス許可なしで会社のディレクトリから連絡先を共有する

連絡先を People システムに保存する前に、アクセス許可を要求します。

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

ユーザーのプライバシー設定を尊重する

ユーザーに次を許可:

  • Windowsと共有する連絡先を選択する
  • People 統合をオプトアウトする
  • いつでもWindowsから連絡先を削除する
// Provide a setting to disable sync
if (this.ShouldSyncContactsWithWindows)
{
    await SyncContactsAsync();
}
else
{
    // Clear contacts if the user disables sync
    await ClearWindowsContactsAsync();
}

共有シートとの統合

上記のガイダンスを使用して連絡先をランク付けして維持すると、Windows共有シートの候補行にアプリの上位の連絡先が表示されます。 このパスは現在、People の連絡先をサポートしています。

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

  1. DisplayName = "com.microsoft.peoplecontract"UserDataAccount を作成する
  2. 必須フィールド (FirstNameRemoteIdDisplayPicture) を含む連絡先を格納する
  3. ランク付きの ContactAnnotationList を作成する
  4. 各注釈に SupportedOperations = Share を設定する
  5. 新しさと頻度に基づいて定期的にランキングを更新する
  6. 30 日以上経過した古い連絡先を排除する

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