Миграция привязки в Unified API

В этой статье рассматриваются действия, необходимые для обновления существующего проекта привязки Xamarin для поддержки унифицированных API для приложений Xamarin.IOS и Xamarin.Mac.

Обзор

Начиная с 1 февраля 2015 г. Apple требует, чтобы все новые отправки в iTunes и Mac App Store должны быть 64-разрядными приложениями. В результате все новые приложения Xamarin.iOS или Xamarin.Mac должны будут использовать новый унифицированный API вместо существующих классических API MonoTouch и MonoMac для поддержки 64-разрядных api.

Кроме того, любой проект привязки Xamarin также должен поддерживать новые унифицированные API, которые должны быть включены в 64-разрядный проект Xamarin.iOS или Xamarin.Mac. В этой статье рассматриваются действия, необходимые для обновления существующего проекта привязки для использования единого API.

Требования

Для выполнения описанных в этой статье действий необходимо выполнить следующие действия.

  • Visual Studio для Mac — последняя версия Visual Studio для Mac установлена и настроена на компьютере разработки.
  • Apple Mac — Apple mac требуется для создания проектов привязки для iOS и Mac.

Проекты привязки не поддерживаются в Visual Studio на компьютере с Windows.

Изменение инструкций using

Объединенные API упрощает совместное использование кода между Mac и iOS, а также позволяет поддерживать 32 и 64-разрядные приложения с одинаковым двоичным файлом. Удаляя префиксы MonoMac и MonoTouch из пространств имен, проще использовать общий доступ в проектах приложений Xamarin.Mac и Xamarin.iOS.

В результате нам потребуется изменить любые контракты привязки (и другие .cs файлы в проекте привязки), чтобы удалить префиксы MonoMac и MonoTouch из наших using заявлений.

Например, учитывая следующие инструкции using в контракте привязки:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;

Мы отключим префикс, что приводит к следующему MonoTouch :

using System;
using System.Drawing;
using Foundation;
using UIKit;
using ObjCRuntime;

Опять же, нам потребуется сделать это для любого .cs файла в проекте привязки. На этом этапе необходимо обновить проект привязки для использования новых собственных типов данных.

Дополнительные сведения об унифицированном API см. в документации по унифицированным API . Дополнительные сведения о поддержке 32 и 64-разрядных приложений и сведения о платформах см. в документации по 32 и 64-разрядной платформе .

Обновление до собственных типов данных

Objective-CNSInteger сопоставляет тип int32_t данных с 32-разрядными системами и int64_t 64-разрядными системами. Чтобы соответствовать этому поведению, новый унифицированный API заменяет предыдущее использование int (которое в .NET определяется как всегда) System.Int32новым типом данных: System.nint

Наряду с новым nint типом данных объединенный API вводит nuint и nfloat типы для сопоставления с NSUInteger типами и CGFloat типами.

Учитывая приведенные выше сведения, необходимо проверить наш API и убедиться, что любой экземплярNSInteger, с которым мы ранее сопоставлялисьint, uint и floatCGFloat обновляться с новыми nintnuint типами.nfloatNSUInteger

Например, при определении Objective-C метода:

-(NSInteger) add:(NSInteger)operandUn and:(NSInteger) operandDeux;

Если предыдущий контракт привязки имел следующее определение:

[Export("add:and:")]
int Add(int operandUn, int operandDeux);

Мы обновим новую привязку следующим образом:

[Export("add:and:")]
nint Add(nint operandUn, nint operandDeux);

Если мы сопоставляем более новую версию 3-й сторонней библиотеки, чем то, что мы изначально связали, необходимо просмотреть .h файлы заголовков библиотеки и узнать, какие-либо выходы, явные вызовы int, int32_tunsigned intuint32_t или float были обновлены, чтобы быть или .CGFloatNSIntegerNSUInteger В этом случае те же изменения и nintnuintnfloat типы должны быть сделаны для их сопоставлений.

Дополнительные сведения об этих изменениях типов данных см. в документе "Собственные типы ".

Обновление типов CoreGraphics

Типы данных точки, размера и прямоугольника, которые используются с CoreGraphics использованием 32 или 64 битов в зависимости от устройства, на котором они работают. При первоначальной привязке API iOS и Mac мы использовали существующие структуры данных, которые соответствовали типам System.Drawing данных (RectangleF например).

Из-за требований к поддержке 64-разрядных и новых собственных типов данных необходимо внести следующие корректировки в существующий код при вызове CoreGraphic методов:

  • CGRect — используйте CGRect вместо RectangleF определения прямоугольных областей с плавающей запятой.
  • CGSize — используйте CGSize вместо SizeF определения размеров с плавающей запятой (ширина и высота).
  • CGPoint — используйте CGPoint вместо PointF определения расположения с плавающей запятой (координаты X и Y).

Учитывая приведенные выше сведения, необходимо проверить наш API и убедиться, что любой экземпляр CGRectCGSize или CGPoint ранее привязан к SizeFRectangleFсобственному типу или PointF был изменен на собственный тип CGRectCGSize или CGPoint напрямую.

Например, присвоить инициализатору Objective-C :

- (id)initWithFrame:(CGRect)frame;

Если предыдущая привязка включала следующий код:

[Export ("initWithFrame:")]
IntPtr Constructor (RectangleF frame);

Мы обновим этот код следующим образом:

[Export ("initWithFrame:")]
IntPtr Constructor (CGRect frame);

При всех изменениях кода теперь необходимо изменить проект привязки или внести файл для привязки к унифицированным API.

Изменение проекта привязки

В качестве последнего шага по обновлению проекта привязки для использования объединенных API необходимо изменить MakeFile то, что мы используем для сборки проекта или типа проекта Xamarin (если мы привязываемся из Visual Studio для Mac) и указать btouch привязаться к унифицированным API вместо классических.

Обновление MakeFile

Если мы используем makefile для сборки проекта привязки в Xamarin .DLL, нам потребуется включить --new-style параметр командной строки и вызвать btouch-native вместо него btouch.

Таким образом, учитывая следующее 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

Нам нужно переключиться с вызова btouchbtouch-native, поэтому мы изменим определение макроса следующим образом:

BTOUCH=/Developer/MonoTouch/usr/bin/btouch-native

Мы обновим вызов btouch и добавьте --new-style этот параметр следующим образом:

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

Теперь мы можем выполнить сборку MakeFile новой 64-разрядной версии нашего API.

Обновление типа проекта привязки

Если для создания api используется шаблон проекта привязки Visual Studio для Mac, необходимо обновить новую версию единого API шаблона проекта привязки. Самый простой способ сделать это — запустить новый проект привязки унифицированных API и скопировать все существующие код и параметры.

Выполните следующие действия.

  1. Запустите Visual Studio для Mac.

  2. Выберите новое>решение для создания файла...>

  3. В диалоговом окне создания решения выберите проект привязки iOS>unified API>iOS:

    In the New Solution Dialog Box, select iOS / Unified API / iOS Binding Project

  4. В диалоговом окне "Настройка нового проекта" введите имя нового проекта привязки и нажмите кнопку "ОК ".

  5. Включите 64-разрядную версию библиотеки Objective-C , для которую вы будете создавать привязки.

  6. Скопируйте исходный код из существующего 32-разрядного проекта привязки классического API (например, файлов и StructsAndEnums.cs т. дApiDefinition.cs.).

  7. Внесите указанные выше изменения в файлы исходного кода.

При всех этих изменениях вы можете создать новую 64-разрядную версию API, как и 32-разрядную версию.

Итоги

В этой статье показаны изменения, которые необходимо вносить в существующий проект привязки Xamarin для поддержки новых унифицированных API и 64-разрядных устройств, а также шаги, необходимые для создания новой 64-разрядной совместимой версии API.