Почему моя привязка NearbyMessages Objective-C к C# вызывает исключение NSInvalidArgumentException, когда я вызываю методы публикации/подписки?

Я использовал Objective Sharpie для создания полуфункциональной привязки iOS C# для Google Nearby Messages API из бинарного файла libGNSMessages.a и заголовков в Cocopod'е NearbyMessages. Добавив эту библиотеку привязок в проект Xamarin.iOS, я могу создавать объекты GMSMessage и GMSMessageManager и обращаться к ним. Однако, когда я пытаюсь использовать GMSMessageManager.publishWithMessage(), я получаю это исключение, хотя я использую правильный тип аргумента:

Foundation.MonoTouchException: Objective-C exception thrown.  
Name: NSInvalidArgumentException 
Reason: NSConcreteMutableAttributedString initWithString:: nil value

Вот тестовый код, который я использую из метода FinishedLaunching в AppDelegate.cs (я проверил, менеджер и сообщение являются допустимыми экземплярами своего типа):

  GNSMessageManager manager = new GNSMessageManager(apiKey);
  GNSMessage message = GNSMessage.MessageWithContent(NSData.FromString("Hello"));
  GNSPublication pub = manager.PublicationWithMessage(message);

Вот привязка из ApiDefinitions.cs в проекте привязки Visual Studio, на который он ссылается (комментарий — это сигнатура метода из исходного файла заголовка Objective-C):

    // -(id<GNSPublication>)publicationWithMessage:(GNSMessage *)message;
    [Export ("publicationWithMessage:")]
    GNSPublication PublicationWithMessage (GNSMessage message);

А вот код в GNSMessageManager.g.cs (сгенерированный этим проектом Visual Studio), где возникает исключение:

    public virtual GNSPublication PublicationWithMessage (GNSMessage message)
    { ...
        if (IsDirectBinding) {
            return  Runtime.GetNSObject<GNSPublication> (global::ApiDefinitions.Messaging.IntPtr_objc_msgSend_IntPtr (this.Handle, Selector.GetHandle ("publicationWithMessage:"), message.Handle));
        }
    ... }

Режим отладки показывает, что все три этих аргумента по крайней мере не равны нулю.

Здесь такое же исключение: 'NSConcreteMutableAttributedString initWithString:: nil value' при использовании Google Nearby Сообщения. Однако эта ошибка якобы исправлена, и обновленные CocoaPods, которые я использовал в качестве основы для привязки Sharpie, прекрасно работают, когда я создаю тестовый проект Swift в XCode, поэтому моя привязка, вероятно, является виновником. Также есть более старая двоичная библиотека C# NearbyMessages, включенная в NearbyMonkey, которую я пытался использовать, но она вылетает с текущие версии iOS.

Спасибо, что нашли время, чтобы прочитать это далеко. Мы будем очень признательны за любую помощь или предложения, которые вы могли бы предложить.


person M. Shepherd    schedule 08.10.2018    source источник
comment
Пробовали ли вы извлечь скомпилированную инфраструктуру из работающего собственного проекта на основе CocoPod и использовать ее в своем проекте привязки Xamarin.iOS?   -  person SushiHangover    schedule 08.10.2018
comment
Спасибо за ответ! Да, бинарный фреймворк в проекте Cocopod и проекте Xamarin.iOS уже одинаковый; Cocopod GoogleNearby — это просто .a и набор заголовочных файлов, а все зависимости модуля также распространяются в виде готовых двоичных файлов.   -  person M. Shepherd    schedule 08.10.2018
comment
Удалось ли вам использовать Google Nearby API на xamarin.iOS?   -  person Chris van de Steeg    schedule 05.11.2018


Ответы (1)


Хорошо, несколько месяцев спустя я наконец понял, что было не так.

Модуль Google Nearby распространялся с папкой Resources — xcassets, некоторыми материалами по локализации, всем, что связано с отображением — которую я не включил в свой проект привязки. Ошибка возникала, когда программа «Рядом» пыталась получить доступ к этим изображениям и т. д., чтобы отобразить запрос на получение разрешений. Копирование этих ресурсов в мой проект Xamarin.iOS устранило ошибку.

person M. Shepherd    schedule 27.02.2019