Adım adım kılavuz: iOS Objective-C Kitaplığını Bağlama

Önemli

Şu anda Xamarin platformunda özel bağlama kullanımını inceliyoruz. Gelecekteki geliştirme çalışmalarını bilgilendirmek için lütfen bu ankete göz at.

Bu makalede, mevcut bir kitaplık olan InfColorPicker için Xamarin.iOS bağlaması oluşturma konusunda uygulamalı Objective-C bir kılavuz açıklanmıştır. Statik kitaplık derleme, bağlama ve Objective-C bağlamayı bir Xamarin.iOS uygulamasında kullanma gibi konuları kapsar.

iOS üzerinde çalışırken üçüncü taraf kitaplığını tüketmek istediğiniz durumlarla Objective-C karşılaşabilirsiniz. Böyle durumlarda, kitaplığı Xamarin.iOS uygulamalarınıza kullanmanızı sağlayacak bir C# bağlaması oluşturmak için Xamarin.iOS Bağlama Project kullanabilirsiniz.

iOS ekosistemi genel olarak kitaplıkları 3 farklı şekilde bulabilirsiniz:

  • Uzantıyı üst .a bilgileriyle (.h dosyaları) birlikte önceden derlemeli statik kitaplık dosyası olarak. Örneğin, Google Analytics Kitaplığı
  • Önceden derlemeli bir Çerçeve olarak. Bu yalnızca statik kitaplığı, üst bilgileri ve bazen uzantılı ek kaynakları içeren bir .framework klasördür. Örneğin, Google'ın AdMob Kitaplığı.
  • Yalnızca kaynak kod dosyaları olarak. Örneğin, yalnızca ve .m Objective C dosyalarını .h içeren bir kitaplık.

Birinci ve ikinci senaryoda zaten önceden derlemesi yapılan bir CocoaTouch Statik Kitaplığı vardır, bu nedenle bu makalede üçüncü senaryoya odaklanacak. Bağlama oluşturmadan önce bağlamayı bağlamanın ücretsiz olduğundan emin olmak için her zaman kitaplıkla birlikte verilen lisansı kontrol edin.

Bu makalede örnek olarak açık kaynak InfColorPicker projesini kullanarak bağlama projesi oluşturmaya ilişkin adım adım bir kılavuz sağlanmıştır, ancak bu kılavuzda yer alan tüm bilgiler herhangi bir üçüncü taraf kitaplığıyla kullanım için Objective-C uyarlanabilir. InfColorPicker kitaplığı, kullanıcının HSB gösterimine göre bir renk seçmesini sağlayan ve renk seçimini daha kolay hale sağlayan yeniden kullanılabilir bir görünüm denetleyicisi sağlar.

iOS üzerinde çalışan InfColorPicker kitaplığı örneği

Objective-CXamarin.iOS'ta bu API'yi kullanmanın tüm gerekli adımlarını açıklaacağız:

  • İlk Objective-C olarak, Xcode kullanarak statik bir kitaplık oluşturacak.
  • Ardından bu statik kitaplığı Xamarin.iOS'a bağlayabilirsiniz.
  • Ardından, Objective Sharpie'nin Xamarin.iOS bağlaması için gereken api tanımlarının bir dizisini (hepsi değil) otomatik olarak oluşturarak iş yükünü nasıl azaltabilirsiniz?
  • Son olarak bağlamayı kullanan bir Xamarin.iOS uygulaması oluşturuz.

Örnek uygulama, InfColorPicker API'si ile C# kodumuz arasındaki iletişim için güçlü bir temsilci kullanmayı gösterir. Güçlü bir temsilci kullanmayı gördükkten sonra, aynı görevleri gerçekleştirmek için zayıf temsilcileri nasıl kullanabileceğimiz üzerinde çalışabilirsiniz.

Gereksinimler

Bu makalede, Xcode ve dil hakkında biraz bilgi sahibi olduğunuz ve Objective-C belgelerimizi okuduğumuz Binding Objective-C varsaylanmıştır. Ayrıca, sunulan adımları tamamlamak için aşağıdakiler gereklidir:

  • Xcode ve iOS SDK - Apple'ın Xcode'u ve en son iOS API'sini geliştiricinin bilgisayarına yük yük olmalı ve yapılandırabilirsiniz.
  • Xcode Komut Satırı Araçları - Xcode'un şu anda yüklü olan sürümü için Xcode Komut Satırı Araçları'nın yüklü olması gerekir (yükleme ayrıntıları için aşağıya bakın).
  • Mac için Visual Studio veya Visual Studio - Mac için Visual Studio veya Visual Studio'nin en son sürümü, geliştirme bilgisayarına yük olmalı ve yapılandır yük Visual Studio yapılandırılmış olmalıdır. Xamarin.iOS uygulaması geliştirmek için Apple Mac gereklidir ve Visual Studio Xamarin.iOS derleme ana bilgisayarlarına bağlı olduğunuzdan emin olun
  • Objective Sharpie'nin en son sürümü - Objective Sharpie aracının buradan indirilen geçerli bir kopyası. Objective Sharpie zaten yüklüyse, kullanarak bunu en son sürüme güncelleştirin sharpie update

Xcode Komut Satırı Araçlarını Yükleme

Yukarıda belirtildiği gibi, bu kılavuzda Xcode Komut Satırı Araçlarını (özellikle make ve lipo ) kullaneceğiz. komutu, programın nasıl derlenmesi gerektiğini belirten bir derleme dosyası kullanarak yürütülebilir programların ve kitaplıkların derleme işlemini otomatikleştiren çok yaygın bir make Unix yardımcı make programıdır. Komut, çok mimarili dosyalar oluşturmaya yardımcı olan bir OS X komut satırı yardımcı programıdır; birden çok dosyayı tüm donanım mimarileri tarafından kullanılmaktadır lipo.a tek bir dosyada birleştirir.

Apple'ın Xcode ile Komut Satırı'dan Oluşturma hakkında SSS belgelerine göre, OS X 10.9 ve üzerinde Xcode Tercihleri iletişim kutusunun İndirmeler bölmesi artık komut satırı araçlarını indirmeyi desteklemez.

Araçları yüklemek için aşağıdaki yöntemlerden birini kullanabilirsiniz:

  • Xcode'ı yükleme - Xcode'ı yükleyebilirsiniz. Bu, tüm komut satırı araçlarınız ile birlikte gelir. OS X 10.9 dolgularında (içinde yüklü), içindeki herhangi bir aracı Xcode içindeki ilgili /usr/bin/usr/bin araçla eşler. Örneğin, xcrun komut satırdan Xcode içinde herhangi bir aracı bulmanız veya çalıştırmanız için komut.

  • Terminal Uygulaması - Terminal uygulamasından komutunu çalıştırarak komut satırı araçlarını yükleyebilirsiniz:

    • Terminal Uygulamasını başlatma.
    • Yazın xcode-select --install ve xcode-select --installbasın, örneğin:
    Europa:~ kmullins$ xcode-select --install
    
    • Komut satırı araçlarını yüklemeniz, Yükle düğmesine tıklamanız istensin: Komut satırı araçlarını yükleme

    • Araçlar Apple'ın sunucularından indirilir ve yüklenir: Araçları indirme

  • Apple Geliştiricileri için İndirmeler - Komut Satırı Araçları paketi, Apple Geliştiricileri için İndirmeler web sayfasında mevcuttur. Apple Kimliğiniz ile oturum açma, ardından Komut Satırı Araçları: Komut Satırı Araçlarını Bulma araması yapın ve indirin

Komut Satırı Araçları yüklü olduğunda, izlenecek yol ile devam etmeye hazırız.

Kılavuz

Bu kılavuzda aşağıdaki adımları anlatacağız:

  • Statik Kitaplık Oluşturma - Bu adım InfColorPicker kodunun statik kitaplığını oluşturmayı içerir. Statik kitaplık dosya .a uzantısına sahip olur ve kitaplık projesinin .NET derlemesine katıştırır.
  • Xamarin.iOS Bağlama Project oluşturma - Statik bir kitaplığımız olduktan sonra bunu kullanarak bir Xamarin.iOS bağlama projesi oluşturabilirsiniz. Bağlama projesi, az önce oluşturduğumuz statik kitaplıktan ve API'nin nasıl kullanıLl olduğunu açıklayan C# kodu şeklinde Objective-C meta verilerden oluşur. Bu meta veriler genellikle API tanımları olarak adlandırılır. OBJECTIVE Sharpie'yi kullanarak API tanımlarını oluşturmamıza yardımcı oluruz.
  • API Tanımlarını Normalleştirme - Objective Sharpie bize yardımcı olmak için harika bir iş yapar ancak her şeyi yapamayr. Kullanılamadan önce API tanımlarında yapmamız gereken bazı değişiklikleri ele aacağız.
  • Bağlama Kitaplığı'nın kullanımı - Son olarak, yeni oluşturulan bağlama projemizi nasıl kullanabileceğimizi göstermek için bir Xamarin.iOS uygulaması oluşturuz.

Hangi adımların söz konusu olduğunu anlıyoruz, şimdi de izlenecek yol boyunca devam edin.

Statik kitaplık oluşturma

Github'da InfColorPicker kodunu inceleriz:

Github'da InfColorPicker kodunu inceleme

Projede aşağıdaki üç dizin olduğunu görebiliriz:

  • InfColorPicker - Bu dizin proje kodunu içerir.
  • PickerSamplePad - Bu dizin, örnek bir iPad içerir.
  • PickerSamplePhone - Bu dizin, örnek bir iPhone içerir.

Şimdi InfColorPicker projesini GitHub dizininde açın. Proje için Xcode hedefini PickerSamplePhone açmak için Xcode Gezgini'ne aşağıdaki proje yapısını görüyoruz:

Xcode Gezgini'nin proje yapısı

Bu proje, her örnek projeye InfColorPicker kaynak kodunu (kırmızı kutuda) doğrudan ekleyerek kodun yeniden kullanılmasına yardımcı olur. Örnek projenin kodu mavi kutunun içindedir. Bu proje bize statik bir kitaplık sağlamay olduğundan, statik kitaplığı derlemek için bir Xcode projesi oluşturmamız gerekir.

İlk adım, Statik Kitaplığına InfoColorPicker kaynak kodunu eklememizdir. Bunu başarmak için aşağıdaki adımları gerçekleştirin:

  1. Xcode'ı başlatma.

  2. Dosya menüsünden Yenidosya...Project:

    Dosya menüsünün Project menüsünden seçilen ekran görüntüsü.

  3. Çerçeve Kitaplığı'yıseçin, Cocoa Touch Statik Kitaplığı şablonunu seçin ve Ardından düğmesine tıklayın:

    Cocoa Touch Statik Kitaplığı şablonunu seçin

  4. Ad InfColorPicker alanına Project InfColorPicker Ardından düğmesine tıklayın:

    Ad alanına InfColorPicker Project girin

  5. Projeyi kaydetmek için bir konum seçin ve Tamam düğmesine tıklayın.

  6. Şimdi InfColorPicker projesinden statik kitaplık projemize kaynağı eklememiz gerekiyor. InfColorPicker.h dosyası statik kitaplığımızda zaten mevcut olduğundan (varsayılan olarak), Xcode üzerine yazmamıza izin vermez. Bulıcı'dan,GitHub'den sıkıştırmasını açmak için özgün projede InfColorPicker kaynak koduna gidin, tüm InfColorPicker dosyalarını kopyalayın ve bunları yeni statik kitaplık projemize yapıştırın:

    Tüm InfColorPicker dosyalarını kopyalama

  7. Xcode'a geri dönüp InfColorPicker klasörüne sağ tıklayın ve "InfColorPicker..." klasörüne dosya ekle'yi seçin:

    Dosya ekleme

  8. Dosya Ekle iletişim kutusunda, az önce kopyalamış olduğu InfColorPicker kaynak kod dosyalarına gidin, hepsini seçin ve Ekle düğmesine tıklayın:

    Hepsini seçin ve Ekle düğmesine tıklayın

  9. Kaynak kod projemize kopyalanır:

    Kaynak kod projeye kopyalanır

  10. Xcode Project Navigator'dan InfColorPicker.m dosyasını seçin ve son iki satırı açıklama satırı olarak girin (bu kitaplığın yazıldığı yol nedeniyle bu dosya kullanılmaz):

    InfColorPicker.m dosyasını düzenleme

  11. Şimdi kitaplık için gerekli herhangi bir Çerçeve olup oImay olup oImayrı denetlememiz gerekiyor. Bu bilgileri README'de veya sağlanan örnek projelerden birini açarak bulabilirsiniz. Bu örnekte Foundation.framework , UIKit.framework ve CoreGraphics.framework kullanır, bu nedenle bunları ekleriz.

  12. InfColorPicker hedef Derleme Aşamalarını seçin ve İkiliyi Kitaplıklarla Bağlama bölümünü genişletin:

    İkiliYi Kitaplıklarla Bağlama bölümünü genişletin

  13. Yukarıda listelenen + gerekli çerçeve çerçevelerini eklemenize olanak sağlayan iletişim kutusunu açmak için düğmesini kullanın:

    Yukarıda listelenen gerekli çerçeve çerçevelerini ekleyin

  14. İkiliYi Kitaplıklarla Bağlama bölümü artık aşağıdaki görüntüye benzer şekilde görüntülenmiştir:

    İkiliYi Kitaplıklarla Bağlama bölümü

Bu noktada yaklaştık ancak henüz tamamladık. Statik kitaplık oluşturuldu, ancak hem iOS cihazı hem de iOS simülatörü için gerekli tüm mimarileri içeren Bir Fat ikilisi oluşturmak için derlememiz gerekiyor.

Büyük İkili Dosya Oluşturma

Tüm iOS cihazları zaman içinde geliştirilmiş ARM mimarisiyle desteklenen işlemcilere sahiptir. Her yeni mimari geriye dönük uyumluluğu korurken yeni yönergeler ve diğer geliştirmeler ekledi. iOS cihazları armv6, armv7, armv7s, arm64 yönerge kümelerini içerir; ancak armv6 daha fazla kullanmaz. iOS simülatörü ARM tarafından desteklanmaz ve bunun yerine bir x86 ve x86_64 simülatördür. Bu, kitaplıkların her yönerge kümesi için sağlanmalıdır.

Fat kitaplığı, .a desteklenen tüm mimarileri içeren bir dosyadır.

Büyük bir ikili dosya oluşturmak üç adımlı bir işlemdir:

  • Statik kitaplığın ARM 7 & ARM64 sürümünü derle.
  • Statik kitaplığın bir x86 x84_64 sürümünü derle.
  • İki lipo statik kitaplığı tek bir kitaplıkta birleştirmek için komut satırı aracını kullanın.

Bu üç adım oldukça basitse de, kitaplık güncelleştirmeleri aldığında veya hata düzeltmesi gerekirse bunları gelecekte Objective-C tekrarlamak gerekebilir. Bu adımları otomatikleştirmeye karar veriyorsanız, iOS bağlama projesinin gelecekteki bakım ve desteğini basitleştirir.

Bu tür görevleri otomatikleştirmek için kullanılabilen birçok araç vardır: kabuk betiği, rake,xbuildve make. Xcode Komut Satırı araçları yüklenirken, bu kılavuz için kullanılacak derleme sistemi make de yüklenir. Bir iOS cihazında ve herhangi bir kitaplığın simülatöründe çalışacak çok mimarili bir paylaşılan kitaplık oluşturmak için kullanabileceğiniz bir Makefile şu şekildedir:

XBUILD=/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
PROJECT_ROOT=./YOUR-PROJECT-NAME
PROJECT=$(PROJECT_ROOT)/YOUR-PROJECT-NAME.xcodeproj
TARGET=YOUR-PROJECT-NAME

all: lib$(TARGET).a

lib$(TARGET)-i386.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphonesimulator -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphonesimulator/lib$(TARGET).a $@

lib$(TARGET)-armv7.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch armv7 -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

lib$(TARGET)-arm64.a:
	$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch arm64 -configuration Release clean build
	-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

lib$(TARGET).a: lib$(TARGET)-i386.a lib$(TARGET)-armv7.a lib$(TARGET)-arm64.a
	xcrun -sdk iphoneos lipo -create -output $@ $^

clean:
	-rm -f *.a *.dll

Seçtiğiniz düz metin düzenleyicisine Makefile komutlarını girin ve bölümleri projenizin adıyla YOUR-PROJECT-NAME ile güncelleştirin. Yönergelerin tam olarak yukarıdaki yönergelerin içinde sekmeler korunarak yapıştırıldıklarının doğru olduğundan emin olmak da önemlidir.

Makefile adıyla dosyayı, yukarıda oluşturduğumız InfColorPicker Xcode Statik Kitaplığı ile aynı konuma kaydedin:

Dosyayı Makefile adıyla kaydedin

Mac'iniz üzerinde Terminal Uygulamasını açın ve Makefile dosyanıza gidin. makeTerminale yazın, make tuşuna basın; Makefile yürütülür:

Örnek dosya dosyası çıktısı

Make'i çalıştırarak çok fazla metin kaydırması olduğunu görüyorsunuz. Her şey doğru şekilde çalıştıysa BUILD SUCCEEDED ve ve dosyalarının Derleme dosyasıyla aynı konuma libInfColorPicker-i386.alibInfColorPickerSDK.alibInfColorPicker-i386.a

Makefile tarafından oluşturulan libInfColorPicker-armv7.a, libInfColorPicker-i386.a ve libInfColorPickerSDK.a dosyaları

Aşağıdaki komutu kullanarak Fat ikili dosyanız içindeki mimarileri onaylayın:

xcrun -sdk iphoneos lipo -info libInfColorPicker.a

Bu, aşağıdakini görüntülemeli:

Architectures in the fat file: libInfColorPicker.a are: i386 armv7 x86_64 arm64

Bu noktada, Xcode ve Xcode Komut Satırı araçlarını ve kullanarak statik bir kitaplık oluşturarak iOS bağlamamızın ilk adımını makelipo tamamladık. Şimdi bir sonraki adıma geç ve Objective-Sharpie'yi kullanarak BIZIM için API bağlamaları oluşturma işlemini otomatikleştirin.

Xamarin.iOS Bağlama Project

Bağlama işlemini otomatikleştirmek için Objective-Sharpie'yi kullanamadan önce API Tanımlarını (oluşturmamıza yardımcı olması için Objective-Sharpie'yi kullanacağız) ve bizim için C# bağlamasını oluşturmak üzere bir Xamarin.iOS Bağlama Project oluşturmamız gerekir.

Şimdi şunları gerçekleştirin:

  1. Başlangıç Mac için Visual Studio.

  2. Dosya menüsünden Yeni Çözüm... öğesini seçin:

    Yeni çözüm başlatma

  3. Yeni Çözüm iletişim kutusunda Kitaplık iOS Bağlaması'Project:

    iOS Bağlama Bağlayıcısı'Project

  4. Sonraki düğmesine tıklayın.

  5. Ad alanına "InfColorPickerBinding" Project çözümü oluşturmak için Oluştur düğmesine tıklayın:

    Ad alanına InfColorPickerBinding Project girin

Çözüm oluşturulur ve iki varsayılan dosya dahil edilir:

Çözüm Gezgini'daki çözüm yapısı

  • ApiDefinition.cs - Bu dosya, API'lerinin C# ile sarmalamasını tanımlayan anlaşmaları içerir.
  • Structs.cs - Bu dosya arabirimler ve temsilciler için gerekli olan tüm yapıları veya numaralama değerlerini tutar.

Bu iki dosyayla daha sonra izlenecek yolda üzerinde çalışacağız. İlk olarak, bağlama projesine InfColorPicker kitaplığını eklememiz gerekir.

Bağlama Kitaplığını Bağlama Kitaplığına Project

Artık temel Bağlama Project hazır, InfColorPicker kitaplığı için yukarıda oluşturduğumuz Fat Binary kitaplığını eklememiz gerekiyor.

Kitaplığı eklemek için şu adımları izleyin:

  1. Yerel Başvurular klasörüne sağ tıklayın ve Çözüm Bölmesi Ekle'yi seçin:

    Yerel Başvurular Ekleme

  2. Daha önce ( ) düzenlediğimiz Fat Binary'a libInfColorPickerSDK.a gidin ve Aç libInfColorPickerSDK.a basın:

    libInfColorPickerSDK.a dosyasını seçin

  3. Dosya projeye dahil edilir:

    Dosya dahil

.a dosyası projeye eklenmiştir, Xamarin.iOS dosyanın Derleme Eylemi'ni otomatik olarak ObjcBindingNativeLibraryolarak ayarlar ve adlı özel bir dosya oluşturulur.

Bu dosya, LinkWith Xamarin.iOS'a yeni ekleydmiz statik kitaplığı nasıl işley olduğunu söyleyen özniteliğini içerir. Bu dosyanın içeriği aşağıdaki kod parçacığında gösterilmiştir:

using ObjCRuntime;

[assembly: LinkWith ("libInfColorPickerSDK.a", SmartLink = true, ForceLoad = true)]

özniteliği, LinkWith proje için statik kitaplığı ve bazı önemli bağlantı bayraklarını tanımlar.

Bir sonraki adım InfColorPicker projesi için API tanımları oluşturmaktır. Bu kılavuzda, Objective Sharpie kullanarak ApiDefinition.cs dosyasını oluştureceğiz.

Objective Sharpie kullanma

Objective Sharpie, üçüncü taraf kitaplığını C# ile bağlamak için gereken tanımların oluşturulmasına yardımcı olan bir komut satırı aracıdır (Xamarin tarafından Objective-C sağlanır). Bu bölümde, InfColorPicker projesi için ilk ApiDefinition.cs dosyasını oluşturmak üzere Objective Sharpie'yi kullan istiyoruz.

Çalışmaya başlamanız için, bu kılavuzda ayrıntılı olarak yer alan Objective Sharpie yükleyici dosyasını indirebilirsiniz. Yükleyiciyi çalıştırın ve yükleme sihirbazından ekrandaki tüm istemleri takip edin ve Objective Sharpie'yi geliştirme bilgisayarımıza yükleyin.

Objective Sharpie başarıyla yüklendikten sonra Terminal uygulamasını başlatarak bağlama konusunda yardımcı olması için sağladığı tüm araçlarla ilgili yardım almak için aşağıdaki komutu girebilirsiniz:

sharpie -help

Yukarıdaki komutu yürütürse aşağıdaki çıkış oluşturulur:

Europa:Resources kmullins$ sharpie -help
usage: sharpie [OPTIONS] TOOL [TOOL_OPTIONS]

Options:
  -h, --helpShow detailed help
  -v, --versionShow version information

Available Tools:
  xcode              Get information about Xcode installations and available SDKs.
  pod                Create a Xamarin C# binding to Objective-C CocoaPods
  bind               Create a Xamarin C# binding to Objective-C APIs
  update             Update to the latest release of Objective Sharpie
  verify-docs        Show cross reference documentation for [Verify] attributes
  docs               Open the Objective Sharpie online documentation

Bu kılavuzda aşağıdaki Objective Sharpie araçlarını kullaneceğiz:

  • xcode - Bu araçlar, geçerli Xcode yüklememiz ve yüklü iOS ve Mac API'lerinin sürümleri hakkında bilgi verir. Bu bilgileri daha sonra bağlamalarımızı oluşturulurken kullanacağız.
  • bind - InfColorPicker projesinde .h dosyalarını ilk ApiDefinition.cs ve StructsAndEnums.cs dosyalarına ayrıştırmak için bu aracı kullanacağını.

Belirli bir Objective Sharpie aracıyla ilgili yardım almak için aracın adını ve seçeneğini -help girin. Örneğin, sharpie xcode -help aşağıdaki çıkışı döndürür:

Europa:Resources kmullins$ sharpie xcode -help
usage: sharpie xcode [OPTIONS]+

Options:
  -h, -help           Show detailed help
  -v, -verbose        Be verbose with output

Xcode Options:
  -sdks               List all available Xcode SDKs. Pass -verbose for more
                        details.
  -sdkpath SDK        Output the path of the SDK
  -frameworks SDK     List all available framework directories in a given SDK.

Bağlama işlemini başlatamadan önce Terminale aşağıdaki komutu girerek geçerli yüklü OLAN SDK'lar hakkında bilgi alamamız sharpie xcode -sdks gerekir:

amyb:Desktop amyb$ sharpie xcode -sdks
sdk: appletvos9.2    arch: arm64
sdk: iphoneos9.3     arch: arm64   armv7
sdk: macosx10.11     arch: x86_64  i386
sdk: watchos2.2      arch: armv7

Yukarıdan, SDK'nın makinemizde iphoneos9.3 yüklü olduğunu görebiliriz. Bu bilgiler hazır olduğunda InfColorPicker proje dosyalarını ilk .h.h ve InfColorPicker projesi için ayrıştırmaya StructsAndEnums.cs hazırız.

Terminal uygulamasına aşağıdaki komutu girin:

sharpie bind --output=InfColorPicker --namespace=InfColorPicker --sdk=[iphone-os] -scope [full-path-to-project]/InfColorPicker/InfColorPicker [full-path-to-project]/InfColorPicker/InfColorPicker/*.h

Burada, InfColorPicker Xcode proje dosyasının bilgisayarınızda bulunduğu dizinin tam yoludur ve [iphone-os], komutuyla da not edince yüklemiş olduğu [full-path-to-project] iOS [full-path-to-project] SDK'dır. sharpie xcode -sdks Bu örnekte, bu dizindeki tüm üst bilgi dosyalarını içeren bir parametre olarak *.h'yi geçirteceğimize dikkat edin. Normalde bunu YAPMAMANIZ gerekir, ancak bunun yerine diğer tüm ilgili dosyalara başvurulan üst düzey .h dosyasını bulmak için üst bilgi dosyalarını dikkatle okumanız ve bunu Objective Sharpie'ye göndermeniz gerekir.

İpucu

bağımsız -scope değişkeni için bağlamak istediğiniz üst bilgileri içeren klasörü iletin. bağımsız değişkeni olmadan Objective Sharpie, örneğin, içe aktarılan tüm iOS SDK üst bilgileri için bağlamalar oluşturmayı dener ve bu da bağlama projesini derleme sırasında büyük olasılıkla hatalar oluşturacak çok büyük bir tanım -scope#import <UIKit.h> dosyasıyla sonuçlanır. Bağımsız -scope değişken kümesiyle Objective Sharpie, kapsamlı klasörün dışındaki üst bilgiler için bağlama oluşturmaz.

Terminalde aşağıdaki çıkış oluşturulur:

Europa:Resources kmullins$ sharpie bind -output InfColorPicker -namespace InfColorPicker -sdk iphoneos8.1 /Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPicker.h -unified
Compiler configuration:
    -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -miphoneos-version-min=8.1 -resource-dir /Library/Frameworks/ObjectiveSharpie.framework/Versions/1.1.1/clang-resources -arch armv7 -ObjC

[  0%] parsing /Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPicker.h
In file included from /Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPicker.h:60:
/Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPickerController.h:28:1: warning: no 'assign',
      'retain', or 'copy' attribute is specified - 'assign' is assumed [-Wobjc-property-no-attribute]
@property (nonatomic) UIColor* sourceColor;
^
/Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPickerController.h:28:1: warning: default property
      attribute 'assign' not appropriate for non-GC object [-Wobjc-property-no-attribute]
/Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPickerController.h:29:1: warning: no 'assign',
      'retain', or 'copy' attribute is specified - 'assign' is assumed [-Wobjc-property-no-attribute]
@property (nonatomic) UIColor* resultColor;
^
/Users/kmullins/Projects/InfColorPicker/InfColorPicker/InfColorPickerController.h:29:1: warning: default property
      attribute 'assign' not appropriate for non-GC object [-Wobjc-property-no-attribute]
4 warnings generated.
[100%] parsing complete
[bind] InfColorPicker.cs
Europa:Resources kmullins$

Ayrıca, Dizinimizde InfColorPicker.enums.cs ve InfColorPicker.cs dosyaları oluşturulur:

InfColorPicker.enums.cs ve InfColorPicker.cs dosyaları

Yukarıda oluşturduğum Bağlama projesinde bu dosyaların ikisini de açın. InfColorPicker.cs dosyasının içeriğini kopyalayıp ApiDefinition.cs dosyasına yapıştırın ve mevcut kod bloğu yerine InfColorPicker.cs dosyasının içeriğini yazın (deyimleri olduğu gibi bırakarak):

InfColorPickerControllerDelegate dosyası

API Tanımlarını Normalleştirme

Objective Sharpie bazen çeviriyle ilgili bir soruna sahiptir, bu nedenle arabirimin tanımını değiştirmemiz ve DelegatesInfColorPickerControllerDelegate satırı [Protocol, Model] aşağıdakiyle değiştirmemiz gerekir:

[BaseType(typeof(NSObject))]
[Model]

Böylece tanım şu şekildedir:

Tanım

Ardından, aynı şeyi dosyanın içeriğiyle de yapacağız, bunları kopyalayıp deyimleri olduğu gibi InfColorPicker.enums.csStructsAndEnums.csusing bırakarak dosyaya yapıştıracağız:

StructsAndEnums.cs dosyasının içeriği

Objective Sharpie'nin bağlamaya özniteliklerle açıklama ek açıklamalarının olduğunu [Verify] da bulabilirsiniz. Bu öznitelikler, Bağlamayı özgün C/ bildirimiyle karşılaştırarak Objective Sharpie'nin doğru şeyi yaptığını doğrulamanız gerektiğini belirtmektedir (bu, sınır bildiriminin üzerindeki bir Objective-C açıklamada sağlanacaktır). Bağlamaları doğruladıktan sonra verify özniteliğini kaldırmanız gerekir. Daha fazla bilgi için Doğrulama kılavuzuna bakın.

Bu noktada, bağlama projemiz tamamlanır ve derlemeye hazır olur. Şimdi bağlama projemizi derlememize ve hatayla karşılaşmamamızı sağlar:

Bağlama projesini derleme ve hata olmadığını denetleyin

Bağlamayı Kullanma

Yukarıda oluşturulan iOS Bağlama Kitaplığı'iPhone örnek bir uygulama oluşturmak için şu adımları izleyin:

  1. Xamarin.iOS Project oluşturma - Aşağıdaki ekran görüntülerde gösterildiği gibi çözüme InfColorPickerSample adlı yeni bir Xamarin.iOS projesi ekleyin:

    Tek Görünüm Uygulaması Ekleme

    Tanımlayıcıyı Ayarlama

  2. Bağlama Projesine Başvuru Project - InfColorPickerSample projesini, InfColorPickerBinding projesine başvuru olacak şekilde güncelleştirin:

    Bağlama Kılavuzuna Başvuru Project

  3. Uygulama iPhone Kullanıcı Arabirimi - iOS Tasarımcısı'nda düzenlemek için InfColorPickerSample projesinde MainStoryboard.storyboard dosyasına çift tıklayın. Görünüme bir Düğme ekleyin ve aşağıda gösterildiği gibi olarak olarak çağırabilirsiniz:

    Görünüme Düğme Ekleme

  4. InfColorPickerView.xib ekleme - InfColorPicker kitaplığı bir .xib dosyası içerir. Xamarin.iOS, bağlama projesine bu .xib'i dahilmayacak ve bu da örnek uygulamamızda çalışma zamanı hatalarına neden olacak. Bunun geçici çözümü, .xib dosyasını Xamarin.iOS projemize eklemektir. Xamarin.iOS projesini seçin, sağ tıklayın ve Dosya Ekle'yi seçin ve aşağıdaki ekran görüntüsünde gösterildiği gibi .xib dosyasını ekleyin:

    InfColorPickerView.xib dosyasını ekleme

  5. Sorularak .xib dosyasını projeye kopyalayın.

Şimdi'de Protokoller'e ve bağlama ve C# kodunda bunları nasıl Objective-C işleyeceğimize hızlıca göz atacağız.

Protokoller ve Xamarin.iOS

'de Objective-C bir protokol, belirli durumlarda kullanılan yöntemleri (veya iletileri) tanımlar. Kavramsal olarak, bunlar C# arabirimleri ile oldukça benzerdir. Bir protokol ile C# arabirimi arasındaki önemli bir fark, protokollerin isteğe bağlı yöntemleri (bir sınıfın uygulaması gerek olmayan yöntemler) Objective-C olabilir. Objective-C , @optional hangi yöntemlerin isteğe bağlı olduğunu belirtmek için kullanılır. Protokoller hakkında daha fazla bilgi için bkz. Olaylar, Protokoller ve Temsilciler.

InfColorPickerController aşağıdaki kod parçacığında gösterilen böyle bir protokole sahip:

@protocol InfColorPickerControllerDelegate

@optional

- (void) colorPickerControllerDidFinish: (InfColorPickerController*) controller;
// This is only called when the color picker is presented modally.

- (void) colorPickerControllerDidChangeColor: (InfColorPickerController*) controller;

@end

Bu protokol, InfColorPickerController tarafından istemcilere kullanıcının yeni bir renk seçtiğini ve InfColorPickerController'ın tamam olduğunu bildirmek için kullanılır. Objective Sharpie, aşağıdaki kod parçacığında gösterildiği gibi bu protokolü eşledi:

[BaseType(typeof(NSObject))]
[Model]
public partial interface InfColorPickerControllerDelegate {

    [Export ("colorPickerControllerDidFinish:")]
    void ColorPickerControllerDidFinish (InfColorPickerController controller);

    [Export ("colorPickerControllerDidChangeColor:")]
    void ColorPickerControllerDidChangeColor (InfColorPickerController controller);
}

Bağlama kitaplığı derlenmiş olduğunda, Xamarin.iOS sanal yöntemlerle bu arabirimi uygulayan adlı soyut bir InfColorPickerControllerDelegate temel sınıf oluşturacak.

Bu arabirimi bir Xamarin.iOS uygulamasında uygulamak için iki yol vardır:

  • Güçlü Temsilci - Güçlü bir temsilci kullanmak, uygun yöntemleri alt sınıfa alan ve geçersiz k kullanılan bir C# sınıfı oluşturmayı içerir. InfColorPickerController, istemcileri ile iletişim kurmak için bu sınıfın bir örneğini kullanır.
  • Zayıf Temsilci - Zayıf bir temsilci, bir sınıfta genel yöntem oluşturmayı (örneğin ) ve ardından bu yöntemi bir öznitelik aracılığıyla protokole ifşayı içeren biraz farklı bir InfColorPickerDelegateExport tekniktir.

Güçlü temsilciler Intellisense, tür güvenliği ve daha iyi kapsülleme sağlar. Bu nedenlerden dolayı zayıf bir temsilci yerine güçlü temsilciler kullanabiliyor olur.

Bu kılavuzda her iki tekniği de ele aacağız: önce güçlü bir temsilci uygulama ve ardından zayıf bir temsilcinin nasıl uygulandığını açıklayacak.

Güçlü Temsilci Uygulama

Iletiyi yanıtlamak için güçlü bir temsilci kullanarak Xamarin.iOS uygulamasını colorPickerControllerDidFinish: bitirin:

InfColorPickerControllerDelegate Alt Sınıfı - adlı projeye yeni bir sınıf ekleyin. Sınıfını aşağıdaki koda sahip olacak şekilde düzenleyin:

using InfColorPickerBinding;
using UIKit;

namespace InfColorPickerSample
{
  public class ColorSelectedDelegate:InfColorPickerControllerDelegate
  {
    readonly UIViewController parent;

    public ColorSelectedDelegate (UIViewController parent)
    {
      this.parent = parent;
    }

    public override void ColorPickerControllerDidFinish (InfColorPickerController controller)
    {
      parent.View.BackgroundColor = controller.ResultColor;
      parent.DismissViewController (false, null);
    }
  }
}

Xamarin.iOS adlı soyut Objective-C bir temel sınıf oluşturarak temsilciyi InfColorPickerControllerDelegate bağlar. Bu türü alt sınıfa yazın ColorPickerControllerDidFinish ve özelliğinin değerine erişmek için ResultColor yöntemini geçersiz InfColorPickerController kılın.

ColorSelectedDelegate örneği oluşturma - Olay işleyicimiz, önceki adımda oluşturduğumuz türün bir örneğine ihtiyaç gösterir. sınıfını InfColorPickerSampleViewController düzenleyin ve sınıfına aşağıdaki örnek değişkenlerini ekleyin:

ColorSelectedDelegate selector;

ColorSelectedDelegate değişkenlerini başlatma - Geçerli bir örnek olduğundan emin olmak için, içinde yöntemini aşağıdaki kod ViewDidLoadViewController parçacığıyla eşecek şekilde güncelleştirin:

public override void ViewDidLoad ()
{
  base.ViewDidLoad ();
  ChangeColorButton.TouchUpInside += HandleTouchUpInsideWithStrongDelegate;
  selector = new ColorSelectedDelegate (this);
}

HandleTouchUpInsideWithStrongDelegate - Sonraki adım, kullanıcı ColorChangeButton'adokunduğunda için olay işleyicisini uygulama. ViewControllerdüzenleyin ve aşağıdaki yöntemi ekleyin:

using InfColorPicker;
...

private void HandleTouchUpInsideWithStrongDelegate (object sender, EventArgs e)
{
    InfColorPickerController picker = InfColorPickerController.ColorPickerViewController();
    picker.Delegate = selector;
    picker.PresentModallyOverViewController (this);
}

İlk olarak statik bir yöntem aracılığıyla örneği elde edilir ve bu örneği özelliği aracılığıyla güçlü InfColorPickerController temsilcimizin farkında InfColorPickerController.Delegate oluruz. Bu özellik Objective Sharpie tarafından bizim için otomatik olarak oluşturulmuş. Son olarak, PresentModallyOverViewController kullanıcının bir renk InfColorPickerSampleViewController.xib seçerek görünümünü göstermek için çağrısında bulunduk.

Uygulamayı Çalıştırma - Bu noktada kodumuzla ilgili tüm çalışmalarımız bitti. Uygulamayı çalıştırdıysanız, aşağıdaki ekran görüntülerde gösterildiği gibi arka InfColorColorPickerSampleView plan rengini değiştirebilirsiniz:

Uygulamayı Çalıştırma

Tebrikler! Bu noktada, Xamarin.iOS uygulamasında kullanmak üzere bir kitaplığı Objective-C başarıyla oluşturduk ve bağlandınız. Şimdi zayıf temsilcileri kullanmayı öğren bakalım.

Zayıf Temsilci Uygulama

Xamarin.iOS, belirli bir temsilci için protokole bağlı bir sınıfı alt sınıfa eklemek yerine, 'den türetilen herhangi bir sınıfta protokol yöntemlerini uygulamanıza, yöntemlerinizi ile dekore alamanıza ve ardından uygun seçicileri Objective-CNSObjectExportAttribute sağlar. Bu yaklaşımı benimserken, sınıfınıza ait bir örneğini özelliği WeakDelegate yerine özelliğine Delegate atarsiniz. Zayıf bir temsilci size temsilci sınıfını farklı bir devralma hiyerarşisinde aşağı alma esnekliği sunar. Şimdi Xamarin.iOS uygulamamızda zayıf bir temsilci uygulamayı ve kullanmayı göreceğiz.

TouchUpInside için Olay İşleyicisi Oluşturma - Arka Plan Rengini Değiştir düğmesinin olayı için yeni bir olay işleyicisi oluşturabilirsiniz. Bu işleyici, önceki bölümde oluşturduğumız işleyiciyle aynı rolü doldurur, ancak güçlü bir temsilci yerine HandleTouchUpInsideWithStrongDelegate zayıf bir temsilci kullanır. sınıfını ViewController düzenleyin ve aşağıdaki yöntemi ekleyin:

private void HandleTouchUpInsideWithWeakDelegate (object sender, EventArgs e)
{
    InfColorPickerController picker = InfColorPickerController.ColorPickerViewController();
    picker.WeakDelegate = this;
    picker.SourceColor = this.View.BackgroundColor;
    picker.PresentModallyOverViewController (this);
}

ViewDidLoad Güncelleştirildi - Yeni oluşturduğum olay işleyicisini kullanması için değiştirmemiz gerekir. Aşağıdaki ViewController kod ViewDidLoad parçacığına benzer şekilde düzenleyin ve düzenleyin:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    ChangeColorButton.TouchUpInside += HandleTouchUpInsideWithWeakDelegate;
}

colorPickerControllerDidFinish: İleti - tamamlandığında iOS iletiyi 'ye colorPickerControllerDidFinish:WeakDelegate gönderir. Bu iletiyi iş bindiren bir C# yöntemi oluşturmamız gerekiyor. Bunu yapmak için bir C# yöntemi oluşturduk ve ardından ile ExportAttribute donatarak. ViewController'yi düzenleyin ve sınıfına aşağıdaki yöntemi ekleyin:

[Export("colorPickerControllerDidFinish:")]
public void ColorPickerControllerDidFinish (InfColorPickerController controller)
{
    View.BackgroundColor = controller.ResultColor;
    DismissViewController (false, null);
}

Uygulamayı çalıştırın. Şimdi tam olarak daha önce olduğu gibi davranması gerekir, ancak güçlü temsilci yerine zayıf bir temsilci kullanıyor. Bu noktada bu izlenecek yolu başarıyla tamamladık. Artık Xamarin.iOS bağlama projesi oluşturma ve tüketme hakkında bilginiz olması gerekir.

Özet

Bu makalede, Xamarin.iOS bağlama projesi oluşturma ve kullanma işlemi boyunca yol boyunca yol aldı. İlk olarak var olan bir kitaplığı statik bir Objective-C kitaplıkta derlemeyi ele atık. Ardından bir Xamarin.iOS bağlama projesi oluşturma ve objective Sharpie kullanarak kitaplığın API tanımlarını oluşturma hakkında bilgi Objective-C edindik. Oluşturulan API tanımlarını genel tüketime uygun hale etmek için güncelleştirme ve ayarlamayı tartıştık. Xamarin.iOS bağlama projesi tamam olduktan sonra, güçlü temsilciler ve zayıf temsilciler kullanmaya odaklanarak bu bağlamayı bir Xamarin.iOS uygulamasında kullanmaya devam etmiştik.