Eingebettete Frameworks in Xamarin.iOS

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

Mit iOS 8.0 konnte Apple ein eingebettetes Framework erstellen, um Code zwischen App-Erweiterungen und der Haupt-App in Xcode freizugeben.

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

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

  • Übergeben Sie das Framework an das Mtouch-Tool, indem Sie die folgenden zusätzlichen mtouch-Argumente in den iOS-Buildoptionen des Projekts 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 Project, und navigieren Sie zum Hinzufügen nativer Verweise

Select Add native references in Visual Studio for Mac

Dies funktioniert für alle Konfigurationen.

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

Ein paar 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 wird das Framework nicht im App-Bundle enthalten.

Die Mono-Laufzeit

Intern nutzt Xamarin.iOS diese Funktion, um eine Verknüpfung mit der Mono-Runtime als Framework zu herstellen, anstatt die Mono-Runtime statisch in jede Erweiterung und die Container-App zu verknüpfen.

Dies erfolgt automatisch, wenn die Container-App eine Unified-App ist, es Erweiterungen enthält und die Zielbereitstellung iOS 8.0 oder höher ist.

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

Dieses Verhalten kann vom App-Entwickler außer Kraft gesetzt werden, indem Sie folgendes als zusätzliches mtouch-Argument in den iOS-Buildoptionen des Projekts hinzufügen:

  • --mono:static: Links mit der Mono-Laufzeit statisch.
  • --mono:framework: Verknüpfungen mit der Mono-Laufzeit als Framework.

Ein Szenario für die Verknüpfung mit der Mono-Runtime als Framework selbst für Apps ohne Erweiterungen besteht darin, die ausführbare Größe zu verringern, um alle Größenbeschränkungen zu überwinden, die Apple auf die ausführbare Datei erzwingt. Auf Referenz fügt die Mono-Runtime ungefähr 1,7 MB pro Architektur hinzu (ab Xamarin.iOS 8.12, jedoch variiert er zwischen Versionen und sogar zwischen Apps). Das Mono-Framework fügt ungefähr 2,3 MB pro Architektur hinzu, was bedeutet, dass für eine einzelne Architektur-App ohne Erweiterungen die App-Verknüpfung mit der Mono-Runtime als Framework verkleinern wird, um ~1,7 MB, aber ein ~2.3MB-Framework hinzufügt, das zu einer ~0,6MB größeren App führt.