Eingebettete Frameworks in Xamarin.iOS

In diesem Dokument wird beschrieben, wie Anwendungsentwickler Benutzerframeworks in ihre Apps einbetten können.

Mit iOS 8.0 ermöglichte Apple die Erstellung eines eingebetteten Frameworks zum Freigeben von Code zwischen App-Erweiterungen und der Standard App in Xcode.

Xamarin.iOS 9.0 bietet Unterstützung für die Verwendung dieser eingebetteten Frameworks (erstellt mit Xcode) in Xamarin.iOS-Apps. Es ist nicht möglich, eingebettete Frameworks aus jedem Typ von Xamarin.iOS-Projekten zu erstellen, da nur vorhandene native (Objective-C) Frameworks verwendet werden.

Es gibt zwei Möglichkeiten, Frameworks in Xamarin.iOS zu nutzen:

  • Übergeben Sie das Framework an das mtouch-Tool, indem Sie den zusätzlichen mtouch-Argumenten in den iOS-Buildoptionen des Projekts Folgendes hinzufügen:

    --framework:/Path/To/My.Framework
    

    Dies muss für jede Projektkonfiguration festgelegt werden.

  • Hinzufügen nativer Verweise aus dem Kontextmenü

Klicken Sie mit der rechten Maustaste auf Projekt, und navigieren Sie zum Hinzufügen nativer Verweise.

Wählen Sie Native Verweise in Visual Studio für Mac hinzufügen aus.

Dies funktioniert für alle Konfigurationen.

In zukünftigen Versionen von Visual Studio für Mac und den Xamarin-Tools für Visual Studio wird es möglich sein, Frameworks innerhalb der IDE zu nutzen (ohne Projektdateien manuell zu bearbeiten).

Einige Beispielprojekte finden Sie auf github

Einschränkungen

  • Eingebettete Frameworks werden nur in Unified-Projekten unterstützt.
  • Eingebettete Frameworks werden nur in Projekten mit einem Bereitstellungsziel von mindestens iOS 8.0 unterstützt.
  • Wenn eine Erweiterung ein eingebettetes Framework erfordert, muss die Container-App auch über einen Verweis auf das Framework verfügen, andernfalls ist das Framework nicht im App-Bündel enthalten.

Die Mono-Laufzeit

Intern nutzt Xamarin.iOS dieses Feature, um mit der Mono-Runtime als Framework zu verknüpfen, anstatt die Mono-Runtime statisch mit jeder Erweiterung und der Container-App zu verknüpfen.

Dies geschieht automatisch, wenn es sich bei der Container-App um eine einheitliche App handelt, sie Erweiterungen enthält und die Zielbereitstellung iOS 8.0 oder höher ist.

Apps ohne Erweiterungen verknüpfen weiterhin statisch mit der Mono-Runtime, da es eine Größenstrafe für die Verwendung eines Frameworks gibt, wenn nur eine App darauf verweist.

Dieses Verhalten kann vom App-Entwickler überschrieben werden, indem er folgendes als zusätzliches mtouch-Argument den iOS-Buildoptionen des Projekts hinzufügt:

  • --mono:static: Verknüpft statisch mit der Mono-Runtime.
  • --mono:framework: Verknüpft mit der Mono-Runtime als Framework.

Ein Szenario für die Verknüpfung mit der Mono-Runtime als Framework auch für Apps ohne Erweiterungen besteht darin, die ausführbare Größe zu verringern, um alle Größenbeschränkungen zu überwinden, die Apple für die ausführbare Datei erzwingt. Als Referenz fügt die Mono-Runtime ungefähr 1,7 MB pro Architektur hinzu (ab Xamarin.iOS 8.12, jedoch variiert seine Laufzeit zwischen Releases und sogar zwischen Apps). Das Mono-Framework fügt ca. 2,3 MB pro Architektur hinzu. Dies bedeutet, dass für eine Einzelarchitektur-App ohne Erweiterungen die Verknüpfung der App mit der Mono-Runtime als Framework die ausführbare Datei um ~1,7 MB verkleinern wird, aber ein Framework von ~2,3 MB hinzugefügt wird, was zu einer insgesamt um ca. 0,6 MB größeren App führt.