MyClass недоступен: не удается найти объявление Swift для этого класса - Simulator - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть фреймворк, и я поддерживаю разные архитектуры.Для поддержки симулятора я использую x86_64 в допустимых архитектурах .


enter image description here

Но когда я использую свой фреймворк в приложении, я получаю ошибку при запуске приложения на симуляторе :

«MyClass (In framework)» недоступен: не удается найти объявление Swift для этого класса

Примечание : на устройстве работает нормально.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Если память мне не изменяет, так как 6-я версия Xcode не поддерживает так называемые «универсальные» фреймворки (фреймворки, которые содержат архитектуры для arm -семейства и x86_64 / i386). Так что теперь, когда выпостроить фреймворк Xcode создаст два отдельных пакета для iphoneos и iphonesimulator (вы можете найти их в соответствующих папках в вашей папке производных данных). Архитектура, которую будут содержать эти фреймворки, зависит от переменной ARCHS. По умолчанию этоустановите значение $ARCHS_STANDARD, которое варьируется в зависимости от платформы. Вы можете поиграть с этим параметром, смешивая архитектуры, которые вам действительно нужны, но Xcode потерпит неудачу во время сборки, если эти архитектуры несовместимы (предположительно x86_64 и arm -семейные архитектуры считаются несовместимыми.)

Чтобы обойти это ограничение, вам действительно нужно немного «усердно работать» самостоятельно и «объединять» пакеты фреймворков для симуляторов и устройств вручную.

1. Создайте свой фреймворк для устройства и симулятора iOS

Здесь нет ничего сложного, просто перейдите к настройкам целевой сборки и убедитесь, что для параметра " Build Active Architecture Only " (ONLY_ACTIVE_ARCH) установлено значение NO и добавьте все необходимыеархитектуры для " Действительных архитектур " (VALID_ARCHS, вы уже сделали это):

Build settings

Теперь создайте свою платформу, найдите файл комплекта в группе продуктов в XCode и откройте его в Finder:

Open build folder

Вы должны найти две папки,по одному на каждый набор архитектур:

Build folder

2.Объедините две рамки в одну

Теперь перейдите в папку Debug-iphoneos, скопируйте оттуда структуру и вставьте ее куда-нибудь еще, например в родительскую папку:

Framework in parent folder

Он будет содержать нашу универсальную структуру в ближайшее время.Для этого нам нужно сначала создать универсальную динамическую библиотеку с помощью инструмента lipo.Откройте терминал, перейдите в папку, в которой вы сейчас находитесь (с скопированным файлом инфраструктуры), и введите следующее:

$ lipo -create -output 'MyFramework' 'Debug-iphoneos/MyFramework.framework/MyFramework' 'Debug-iphonesimulators/MyFramework.framework/MyFramework'

Если вы не находитесь в папке производных данных, ваши пути к библиотекам инфраструктуры будут отличаться откурс.Эта команда создаст новую универсальную библиотеку, содержащую оба набора архитектур.Теперь просто перетащите его в свой пакет фреймворка и замените существующий.

Вероятно, у вашего фреймворка есть фрагменты архитектуры в папке типа MyFramework.framework/Modules/MyFramework.swiftmodule.Наша универсальная структура должна иметь срезы для всех поддерживаемых архитектур.Внутри у вас уже должны быть кусочки arm, так как мы скопировали наш фреймворк из папки Debug-iphoneos, поэтому просто найдите ту же папку для Debug-iphonesimulator и скопируйте файлы из папки в папку целевого фреймворка.Теперь эта папка должна выглядеть примерно так:

Framework slices

Вот и все!Теперь у вас есть универсальный фреймворк, который должен корректно работать как на симуляторе iOS, так и на устройстве iOS.

3.Разделите ваш фреймворк при отправке в Appstore

Если вы попытаетесь подать заявку вместе с универсальным фреймворком, оно будет автоматически отклонено .Поэтому перед отправкой вам нужно будет извлекать только архитектуры устройств одну за другой, а затем объединять их в одну среду, используя lipo:

$lipo -extract 'arm' 'MyFramework.framework/MyFramework' -output 'MyFramework-arm'
$lipo -extract 'arm64' 'MyFramework.framework/MyFramework' -output 'MyFramework-arm64'
$lipo -create -output 'MyFramework' 'MyFramework-arm' 'MyFramework-arm64'

Затем скопируйте ее в свою среду и удалите лишние фрагменты.

PS

Надеюсь, это поможет, однако это довольно известная проблема, и в Интернете уже есть множество решений.Я предлагаю вам погуглить такие термины, как «Создание толстой / универсальной платформы iOS», и я полагаю, что вы найдете множество рабочих скриптов, которые сделают все это за вас. Здесь - это один из наиболее полезных для меня.

0 голосов
/ 26 декабря 2018

Я вижу два возможных варианта:

  1. Ваше устройство и ваш симулятор используют разные версии iOS, а ваш фреймворк использует что-то из последних версий iOS (также я вижу, что у вас есть опция "Build Active Architecture only "переключено на" Нет ". Попробуйте переключить его обратно на" Да "и сделать чистую сборку. Возможно, компилятор найдет проблему, но это зависит от того, как вы связываете свою инфраструктуру с приложением) .;
  2. Ваш framework создан для определенного устройства.Попробуйте переключиться на цель 'framework', переключите место назначения для сборки на 'Generic iOS device' и сделайте чистые сборки для 'framework' и приложения.

Кроме того, это поможет, если вы обновитевопрос с кратким описанием того, как вы связываете свою инфраструктуру (через Workspace / через двоичный файл / через CocoaPods / и т. д.).Обычно такие проблемы вызваны какими-то глупостями, и вам следует проверить все теории, даже бросить или ввести в заблуждение с первого взгляда:)

...