Я пытаюсь понять, как лучше всего добавить код нативной библиотеки в плагин NativeScript для iOS. В прошлом мне удавалось приносить CocoaPod и получать от него доступ к символам. Итак, я хочу создать свой собственный. Я слежу за процессом создания моего библиотечного проекта pod lib create TestPod. (https://guides.cocoapods.org/making/using-pod -lib-create.html) «Библиотека» - это тривиальный тест: она просто создает класс с функцией, которая возвращает узнаваемая строка приветствия. Связанная демонстрация «Пример приложения» создает текстовую метку, которая отображает эту строку.

Все это работает, как ожидалось, все работает в чистом мире iOS (написанном на Swift).

На стороне Nativescript я использую Seed плагина Nativescript и объявляю свой Podfile в папке src / platform / iOS, как указано. Мой «плагин» (тривиальный, как тест) имеет специфичные для iOS части в файле pluginName.ios.js. У меня есть отдельный метод тестирования, который проверяет, могу ли я достигать и использовать собственные символы платформы iOS (например, NSMutableString) и который работает должным образом. Я хочу сделать то же самое с машинным кодом, импортированным из моей библиотеки.

Но когда я добавляю Podfile в Nativescript, он строится нормально, но я не вижу никаких символов, как я ожидал бы увидеть. Я генерирую типизацию и не нахожу ее, но я нашел файл типизации TestPod.d.ts, в котором объявляется некоторая информация о версии, и таинственный класс с именем «UITest», который я не определял и не похожий на мой Класс "SimpleTest", которого нигде не могу найти.

Я уверен, что мне здесь не хватает чего-то, что очевидно для знающих. Но я не могу догадаться, что это такое. Любые идеи?

import Foundation 
@objc public class SimpleTest : NSObject { 
  public func announce() -> String { 
     return "Greetings from Swift code in a library" 
  } 
}

Я вызываю это в плагине, используя следующее:

    public testNativeLib() : string {
        let str:string;
        try {
            const testClass = new SimpleTest()
            str = testClass.announce()
        } catch(e) {
            str = e.message;
        }
        return str;
    }

И то, что я получаю для str, - это сообщение об ошибке catch case: «Не удается найти переменную: SimpleTest»

0
tremho 25 Июл 2020 в 00:40

1 ответ

Лучший ответ

Не видя источника файла пода; можно только предположить, что вы не использовали @objc ни для чего, что хотели бы раскрыть. Если вы не раскрываете что-либо с помощью @objc (или производного от собственного класса objc, поэтому он автоматически помечается меткой swift), NativeScript не может его увидеть.

Обратите внимание, что это некоторые типы в Swift, которые в настоящее время не могут быть использованы NativeScript (или ObjC), и вам нужно быстро написать некоторый код оболочки, используя типы, совместимые с ObjC, чтобы NativeScript мог его использовать.

См.: https://docs.nativescript.org/guides/ios-source-code для получения дополнительной информации о требованиях ...

Код должен быть:

import Foundation 
public class SimpleTest : NSObject { 
   @objc public func announce() -> String { 
       return "Greetings from Swift code in a library" 
   } 
}

Переместите @objc к фактическому свойству / функции, которую вы хотите показать. NSObject уже вызовет отображение класса, если у него есть открытые члены.

Сгенерированные метаданные:

enter image description here


Полная демонстрация с использованием быстрого исходного файла в плагине теперь находится по адресу

Если у меня есть полный контроль над источником, я обычно не буду добавлять в микс еще одну движущуюся часть (например, коконоду); просто позвольте xcode скомпилировать быстрый код и раскрыть его, не нужно добавлять какие-либо дополнительные места, которые могут сломаться.

Однако, если вы хотите увидеть, как создать настоящий быстрый плагин CocoaPod; проверить любой из этих репозиториев плагинов, которые используют быстрый код и cocoapod:

В случае настоящего коконода; у вас должен быть действующий Podfile и действительный файл podspec! Как только вы их получите; когда вы создаете приложение, вы можете открыть xcode и убедиться, что cocoapod подключен. Если он не связан, ваш подфайл / podspec испорчен и имеет отношение к проблеме с Cocoapod, и это не проблема с NativeScript. Итак, в этом случае; вам нужно следовать некоторым руководствам по Cocoapod, чтобы заставить его работать.

Пожалуйста, обрати внимание; Настоятельно рекомендуется часто запускать ядерную бомбу в папке вашей платформы во время тестирования с помощью cocoapods. Иногда Nativescript не обнаруживает изменения в собственном коде должным образом и поэтому не восстанавливает файлы проекта / рабочей области xcode. Так что ядерная бомбардировка вашей папки платформ, конечно, заставит ее восстановить их. Если вы этого не сделаете, вы БУДЕТЕ тратить много времени, возясь с коконодами.

При запуске демонстрационного проекта вы увидите следующее: введите описание изображения здесь

Кроме того, в демонстрации метаданные, сгенерированные из кода, который я сохранил в папке demo / metadata, чтобы вы могли их просмотреть.

0
Nathanael 29 Июл 2020 в 14:25