Clasificación de contactos para Compartir de Windows

Las aplicaciones pueden proporcionar clasificaciones para sus contactos principales agregando anotaciones de contacto para Windows Share. En este artículo se describe la creación de una lista de anotaciones, el almacenamiento de clasificaciones con la operación Share, la actualización de la lista clasificada y los procedimientos recomendados de clasificación.

Antes de empezar, aporte sus contactos a Windows.

Almacenamiento de rangos para contactos

Puede crear una lista de anotaciones para el UserDataAccount para almacenar rangos para sus contactos. Las aplicaciones pueden almacenar rangos para sus contactos principales añadiendo anotaciones a los contactos. Estas anotaciones se almacenan como parte de una lista de anotaciones en el almacén de contactos.

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

Puede almacenar rangos para sus contactos principales utilizando las anotaciones en los contactos. Los rangos se almacenan como parte de ProviderProperties en una anotación de contacto. Junto con el rango, las aplicaciones deben establecer SupportedOperations en una anotación de contacto como 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);
}

Referencia de valor de clasificación

Aspecto Guidance
Clave de propiedad "Rank" en el diccionario de la anotación ProviderProperties
Tipo de valor Entero no negativo.
Direction Los valores inferiores tienen prioridad en la lista de la aplicación. Un rango de 0 no es "ignorar"; sigue el mismo orden de menor a mayor valor.
Unicidad Asigne un rango único a cada contacto de la lista. No se especifica el comportamiento de los rangos duplicados.
Ámbito Las clasificaciones de tu aplicación solo expresan la prioridad dentro de su propia lista. Windows lee todas las Share anotaciones y usa lógica interna basada en el uso para ordenar contactos entre aplicaciones. Leer todas las anotaciones es independiente del número de sugerencias que muestra Windows.
Quién define el valor Tu aplicación. Elija cómo calcularlo, por ejemplo, a partir de la recencia y la frecuencia de interacción.

Actualización de los rangos de los contactos

Queda a discreción de las aplicaciones cuándo actualizar los rangos de los contactos almacenados en Windows. Windows recomienda que las listas clasificadas se actualicen regularmente para ofrecer la mejor experiencia de usuario. Siempre que necesites actualizar una lista clasificada, deberás seguir varios pasos.

  1. Elimine la ContactAnnotationList.

    Una vez que la aplicación tiene una lista actualizada de los contactos principales, se puede eliminar la lista de anotaciones y crear una nueva lista de anotaciones con anotaciones actualizadas para sus contactos principales.

    await this.contactAnnotationList.DeleteAsync();
    
  2. Crear un nuevo ContactAnnotationList. Siga los pasos de la sección Almacenamiento de rangos para contactos para crear una nueva lista de anotaciones y almacenar rangos para sus contactos principales.

Procedimientos recomendados para la clasificación

Para maximizar la relevancia de los contactos de tu app en la fila de sugerencias de la Share Sheet, sigue estos criterios de clasificación:

Clasificación por recencia y frecuencia

Calcule la clasificación como una combinación de:

  • Recency: when the user last interacted with each contact (Recency: cuando el usuario interactúe por última vez con cada contacto)
  • Frecuencia: frecuencia con la que el usuario interactúa con cada contacto

Dado que los valores de clasificación más bajos tienen prioridad, ordene los contactos por puntuación de más alto a más bajo y asigne las clasificaciones 1, 2, 3, etc. Por ejemplo, un contacto al que el usuario envió un mensaje ayer podría obtener el rango 1, mientras que un contacto al que se envió un mensaje hace 2 semanas podría obtener el rango 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));

Quitar contactos obsoletos

Los contactos con los que el usuario no ha interactuado en más de 30 días deben quitarse de la lista ordenada. Esto mantiene las sugerencias nuevas y relevantes:

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

Actualiza las clasificaciones con regularidad

Programe las actualizaciones de clasificación en una cadencia que tenga sentido para la aplicación: diariamente para las aplicaciones de mensajería, semanalmente para el correo electrónico o mensualmente para las aplicaciones de calendario. Use tareas en segundo plano si es necesario:

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

Lista de comprobación de la fila de sugerencias

Al clasificar y mantener los contactos con las instrucciones anteriores, los usuarios verán los contactos principales de la aplicación en la fila de sugerencias de la hoja de recursos compartidos de Windows. Esta ruta de acceso admite actualmente los contactos de People.

Para asegurarte de que tus contactos se muestren:

  1. Creación de un UserDataAccount con DisplayName = "com.microsoft.peoplecontract"
  2. Almacenar contactos con campos obligatorios (FirstName, RemoteId, DisplayPicture)
  3. Crear un objeto ContactAnnotationList con clasificaciones (los valores más bajos tienen prioridad)
  4. Establecer SupportedOperations = Share en cada anotación
  5. Actualice las clasificaciones regularmente en función de la actualidad y la frecuencia.
  6. Quitar contactos con los que el usuario no ha interactuado en más de 30 días de la lista clasificada

Consulta Compartir contenido de la aplicación y Recibir contenido en la aplicación para obtener la guía completa de integración de Share Sheet.