Skip to content

Contact Store | Getting Started

A cross-platform .NET MAUI library for accessing device contacts on Android and iOS. Provides full CRUD operations, LINQ query support, MAUI permission classes, and dependency injection integration.

  • GitHub stars for shinyorg/contactstore
  • NuGet package Shiny.Maui.ContactStore
  • Full CRUD — create, read, update, and delete device contacts
  • LINQ queriesIQueryable<Contact> with native translation on both platforms
  • MAUI permissionsContactPermission class for requesting read/write access
  • Permission extensionsRequestPermissionsAsync() and CheckPermissionStatusAsync() on IContactStore
  • AOT compatible — trimmer and AOT safe
  • Dependency injection — register with a single AddContactStore() call
PlatformMinimum Version
AndroidAPI 24
iOS15.0
  1. Install the NuGet package

    NuGet package Shiny.Maui.ContactStore
    Terminal window
    dotnet add package Shiny.Maui.ContactStore
  2. Register in MauiProgram.cs

    using Shiny.Maui.ContactStore;
    public static class MauiProgram
    {
    public static MauiApp CreateMauiApp()
    {
    var builder = MauiApp.CreateBuilder();
    builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>
    {
    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
    });
    builder.Services.AddContactStore();
    return builder.Build();
    }
    }
  3. Add platform permissions

    AndroidAndroidManifest.xml:

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />

    iOSInfo.plist:

    <key>NSContactsUsageDescription</key>
    <string>This app needs access to your contacts.</string>
  4. Inject IContactStore and request permissions

    using Shiny.Maui.ContactStore;
    public class MyViewModel(IContactStore contactStore)
    {
    public async Task LoadContacts()
    {
    var status = await contactStore.RequestPermissionsAsync();
    if (status != PermissionStatus.Granted)
    return;
    var contacts = await contactStore.GetAll();
    }
    }
// Request permissions
var status = await contactStore.RequestPermissionsAsync();
// Get all contacts
var contacts = await contactStore.GetAll();
// Query with LINQ
var results = contactStore.Query()
.Where(c => c.GivenName.Contains("John"))
.ToList();
// Create a contact
var contact = new Contact { GivenName = "John", FamilyName = "Doe" };
contact.Phones.Add(new ContactPhone("555-1234", PhoneType.Mobile));
string id = await contactStore.Create(contact);
// Update
contact.GivenName = "Jane";
await contactStore.Update(contact);
// Delete
await contactStore.Delete(id);

An AI skill is available for Shiny.Maui.ContactStore to help generate code for device contact access directly in your IDE.

Claude Code

Terminal window
claude plugin add github:shinyorg/skills

GitHub Copilot — Copy the shiny-contactstore skill file into your repository’s custom instructions.