Frameworks incorporés dans Xamarin.iOS

Ce document décrit comment les développeurs d’applications peuvent incorporer des infrastructures utilisateur dans leurs applications.

Avec iOS 8.0, Apple a permis de créer une infrastructure incorporée pour partager du code entre les extensions d’application et l’application main dans Xcode.

Xamarin.iOS 9.0 ajoute la prise en charge de l’utilisation de ces frameworks incorporés (créés avec Xcode) dans les applications Xamarin.iOS. Il ne sera pas possible de créer des frameworks incorporés à partir d’un type de projets Xamarin.iOS, mais de consommer uniquement des frameworks natifs (Objective-C) existants.

Il existe deux façons d’utiliser des frameworks dans Xamarin.iOS :

  • Passez l’infrastructure à l’outil mtouch, en ajoutant ce qui suit aux arguments mtouch supplémentaires dans les options de génération iOS du projet :

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

    Cela doit être défini pour chaque configuration de projet.

  • Ajouter des références natives à partir du menu contextuel

Cliquez avec le bouton droit sur Projet et accédez à Ajouter des références natives

Sélectionnez Ajouter des références natives dans Visual Studio pour Mac

Cela fonctionne pour toutes les configurations.

Dans les versions ultérieures de Visual Studio pour Mac et de Xamarin Tools pour Visual Studio, il sera possible d’utiliser des frameworks à partir de l’IDE (sans modifier manuellement les fichiers projet).

Vous trouverez quelques exemples de projets sur github

Limites

  • Les frameworks incorporés sont uniquement pris en charge dans les projets unifiés .
  • Les frameworks incorporés sont uniquement pris en charge dans les projets avec une cible de déploiement d’au moins iOS 8.0.
  • Si une extension nécessite une infrastructure incorporée, l’application conteneur doit également avoir une référence à l’infrastructure. Sinon, l’infrastructure ne sera pas incluse dans l’offre groupée d’applications.

Le runtime Mono

En interne, Xamarin.iOS tire parti de cette fonctionnalité pour établir une liaison avec le runtime Mono en tant que framework, au lieu de lier statiquement le runtime Mono à chaque extension et à l’application conteneur.

Cette opération est effectuée automatiquement si l’application conteneur est une application unifiée, qu’elle contient des extensions et que le déploiement cible est iOS 8.0 ou version ultérieure.

Les applications sans extensions sont toujours liées statiquement au runtime Mono, car l’utilisation d’une infrastructure entraîne une pénalité de taille si une seule application le référence.

Ce comportement peut être remplacé par le développeur de l’application, en ajoutant ce qui suit en tant qu’argument mtouch supplémentaire dans les options de génération iOS du projet :

  • --mono:static: établit des liens statiques avec le runtime Mono.
  • --mono:framework: liens avec le runtime Mono en tant que framework.

Un scénario de liaison avec le runtime Mono en tant qu’infrastructure, même pour les applications sans extensions, consiste à réduire la taille de l’exécutable, afin de surmonter les restrictions de taille appliquées par Apple sur l’exécutable. Pour référence, le runtime Mono ajoute environ 1,7 Mo par architecture (à partir de Xamarin.iOS 8.12, mais son varie entre les versions, et même entre les applications). L’infrastructure Mono ajoute environ 2,3 Mo par architecture, ce qui signifie que pour une application à architecture unique sans extensions, le fait de lier l’application au runtime Mono en tant que framework réduit l’exécutable d’environ 1,7 Mo, mais ajoute une infrastructure d’environ 2,3 Mo, ce qui entraîne une application plus grande d’environ 0,6 Mo.