Привязка фреймворка MasterCard iOS с помощью Objective Sharpie - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь создать проект Xamarin iOS Binding для библиотеки фреймворка iOS (zip доступен здесь ), предоставленной MasterCard, с целью разрешить платежи в приложении.Обратите внимание, что в настоящее время я пытаюсь связать инфраструктуру, поставляемую для платформы iPhoneOS (MasterpassKit_v1_32_build_11\iPhoneOS\MasterPassKit.framework).

Я попытался выполнить «Привязка библиотеки iOS Objective-C» , пошаговое руководство , и яв настоящее время он занимается созданием файла ApiDefinition с помощью Objective Sharpie.

Во-первых, просто для подтверждения работоспособности платформы iOS я создал два собственных тестовых приложения для iOS (Objective-C + Swift) и смог встроитьи успешно использовал фреймворк.

Затем я попытался запустить Objective Sharpie, используя следующие команды (находясь в каталоге, содержащем каталог MasterPassKit.framework, т.е. \MasterpassKit_v1_32_build_11\iPhoneOS\):

  1. Я попытался использовать аргумент -framework, однако это не привело к генерации файлов.

    Команда:

    sharpie bind -framework MasterPassKit.framework -sdk iphoneos12.1
    

    Вывод:

    Анализ 1 заголовкафайлы ... При сборке модуля 'MasterPassKit', импортированного из /private/var/folders/hq/z29y24gs1_g_5qvp02vr07dh0000gq/T/com.xamarin.ObjectiveSharpie/c3f67365a4014cc0a4618aa6e0caaa87.h: 1: во включенном файле: 1: во вложенном файле из ./MasterPassKit.framework/Headers/MasterPassKit.h:21: ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: предупреждение:Указан атрибут «assign», «retain» или «copy» - предполагается «assign» [-Wobjc-property-no-attribute] @property UIView * dimmingView;^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: предупреждение: атрибут свойства по умолчанию 'assign' не подходит для объекта без GC [-Wobjc-property-no-attribute]

    Binding... 2 предупреждения генерируются.не проанализированы типы, которые могут быть связаны

    Готово.Выход с кодом ошибки 1.


Затем я попытался использовать явную опцию фреймворка (с областью, указанной в папке заголовка фреймворка).В результате был получен очень маленький файл ApiDefinition.cs, в котором определены только некоторые глобальные константы, но не определено ни одно из фактических определений класса target-c.

Команда:

sharpie bind -output bindingscoped -sdk iphoneos12.1 -scope MasterPassKit.framework/Headers

MasterPassKit.framework / Headers /MasterPassKit.h -c -F.

Вывод:

Анализ файлов заголовков 1 ... В файл включены из / Users / development / iOS / MasterpassKit_v1_32_build_11 / iPhoneOS / MasterPassKit.framework / Headers / MasterPassKit.h: 21: ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: предупреждение: атрибут «assign», «retain» или «copy» не указан - «assign»предполагается [-Wobjc-property-no-attribute] @property UIView * dimmingView;^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: предупреждение: атрибут свойства по умолчанию 'assign' не подходит для объекта без GC [-Wobjc-property-no-attribute]

Binding... [write] ApiDefinitions.cs

Анализ связывания: Автоматическое связывание завершено, но есть несколько API, которые были помечены с атрибутами [Verify].Несмотря на то, что вся привязка должна проверяться на предмет лучших методик проектирования API, более внимательно изучите API со следующими подсказками атрибута Verify:

ConstantsInterfaceAssociation (1 экземпляр): нет надежного способа определить, с каким интерфейсом Objective-Cобъявление внешней переменной может быть связано.Их экземпляры связаны как свойства [Field] в частичном интерфейсе с соседним конкретным интерфейсом для создания более интуитивного API, возможно, полностью исключающего интерфейс «Constants».

После проверки атрибута Verify выследует удалить его из исходного кода привязки.Наличие атрибутов Verify намеренно вызывает сбои сборки.Для получения дополнительной информации о приведенных выше советах по атрибуту Verify обратитесь к документации Objective Sharpie, запустив 'sharpie docs' или посетив следующий URL: http://xmn.io/sharpie-docs

2 сгенерированных предупреждения.

Done.


Я попытался использовать явную команду фреймворка, аналогичную предыдущей, однако я опустил аргумент -scope.Это привело к появлению массивных файлов ApiDefinition.cs и StructsAndEnums.cs, которые, как я предполагаю, в основном являются ссылочными определениями каркаса (из-за того, что они не ограничены областью заголовка целевой папки каркаса).Он также содержит многочисленные операторы проверки для базовых платформ, через которые было бы очень много времени работать.

Команда:

sharpie bind -output bindingnoscoped -sdk iphoneos12.1 MasterPassKit.framework/Headers/MasterPassKit.h -c -F .

Вывод:

Парсинг1 заголовочный файл ... В файле, включенном в /Users/development/Desktop/iOS/MasterpassKit_v1_32_build_11/iPhoneOS/MasterPassKit.framework/Headers/MasterPassKit.h:21: ./MasterPassKit.framework/Headers/MPPresenh.: предупреждение: атрибут «assign», «retain» или «copy» не указан - предполагается «assign» [-Wobjc-property-no-attribute] @property UIView * dimmingView;^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: предупреждение: атрибут свойства по умолчанию 'assign' не подходит для объекта без GC [-Wobjc-property-no-attribute]

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

Анализ привязки: автоматическое связывание завершено, но есть несколько API, которые были помечены с атрибутами [Verify].Несмотря на то, что вся привязка должна проверяться на предмет лучших методик проектирования API, более внимательно изучите API со следующими подсказками атрибута Verify:

ConstantsInterfaceAssociation (201 экземпляр): нет надежного способа определить, с каким интерфейсом Objective Cобъявление внешней переменной может быть связано.Их экземпляры связаны как свойства [Field] в частичном интерфейсе с соседним конкретным интерфейсом для создания более интуитивного API, возможно, полностью исключающего интерфейс «Constants».

MethodToProperty (192 экземпляра): Objective-Метод C был связан как свойство C # из-за соглашения, такого как отсутствие параметров и возвращение значения (возвращение без void).Часто такие методы должны быть привязаны как свойства к более привлекательному API, но иногда могут возникать ложные срабатывания, и привязка должна быть методом.

StronglyTypedNSArray (42 экземпляра): собственный NSArray * был связан какNSObject [].Возможно, можно будет более строго набрать массив в привязке на основе ожиданий, установленных в документации API (например, комментарии в заголовочном файле) или путем проверки содержимого массива посредством тестирования.Например, NSArray *, содержащий только экземпляры NSNumber *, можно связать как NSNumber [] вместо NSObject [].

PlatformInvoke (3251 экземпляров): в общем случае привязки P / Invoke не так правильны или полны, как Objective-С привязки (по крайней мере, в настоящее время).Возможно, вам придется исправить имя библиотеки (по умолчанию это __Internal) и типы возвращаемых / параметров вручную, чтобы соответствовать соглашениям о вызовах C для целевой платформы.Вы можете обнаружить, что даже не хотите показывать C API в своей привязке, но если вы это сделаете, вы, вероятно, также захотите переместить определение в более подходящий класс и предоставить более надежную оболочку с безопасным типом.Инструкции по P / Invoke см. В http://www.mono -project.com / docs / advanced / pinvoke / .

InferredFromMemberPrefix (29 экземпляров): имя этого первоначально анонимного объявления было взято изобщий префикс его членов.

После того, как вы проверили атрибут Verify, вы должны удалить его из исходного кода привязки.Наличие атрибутов Verify намеренно вызывает сбои сборки.Для получения дополнительной информации о приведенных выше подсказках атрибута Verify обратитесь к документации Objective Sharpie, запустив 'sharpie docs' или посетив следующий URL: http://xmn.io/sharpie-docs

2 сгенерированных предупреждения.

Готово.


Пожалуйста, дайте мне знать, если я что-то делаю неправильно.

Любая помощь будет принята с благодарностью!

Обновление

Таким образом, я в итоге получил его на работу.Сначала мне пришлось сгладить ссылки на импорт заголовка зонтика, затем я выполнил следующую команду, чтобы сгенерировать действительный файл ApiDefinition and Struct:

sharpie bind -output MasterPassBindings -namespace MasterPassBindings -sdk iphoneos12.1 -scope Headers Headers/MasterPassKit.h -c -IHeaders -arch arm64
...