Kotlin-Родная задача CompileKotlinIos завершается неудачно, потому что задача Cinterop не может обновляться при изменении кода Objective-C

#kotlin-native #cinterop

Вопрос:

@Кевин Галлиган У моей компании есть проект iOS, использующий Kotlin-Native, и я добавляю в проект cinterop, подобный этому, в build.gradle.kts:

 val CommonInterop by cinterops.creating {
      defFile(project.file("${commonBridgePath}/CommonBridge.def"))
      compilerOpts("-I$commonBridgePath")
    }
 

Все работает хорошо, проект ios успешно компилируется, но когда я добавляю функцию objective-C
в cinterop и вызываю эту функцию в файле kotlin, а затем создаю проект ios, Xcode сообщает мне, что компиляция собственного модуля kotlin завершается неудачно.

Я знаю, почему компиляция завершается неудачно, потому что компилятор не создает соответствующую функцию kotlin, когда я добавляю новую функцию Objective-c.

Задача cinterop пропущена, на самом деле задача не должна быть пропущена из-за изменения кода objc. введите описание изображения здесь

Но после того, как я выполняю команду «gradelw clean», затем перестраиваю проект в xcode, он работает хорошо, функция objc успешно вызывается.

Надеюсь, что команда Kotlin-Native сможет быстро исправить эту ошибку, большое спасибо!

мой файл xcode podspec выглядит следующим образом: введите описание изображения здесь

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

Комментарии:

1. Вносите ли вы изменения в файл заголовка или в исходные файлы?

2. Да, я вношу изменения в 3 файла ( 2 файла objc и 1 файл kotlin ) . Я добавляю объявление функции objc в файл заголовка objc и реализацию в исходный файл objc. Затем я добавляю код kotlin для вызова этой функции objc. Наконец, я создаю проект @ArtyomDegtyarev в Xcode, xcode показывает ошибки. Но после того, как я выполняю команду «gradelw clean», затем перестраиваю проект в xcode, он работает хорошо, функция objc успешно вызывается. Но это пустая трата времени. Я должен выполнить очистку после добавления функции Cinterop objc в уже существующий класс Cinterop objc.

3. Извините, но я не понимаю, как именно вы создаете библиотеку для взаимодействия? Насколько я понимаю, изменение заголовков приводит к повторному запуску задач cinterop(см. youtrack.jetbrains.com/issue/KT-43601 например)

4. @ArtyomDegtyarev привет, я обновил две картинки в своем вопросе. Может быть, картинка поможет вам понять мой проект. На самом деле я нахожу, что мое изменение в заголовочном файле не приводит к повторному запуску задач cinterop. Но если я запускаю «gradlew clean» и перестраиваю проект в XCode,ошибка устраняется и выполняется хорошо, моя недавно добавленная функция cinterop objc успешно вызывается в файлах kotlin. Поэтому я думаю, что с обновлением cinterop что-то не так. Компилятор не может найти, что я изменил файл objc (как показано на рисунке 3, я изменил KYNUderDefault. h и KYNUderDefault.m )и повторно запустите cinterop.

5. Я провел еще один эксперимент, после возникновения ошибки я удаляю соответствующий файл cinterop klib в каталоге сборки, а затем создаю проект ios в xcode, он успешно запускается. Журнал Xcode показывает, что : cinterop не обновлен, поэтому повторите взаимодействие.