Migrar uma associação para a API unificada
Este artigo aborda as etapas necessárias para atualizar um projeto de vinculação Xamarin existente para oferecer suporte às APIs unificadas para aplicativos Xamarin.IOS e Xamarin.Mac.
Visão geral
A partir de 1º de fevereiro de 2015, a Apple exige que todos os novos envios para o iTunes e a Mac App Store sejam aplicativos de 64 bits. Como resultado, qualquer novo aplicativo Xamarin.iOS ou Xamarin.Mac precisará usar a nova API unificada em vez das APIs Classic MonoTouch e MonoMac existentes para oferecer suporte a 64 bits.
Além disso, qualquer projeto de vinculação do Xamarin também deve oferecer suporte às novas APIs unificadas a serem incluídas em um projeto Xamarin.iOS ou Xamarin.Mac de 64 bits. Este artigo abordará as etapas necessárias para atualizar um projeto de vinculação existente para usar a API unificada.
Requisitos
O seguinte é necessário para concluir as etapas apresentadas neste artigo:
- Visual Studio para Mac - A versão mais recente do Visual Studio para Mac instalada e configurada no computador de desenvolvimento.
- Apple Mac - Um Mac Apple é necessário para criar projetos de vinculação para iOS e Mac.
Projetos de vinculação não são suportados no Visual Studio em um computador Windows.
Modificar as instruções Using
As APIs unificadas tornam mais fácil do que nunca compartilhar código entre Mac e iOS, além de permitir que você ofereça suporte a aplicativos de 32 e 64 bits com o mesmo binário. Ao remover os prefixos MonoMac e MonoTouch dos namespaces, o compartilhamento mais simples é obtido em projetos de aplicativos Xamarin.Mac e Xamarin.iOS.
Como resultado, precisaremos modificar qualquer um de nossos contratos vinculativos (e outros .cs
arquivos em nosso projeto de vinculação) para remover os prefixos MonoMac e MonoTouch de nossas using
declarações.
Por exemplo, considerando o seguinte usando instruções em um contrato vinculante:
using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;
Retiraríamos o prefixo MonoTouch
resultando no seguinte:
using System;
using System.Drawing;
using Foundation;
using UIKit;
using ObjCRuntime;
Novamente, precisaremos fazer isso para qualquer .cs
arquivo em nosso projeto de vinculação. Com essa alteração, a próxima etapa é atualizar nosso projeto de vinculação para usar os novos tipos de dados nativos.
Para obter mais informações sobre a API unificada, consulte a documentação da API unificada. Para obter mais informações sobre o suporte a aplicativos de 32 e 64 bits e informações sobre estruturas, consulte a documentação Considerações sobre plataformas de 32 e 64 bits.
Atualizar para tipos de dados nativos
Objective-C mapeia o NSInteger
tipo de dados para int32_t
sistemas de 32 bits e para sistemas de int64_t
64 bits. Para corresponder a esse comportamento, a nova API unificada substitui os usos anteriores de (que no .NET é definido como sempre sendoSystem.Int32
) para um novo tipo de int
dados: System.nint
.
Junto com o novo nint
tipo de dados, a API Unificada introduz os nuint
e nfloat
tipos, para mapeamento para os NSUInteger
e CGFloat
tipos também.
Diante do exposto acima, precisamos revisar nossa API e garantir que qualquer instância do NSInteger
, NSUInteger
e CGFloat
que mapeamos anteriormente para int
, uint
e float
seja atualizada para o novo nint
, nuint
e nfloat
tipos.
Por exemplo, dada uma Objective-C definição de método de:
-(NSInteger) add:(NSInteger)operandUn and:(NSInteger) operandDeux;
Se o contrato vinculante anterior tivesse a seguinte definição:
[Export("add:and:")]
int Add(int operandUn, int operandDeux);
Atualizaríamos a nova vinculação para ser:
[Export("add:and:")]
nint Add(nint operandUn, nint operandDeux);
Se estivermos mapeando para uma biblioteca de terceiros de versão mais recente do que a que tínhamos inicialmente vinculado, precisamos revisar os arquivos de cabeçalho da .h
biblioteca e ver se alguma chamada explícita de saída para int
, int32_t
, uint32_t
unsigned int
, ou float
foi atualizada para ser um NSInteger
, NSUInteger
ou um CGFloat
. Em caso afirmativo, as mesmas modificações no nint
, nuint
e nfloat
tipos também precisarão ser feitas em seus mapeamentos.
Para saber mais sobre essas alterações de tipo de dados, consulte o documento Tipos nativos .
Atualizar os tipos CoreGraphics
Os tipos de dados de ponto, tamanho e retângulo usados usam CoreGraphics
32 ou 64 bits, dependendo do dispositivo em que estão sendo executados. Quando o Xamarin vinculou originalmente as APIs do iOS e do Mac, usamos estruturas de dados existentes que correspondiam aos tipos de dados em System.Drawing
(RectangleF
por exemplo).
Devido aos requisitos para oferecer suporte a 64 bits e aos novos tipos de dados nativos, os seguintes ajustes precisarão ser feitos no código existente ao chamar CoreGraphic
métodos:
- CGRect - Use
CGRect
em vez de ao definir regiões retangulares deRectangleF
ponto flutuante. - CGSize - Use
CGSize
em vez de ao definir tamanhos deSizeF
ponto flutuante (largura e altura). - CGPoint - Use
CGPoint
em vez de ao definir um local dePointF
ponto flutuante (coordenadas X e Y).
Diante do exposto acima, precisaremos revisar nossa API e garantir que qualquer instância do CGRect
, CGSize
ou CGPoint
que foi anteriormente vinculada ao RectangleF
, SizeF
ou PointF
seja alterada para o tipo CGRect
nativo , CGSize
ou CGPoint
diretamente.
Por exemplo, dado um Objective-C inicializador de:
- (id)initWithFrame:(CGRect)frame;
Se nossa vinculação anterior incluísse o seguinte código:
[Export ("initWithFrame:")]
IntPtr Constructor (RectangleF frame);
Atualizaríamos esse código para:
[Export ("initWithFrame:")]
IntPtr Constructor (CGRect frame);
Com todas as alterações de código agora em vigor, precisamos modificar nosso projeto de vinculação ou fazer com que o arquivo seja vinculado às APIs Unificadas.
Modificar o projeto de vinculação
Como etapa final para atualizar nosso projeto de vinculação para usar as APIs Unificadas, precisamos modificar o MakeFile
que usamos para criar o projeto ou o Tipo de Projeto Xamarin (se estivermos vinculando de dentro do Visual Studio para Mac) e instruir o btouch a vincular às APIs Unificadas em vez das Clássicas.
Atualizando um MakeFile
Se estivermos usando um makefile para criar nosso projeto de vinculação em um .DLL Xamarin, precisaremos incluir a --new-style
opção de linha de comando e chamar btouch-native
em vez de btouch
.
Assim, dado o seguinte MakeFile
:
BINDDIR=/src/binding
XBUILD=/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
PROJECT_ROOT=XMBindingLibrarySample
PROJECT=$(PROJECT_ROOT)/XMBindingLibrarySample.xcodeproj
TARGET=XMBindingLibrarySample
BTOUCH=/Developer/MonoTouch/usr/bin/btouch
all: XMBindingLibrary.dll
libXMBindingLibrarySample-i386.a:
$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphonesimulator -configuration Release clean build
-mv $(PROJECT_ROOT)/build/Release-iphonesimulator/lib$(TARGET).a $@
libXMBindingLibrarySample-arm64.a:
$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch arm64 -configuration Release clean build
-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@
libXMBindingLibrarySample-armv7.a:
$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch armv7 -configuration Release clean build
-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@
libXMBindingLibrarySampleUniversal.a: libXMBindingLibrarySample-armv7.a libXMBindingLibrarySample-i386.a libXMBindingLibrarySample-arm64.a
lipo -create -output $@ $^
XMBindingLibrary.dll: AssemblyInfo.cs XMBindingLibrarySample.cs extras.cs libXMBindingLibrarySampleUniversal.a
$(BTOUCH) -unsafe -out:$@ XMBindingLibrarySample.cs -x=AssemblyInfo.cs -x=extras.cs --link-with=libXMBindingLibrarySampleUniversal.a,libXMBindingLibrarySampleUniversal.a
clean:
-rm -f *.a *.dll
Precisamos mudar de chamada btouch
para btouch-native
, então ajustamos nossa definição de macro da seguinte maneira:
BTOUCH=/Developer/MonoTouch/usr/bin/btouch-native
Atualizaríamos a chamada e btouch
adicionaríamos a --new-style
opção da seguinte maneira:
XMBindingLibrary.dll: AssemblyInfo.cs XMBindingLibrarySample.cs extras.cs libXMBindingLibrarySampleUniversal.a
$(BTOUCH) -unsafe --new-style -out:$@ XMBindingLibrarySample.cs -x=AssemblyInfo.cs -x=extras.cs --link-with=libXMBindingLibrarySampleUniversal.a,libXMBindingLibrarySampleUniversal.a
Agora podemos executar o nosso MakeFile
como normal para construir a nova versão de 64 bits da nossa API.
Atualizando um tipo de projeto de vinculação
Se estivermos usando um Modelo de Projeto de Vinculação do Visual Studio para Mac para criar nossa API, precisaremos atualizar para a nova versão da API Unificada do Modelo de Projeto de Vinculação. A maneira mais fácil de fazer isso é iniciar um novo Projeto de Vinculação de API Unificada e copiar todo o código e as configurações existentes.
Faça o seguinte:
Inicie o Visual Studio para Mac.
Selecione Arquivo>Nova>Solução...
Na caixa de diálogo Nova Solução, selecione Projeto>de Vinculação do iOS da API>Unificada do iOS:
Na caixa de diálogo 'Configurar seu novo projeto', insira um Nome para o novo projeto de vinculação e clique no botão OK .
Inclua a versão de 64 bits da Objective-C biblioteca para a qual você criará associações.
Copie o código-fonte do seu projeto de vinculação de API clássica de 32 bits existente (como o
ApiDefinition.cs
eStructsAndEnums.cs
arquivos).Faça as alterações acima observadas nos arquivos de código-fonte.
Com todas essas alterações em vigor, você pode criar a nova versão de 64 bits da API como faria com a versão de 32 bits.
Resumo
Neste artigo, mostramos as alterações que precisam ser feitas em um projeto de vinculação Xamarin existente para oferecer suporte às novas APIs unificadas e dispositivos de 64 bits e as etapas necessárias para criar a nova versão compatível de 64 bits de uma API.