Sdílet prostřednictvím


Advanced (manual) Real-World Example

Tento příklad používá knihovnu POP z Facebooku.

Tato část popisuje pokročilejší přístup k vazbě, kde použijeme nástroj Společnosti Apple xcodebuild k prvnímu sestavení projektu POP a následné ruční odstranění vstupu pro Objective Sharpie. To v podstatě popisuje, co Objective Sharpie dělá pod kapotou v předchozí části.

 $ git clone https://github.com/facebook/pop.git
Cloning into 'pop'...
   _(more git clone output)_

$ cd pop

Vzhledem k tomu, že knihovna POP má projekt Xcode (pop.xcodeproj), můžeme použít pouze xcodebuild k sestavení protokolu POP. Tento proces může zase generovat soubory hlaviček, které Objective Sharpie může potřebovat parsovat. Proto je vytváření před vazbou důležité. Při sestavování prostřednictvím xcodebuild zajištění, že předáte stejný identifikátor sady SDK a architekturu, kterou máte v úmyslu předat Objective Sharpie (a pamatujte si, že Objective Sharpie 3.0 to obvykle udělá za vás!):

$ xcodebuild -sdk iphoneos9.0 -arch arm64

Build settings from command line:
    ARCHS = arm64
    SDKROOT = iphoneos8.1

=== BUILD TARGET pop OF PROJECT pop WITH THE DEFAULT CONFIGURATION (Release) ===

...

CpHeader pop/POPAnimationTracer.h build/Headers/POP/POPAnimationTracer.h
    cd /Users/aaron/src/sharpie/pop
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Users/aaron/bin::/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/Users/aaron/.rvm/bin"
    builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -strip-debug-symbols -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip -resolve-src-symlinks /Users/aaron/src/sharpie/pop/pop/POPAnimationTracer.h /Users/aaron/src/sharpie/pop/build/Headers/POP

...

** BUILD SUCCEEDED **

V konzole bude v konzole v rámci xcodebuildkonzoly k dispozici spousta informací o sestavení. Jak je znázorněno výše, vidíme, že cíl CpHeader byl spuštěn, kde se soubory hlaviček zkopírovaly do výstupního adresáře sestavení. To je často případ a usnadňuje vazbu: v rámci sestavení nativní knihovny se soubory hlaviček často kopírují do "veřejně" využitelného umístění, které usnadňuje analýzu vazby. V tomto případě víme, že soubory hlaviček PROTOKOLU POP jsou v build/Headers adresáři.

Teď jsme připraveni svázat pop. Víme, že chceme sestavit sadu SDK iphoneos8.1 s architekturou arm64 a že hlavičkové soubory, o které se zajímáme, jsou v build/Headers rámci pokladny GITu POP. Pokud se podíváme do build/Headers adresáře, uvidíme několik souborů hlaviček:

$ ls build/Headers/POP/
POP.h                    POPAnimationTracer.h     POPDefines.h
POPAnimatableProperty.h  POPAnimator.h            POPGeometry.h
POPAnimation.h           POPAnimatorPrivate.h     POPLayerExtras.h
POPAnimationEvent.h      POPBasicAnimation.h      POPPropertyAnimation.h
POPAnimationExtras.h     POPCustomAnimation.h     POPSpringAnimation.h
POPAnimationPrivate.h    POPDecayAnimation.h

Když se podíváme POP.h, vidíme, že se jedná o hlavní soubor hlaviček nejvyšší úrovně knihovny, který #importobsahuje další soubory. Z tohoto důvodu musíme předat POP.h jen Objective Sharpie, a clang udělá zbytek na pozadí:

$ sharpie bind -output Binding -sdk iphoneos8.1 \
    -scope build/Headers build/Headers/POP/POP.h \
    -c -Ibuild/Headers -arch arm64

Parsing Native Code...

Binding...
  [write] ApiDefinitions.cs
  [write] StructsAndEnums.cs

Binding Analysis:
  Automated binding is complete, but there are a few APIs which have
  been flagged with [Verify] attributes. While the entire binding
  should be audited for best API design practices, look more closely
  at APIs with the following Verify attribute hints:

  ConstantsInterfaceAssociation (1 instance):
    There's no fool-proof way to determine with which Objective-C
    interface an extern variable declaration may be associated.
    Instances of these are bound as [Field] properties in a partial
    interface into a near-by concrete interface to produce a more
    intuitive API, possibly eliminating the 'Constants' interface
    altogether.

  StronglyTypedNSArray (4 instances):
    A native NSArray* was bound as NSObject[]. It might be possible
    to more strongly type the array in the binding based on
    expectations set through API documentation (e.g. comments in the
    header file) or by examining the array contents through testing.
    For example, an NSArray* containing only NSNumber* instances can
    be bound as NSNumber[] instead of NSObject[].

  MethodToProperty (2 instances):
    An Objective-C method was bound as a C# property due to
    convention such as taking no parameters and returning a value (
    non-void return). Often methods like these should be bound as
    properties to surface a nicer API, but sometimes false-positives
    can occur and the binding should actually be a method.

  Once you have verified a Verify attribute, you should remove it
  from the binding source code. The presence of Verify attributes
  intentionally cause build failures.

  For more information about the Verify attribute hints above,
  consult the Objective Sharpie documentation by running 'sharpie
  docs' or visiting the following URL:

    http://xmn.io/sharpie-docs

Submitting usage data to Xamarin...
  Submitted - thank you for helping to improve Objective Sharpie!

Done.

Všimněte si, že jsme předali -scope build/Headers argument Objective Sharpie. Vzhledem k tomu, že knihovny C a Objective-C knihovny musí #import nebo #include jiné hlavičkové soubory, které jsou podrobnostmi implementace knihovny, a ne rozhraní API, které chcete svázat, -scope argument říká Objective Sharpie ignorovat jakékoli rozhraní API, které není definováno v souboru někde v -scope adresáři.

Argument je -scope často volitelný pro čistě implementované knihovny, ale explicitně ho neposkytuje žádné škody.

Tip

Pokud hlavičky knihovny importují jakékoli hlavičky sady iOS SDK, například #import <Foundation.h>, budete muset nastavit obor, jinak Objective Sharpie vygeneruje definice vazeb pro hlavičku sady iOS SDK, která byla importována, což vede k obrovské vazbě, která při kompilaci projektu vazby pravděpodobně vygeneruje chyby.

Dále jsme zadali -c -Ibuild/headers. Nejprve argument říká Objective Sharpie, -c aby přestal interpretovat argumenty příkazového řádku a předávat všechny následné argumenty přímo kompilátoru clang. Proto je argument kompilátoru clang, -Ibuild/Headers který dává clang pokyn, aby hledal zahrnutí do build/Headers, což je místo, kde hlavičky POP živě. Bez tohoto argumentu clang nevěděl, kde najít soubory, které POP.h #importse ing. Téměř všechny "problémy" s používáním Objective Sharpie se zřetědí a zjistí, co se má předat clang.

Dokončení vazby

Objective Sharpie teď vygeneroval Binding/ApiDefinitions.cs soubory.Binding/StructsAndEnums.cs

Jedná se o základní předání Objective Sharpie při vazbě, a v několika případech to může být vše, co potřebujete. Jak je ale uvedeno výše, vývojář obvykle bude muset ručně upravit vygenerované soubory po dokončení Objective Sharpie, aby opravili všechny problémy , které nástroj nemohl automaticky zpracovat.

Po dokončení aktualizací je teď možné tyto dva soubory přidat do projektu vazby v Visual Studio pro Mac nebo je předat přímo btouch do nástrojů nebo bmac vytvořit konečnou vazbu.

Podrobný popis procesu vazby najdete v našich podrobných pokynech k návodu.