Bagikan melalui


Memigrasikan Pengikatan ke API Terpadu

Artikel ini membahas langkah-langkah yang diperlukan untuk memperbarui Proyek Pengikatan Xamarin yang ada untuk mendukung API Terpadu untuk aplikasi Xamarin.IOS dan Xamarin.Mac.

Gambaran Umum

Mulai 1 Februari 2015 Apple mengharuskan semua pengiriman baru ke iTunes dan Mac App Store harus berupa aplikasi 64 bit. Akibatnya, aplikasi Xamarin.iOS atau Xamarin.Mac baru harus menggunakan API Terpadu baru alih-alih API MonoTouch dan MonoMac Klasik yang ada untuk mendukung 64 bit.

Selain itu, Proyek Pengikatan Xamarin apa pun juga harus mendukung API Terpadu baru untuk disertakan dalam proyek Xamarin.iOS atau Xamarin.Mac 64 bit. Artikel ini akan membahas langkah-langkah yang diperlukan untuk memperbarui proyek pengikatan yang ada untuk menggunakan API Terpadu.

Persyaratan

Berikut ini diperlukan untuk menyelesaikan langkah-langkah yang disajikan dalam artikel ini:

  • Visual Studio untuk Mac - Versi terbaru Visual Studio untuk Mac yang diinstal dan dikonfigurasi di komputer pengembangan.
  • Apple Mac - Mac Apple diperlukan untuk membangun Proyek Pengikatan untuk iOS dan Mac.

Proyek pengikatan tidak didukung di Visual studio pada komputer Windows.

Mengubah Menggunakan Pernyataan

API Terpadu mempermudah berbagi kode antara Mac dan iOS serta memungkinkan Anda mendukung aplikasi 32 dan 64 bit dengan biner yang sama. Dengan menghilangkan awalan MonoMac dan MonoTouch dari namespace layanan, berbagi yang lebih sederhana dicapai di seluruh proyek aplikasi Xamarin.Mac dan Xamarin.iOS.

Akibatnya, kami perlu memodifikasi salah satu kontrak pengikatan kami (dan file lain .cs dalam proyek pengikatan kami) untuk menghapus awalan MonoMac dan MonoTouch dari pernyataan kami using .

Misalnya, mengingat pernyataan penggunaan berikut dalam kontrak pengikatan:

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

Kami akan menghapus awalan MonoTouch yang mengakibatkan hal-hal berikut:

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

Sekali lagi, kita perlu melakukan ini untuk file apa pun .cs dalam proyek pengikatan kita. Dengan perubahan ini, langkah selanjutnya adalah memperbarui proyek pengikatan kami untuk menggunakan Jenis Data Asli baru.

Untuk informasi selengkapnya tentang API Terpadu, silakan lihat dokumentasi API Terpadu. Untuk latar belakang lebih lanjut tentang mendukung aplikasi 32 dan 64 bit dan informasi tentang kerangka kerja, lihat dokumentasi Pertimbangan Platform 32 dan 64 bit.

Perbarui ke Jenis Data Asli

Objective-CNSInteger memetakan jenis data ke int32_t pada sistem 32 bit dan ke int64_t pada sistem 64 bit. Untuk mencocokkan perilaku ini, API Terpadu baru menggantikan penggunaan int sebelumnya (yang di .NET didefinisikan sebagai selalu System.Int32) ke jenis data baru: System.nint.

Bersama dengan jenis data baru nint , API Terpadu memperkenalkan nuint jenis dan nfloat , untuk pemetaan ke NSUInteger jenis dan CGFloat juga.

Mengingat hal di atas, kita perlu meninjau API kita dan memastikan bahwa setiap instans NSInteger, NSUInteger dan CGFloat yang sebelumnya kita petakan ke int, uint dan float diperbarui ke jenis , nuint dan nfloat barunint.

Misalnya, diberikan Objective-C definisi metode dari:

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

Jika kontrak pengikatan sebelumnya memiliki definisi berikut:

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

Kami akan memperbarui pengikatan baru menjadi:

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

Jika kita memetakan ke pustaka pihak ke-3 versi yang lebih baru daripada yang awalnya ditautkan, kita perlu meninjau .h file header untuk pustaka dan melihat apakah ada panggilan keluar, eksplisit ke int, int32_t, unsigned int, uint32_t atau float telah ditingkatkan menjadi NSInteger, NSUInteger atau CGFloat. Jika demikian, modifikasi yang sama pada nint, nuint dan nfloat jenis juga perlu dilakukan pada pemetaannya.

Untuk mempelajari selengkapnya tentang perubahan jenis data ini, lihat dokumen Jenis Asli.

Memperbarui Jenis CoreGraphics

Jenis data titik, ukuran, dan persegi panjang yang digunakan dengan CoreGraphics penggunaan 32 atau 64 bit tergantung pada perangkat tempat data dijalankan. Ketika Xamarin awalnya mengikat API iOS dan Mac, kami menggunakan struktur data yang ada yang kebetulan cocok dengan jenis data di System.Drawing (RectangleF misalnya).

Karena persyaratan untuk mendukung 64 bit dan jenis data asli baru, penyesuaian berikut perlu dilakukan pada kode yang ada saat memanggil CoreGraphic metode:

  • CGRect - Gunakan CGRect alih-alih RectangleF saat menentukan wilayah persegi panjang floating point.
  • CGSize - Gunakan CGSize alih-alih SizeF saat menentukan ukuran titik mengambang (lebar dan tinggi).
  • CGPoint - Gunakan CGPoint alih-alih PointF saat menentukan lokasi titik mengambang (koordinat X dan Y).

Mengingat hal di atas, kita perlu meninjau API kita dan memastikan bahwa setiap instans , atau yang sebelumnya terikat ke RectangleF, SizeF atau PointF diubah ke jenis CGRectasli , CGSize atau CGPoint secara langsung.CGPointCGSizeCGRect

Misalnya, diberikan inisialisasi Objective-C dari:

- (id)initWithFrame:(CGRect)frame;

Jika pengikatan kami sebelumnya menyertakan kode berikut:

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

Kami akan memperbarui kode tersebut ke:

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

Dengan semua perubahan kode sekarang di tempat, kita perlu memodifikasi proyek pengikatan kita atau membuat file untuk mengikat terhadap API Terpadu.

Mengubah Proyek Pengikatan

Sebagai langkah terakhir untuk memperbarui proyek pengikatan kami untuk menggunakan API Terpadu, kita perlu memodifikasi MakeFile yang kita gunakan untuk membangun proyek atau Jenis Proyek Xamarin (jika kita mengikat dari dalam Visual Studio untuk Mac) dan menginstruksikan btouch untuk mengikat terhadap API Terpadu alih-alih yang Klasik.

Memperbarui MakeFile

Jika kita menggunakan makefile untuk membangun proyek pengikatan kita ke dalam .DLL Xamarin, kita harus menyertakan --new-style opsi baris perintah dan memanggil btouch-native alih-alih btouch.

Jadi diberikan hal-hal berikut 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

Kita perlu beralih dari panggilan btouch ke btouch-native, sehingga kita akan menyesuaikan definisi makro kita sebagai berikut:

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

Kami akan memperbarui panggilan ke btouch dan menambahkan --new-style opsi sebagai berikut:

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

Kita sekarang dapat menjalankan seperti MakeFile biasa untuk membangun API versi 64 bit baru.

Memperbarui Jenis Proyek Pengikatan

Jika kita menggunakan Templat Proyek Pengikatan Visual Studio untuk Mac untuk membangun API kita, kita harus memperbarui ke versi API Terpadu baru dari Templat Proyek Pengikatan. Cara term mudah untuk melakukan ini adalah dengan memulai Proyek Pengikatan API Terpadu baru dan menyalin semua kode dan pengaturan yang ada.

Lakukan:

  1. Mulai Visual Studio untuk Mac.

  2. Pilih File>Solusi Baru...>

  3. Di Kotak Dialog Solusi Baru, pilih iOS>Unified API>iOS Binding Project:

    Dalam Kotak Dialog Solusi Baru, pilih iOS / Unified API / iOS Binding Project

  4. Pada dialog 'Konfigurasikan proyek baru Anda' masukkan Nama untuk proyek pengikatan baru dan klik tombol OK .

  5. Sertakan pustaka versi Objective-C 64 bit yang akan Anda buat pengikatannya.

  6. Salin kode sumber dari proyek pengikatan API Klasik 32 bit yang ada (seperti ApiDefinition.cs file dan StructsAndEnums.cs ).

  7. Buat perubahan yang dicatat di atas pada file kode sumber.

Dengan semua perubahan ini, Anda dapat membangun API versi 64 bit baru seperti yang Anda lakukan pada versi 32 bit.

Ringkasan

Dalam artikel ini kami telah menunjukkan perubahan yang perlu dilakukan pada Proyek Pengikatan Xamarin yang ada untuk mendukung API Terpadu baru dan perangkat 64 bit dan langkah-langkah yang diperlukan untuk membangun API versi baru yang kompatibel dengan 64 bit.