Estruturas inseridas no Xamarin.iOS

Este documento descreve como os desenvolvedores de aplicativos podem inserir estruturas de usuário em seus aplicativos.

Com o iOS 8.0, a Apple possibilitou criar uma estrutura inserida para compartilhar código entre extensões de aplicativo e o aplicativo main no Xcode.

O Xamarin.iOS 9.0 adiciona suporte para consumir essas estruturas inseridas (criadas com Xcode) em aplicativos Xamarin.iOS. Não será possível criar estruturas inseridas de nenhum tipo de projeto Xamarin.iOS, consumindo apenas estruturas nativas existentes (Objective-C).

Há duas maneiras de consumir estruturas no Xamarin.iOS:

  • Passe a estrutura para a ferramenta mtouch adicionando o seguinte aos argumentos mtouch adicionais nas opções de build do iOS do projeto:

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

    Isso deve ser definido para cada configuração de projeto.

  • Adicionar Referências Nativas no menu de contexto

Clique com o botão direito do mouse em Projeto e navegue até Adicionar Referências Nativas

Selecione Adicionar referências nativas no Visual Studio para Mac

Isso funcionará para todas as configurações.

Em versões futuras do Visual Studio para Mac e das Ferramentas do Xamarin para Visual Studio, será possível consumir estruturas de dentro do IDE (sem editar arquivos de projeto manualmente).

Alguns projetos de exemplo podem ser encontrados no github

Limitações

  • As estruturas inseridas só têm suporte em projetos unificados .
  • As estruturas inseridas só têm suporte em projetos com um destino de implantação de pelo menos o iOS 8.0.
  • Se uma extensão exigir uma estrutura inserida, o aplicativo de contêiner também deverá ter uma referência à estrutura; caso contrário, a estrutura não será incluída no pacote do aplicativo.

O runtime Mono

Internamente, o Xamarin.iOS aproveita esse recurso para se vincular ao runtime mono como uma estrutura, em vez de vincular o runtime Mono estaticamente a cada extensão e ao aplicativo de contêiner.

Isso será feito automaticamente se o aplicativo de contêiner for um aplicativo Unificado, ele contiver extensões e a implantação de destino for iOS 8.0 ou superior.

Os aplicativos sem extensões ainda serão vinculados ao runtime mono estaticamente, pois haverá uma penalidade de tamanho para usar uma estrutura se houver apenas um aplicativo referenciando-o.

Esse comportamento pode ser substituído pelo desenvolvedor do aplicativo, adicionando o seguinte como um argumento mtouch adicional nas opções de build do iOS do projeto:

  • --mono:static: links com o runtime mono estaticamente.
  • --mono:framework: links com o runtime mono como uma estrutura.

Um cenário para a vinculação com o runtime mono como uma estrutura mesmo para aplicativos sem extensões é diminuir o tamanho executável, para superar quaisquer restrições de tamanho que a Apple impõe ao executável. Para referência, o runtime mono adiciona aproximadamente 1,7 MB por arquitetura (a partir do Xamarin.iOS 8.12, no entanto, ele varia entre versões e até mesmo entre aplicativos). A estrutura Mono adiciona aproximadamente 2,3 MB por arquitetura, o que significa que, para um aplicativo de arquitetura única sem extensões, tornar o link do aplicativo com o runtime Mono como uma estrutura reduzirá o executável em ~1,7 MB, mas adicionará uma estrutura de ~2,3 MB, resultando em um aplicativo maior de ~0,6 MB completamente.