Миграция привязки в 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
и float
CGFloat
обновляться с новыми nint
nuint
типами.nfloat
NSUInteger
Например, при определении 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_t
unsigned int
uint32_t
или float
были обновлены, чтобы быть или .CGFloat
NSInteger
NSUInteger
В этом случае те же изменения и nint
nuint
nfloat
типы должны быть сделаны для их сопоставлений.
Дополнительные сведения об этих изменениях типов данных см. в документе "Собственные типы ".
Обновление типов CoreGraphics
Типы данных точки, размера и прямоугольника, которые используются с CoreGraphics
использованием 32 или 64 битов в зависимости от устройства, на котором они работают. При первоначальной привязке API iOS и Mac мы использовали существующие структуры данных, которые соответствовали типам System.Drawing
данных (RectangleF
например).
Из-за требований к поддержке 64-разрядных и новых собственных типов данных необходимо внести следующие корректировки в существующий код при вызове CoreGraphic
методов:
- CGRect — используйте
CGRect
вместоRectangleF
определения прямоугольных областей с плавающей запятой. - CGSize — используйте
CGSize
вместоSizeF
определения размеров с плавающей запятой (ширина и высота). - CGPoint — используйте
CGPoint
вместоPointF
определения расположения с плавающей запятой (координаты X и Y).
Учитывая приведенные выше сведения, необходимо проверить наш API и убедиться, что любой экземпляр CGRect
CGSize
или CGPoint
ранее привязан к SizeF
RectangleF
собственному типу или PointF
был изменен на собственный тип CGRect
CGSize
или 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
Нам нужно переключиться с вызова btouch
btouch-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 и скопировать все существующие код и параметры.
Выполните следующие действия.
Запустите Visual Studio для Mac.
Выберите новое>решение для создания файла...>
В диалоговом окне создания решения выберите проект привязки iOS>unified API>iOS:
В диалоговом окне "Настройка нового проекта" введите имя нового проекта привязки и нажмите кнопку "ОК ".
Включите 64-разрядную версию библиотеки Objective-C , для которую вы будете создавать привязки.
Скопируйте исходный код из существующего 32-разрядного проекта привязки классического API (например, файлов и
StructsAndEnums.cs
т. дApiDefinition.cs
.).Внесите указанные выше изменения в файлы исходного кода.
При всех этих изменениях вы можете создать новую 64-разрядную версию API, как и 32-разрядную версию.
Итоги
В этой статье показаны изменения, которые необходимо вносить в существующий проект привязки Xamarin для поддержки новых унифицированных API и 64-разрядных устройств, а также шаги, необходимые для создания новой 64-разрядной совместимой версии API.