Xamarin.Essentials – Plattformübergreifende APIs

Mit Xamarin.Forms versucht man ja auf einer einzigen Code-Basis sowohl die Business-Logik als auch das Layout abzubilden. Dies funktioniert in weiten Teilen auch recht gut, aber trotzdem gelangt man immer wieder an den Punkt, wo man plattformspezifischen Code benötigt. Ich denke hier zum Beispiel an das Abrufen der aktuellen Position des Nutzers oder das Versenden einer SMS/eMail. Es gibt hier eine Vielzahl von Features, welche plattformspezifisch umgesetzt werden müssten. Glücklicherweise hat die Community hier zahlreiche NuGet-Packages bereit gestellt, welche man in seine Xamarin.Forms App integrieren kann. Nun hat man sich jedoch hingesetzt und diese Funktionalitäten alle in ein großes NuGet-Package zusammengefasst, welches auf den Namen Xamarin.Essentials hört und zur Zeit in einer Preview-Version vorliegt.

Derzeit beinhaltet das NuGet-Package Implementierungen für die folgenden Features: Beschleunigungsmesser, Informationen über die  App, Batterie, Zwischenablage, Kompass, Konnektivität, Datenübertragung, Informationen über das Display, Informationen über das Gerät, eMail, File System Hilfsprogramm, Taschenlampe, Geocodierung, Geolocation, Gyroskop, Magnetometer, Im Browser öffnen, Telefon-Wählhilfe, Einstellungen, Bildschirm sperren, Sicherer Speicher, SMS, Sprachausgabe, Versionsüberwachung, Vibration.

Die Verwendung ist dabei recht simpel. Man fügt einfach das NuGet-Package zum bestehenden Xamarin.Forms Projekt hinzu. Hierbei muss man darauf achten, dass das Häkchen Include prerelease gesetzt ist, weil es sich derzeit noch um eine Preview handelt. Anschließend kann dann direkt mit der Verwendung loslegen. Hierzu gibt es einen Getting Started Guide und natürlich für jedes Feature auch noch eine Beschreibung in der Hilfe.

Um nun zum Beispiel die letzte bekannte Position des Nutzers abzufragen genügt diese Code-Zeilen im portablen Teil der Xamarin.Forms App:

private async void GetLastKnownLocationButtonOnClicked(object sender, EventArgs e)
{
  try
  {
    var location = await Geolocation.GetLastKnownLocationAsync();
    await DisplayAlert("Geolocation", location != null 
        ? $"Latitude: {location.Latitude} Longitude: {location.Longitude}" 
        : "Your last known location is currently unknown.", "Ok");
  }
  catch (Exception ex)
  {
    await DisplayAlert("Geolocation", $"Something went wrong: {ex}", "Ok");
  }
}

Auch die anderen Features sind mit sehr wenig Aufwand in die eigene App zu integrieren und es müssen somit nicht mehr zahlreiche verschiedene Packages zum Projekt hinzugefügt werden, sondern es können schnell und bequem zahlreiche plattformspezifische APIs verwendet werden.

Ich habe mir das aktuelle NuGet-Package einmal angeschaut und eine kleine Demo-Anwendung entwickelt, welche ich auf GitHub zur Verfügung stelle. Hier zeige ich die einfache Verwendung von einigen der Features sowohl unter Android als auch unter iOS und UWP.

Die folgende Animation zeigt einen Ausschnitt aus der Demo-Anwendung unter Android.

Und hier das ganze noch einmal unter UWP.

Zum jetzigen Zeitpunkt kann ich nur meine absolute Empfehlung für dieses NuGet-Package aussprechen, denn es deckt einfach einen großen Teil plattformspezifischer Komponenten ab, welche man nun doch ganz einfach verwenden kann ohne darüber nachzudenken.

Rückblick: Expert Day for Xamarin 2020 App Tracking Transparency Permission in Xamarin.Forms für iOS AppCenter.Analytics: Eigene Events tracken