MyClass недоступен: не удается найти объявление Swift для этого класса - Simulator
У меня есть моя структура, и я поддерживаю различные архитектуры. Для поддержки симулятора я использую x86_64 в действующей архитектуре.
Но когда я использую свой фреймворк в приложении, я получаю ошибку при запуске приложения на симуляторе:
MyClass(In framework) недоступен: не удается найти объявление Swift для этого класса
Примечание: он отлично работает на устройстве.
2 ответа
Если память мне не изменяет, так как 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 Architectures " (VALID_ARCHS
ты уже это сделал)
Теперь создайте свою платформу, найдите файл комплекта в группе Product в Xcode и откройте его в Finder:
Вы должны найти две папки, по одной для каждого набора архитектур:
2. Объединить две рамки в одну
Теперь иди в Debug-iphoneos
папку, скопируйте оттуда фреймворк и вставьте его куда-нибудь еще, например в родительскую папку:
Он будет содержать нашу универсальную основу в ближайшее время. Для этого нам нужно сначала создать универсальную динамическую библиотеку с 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
и скопируйте файлы из папки в папку целевого фреймворка. Теперь вы должны иметь эту папку выглядеть примерно так:
Это оно! Теперь у вас есть универсальный фреймворк, который должен корректно работать как на симуляторе 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", и я полагаю, что вы найдете множество рабочих скриптов, которые сделают все это за вас. Вот один, который я считаю наиболее полезным.
Я вижу два возможных варианта:
- Ваше устройство и ваш симулятор используют разные версии iOS, а ваш фреймворк использует что-то из последних версий iOS (также я вижу, что у вас есть опция "Build Active Architecture only", переключенная на "Нет". Попробуйте переключить ее обратно на " Да, и сделайте чистую сборку. Возможно, компилятор найдет проблему, но это зависит от того, как вы связываете свою среду с приложением).;
- Ваш
framework
построен для конкретного устройства. Попробуйте переключиться на цель 'framework', переключите место назначения для сборки на 'Generic iOS device' и сделайте чистые сборки для 'framework' и приложения.
Кроме того, это поможет, если вы обновите вопрос с кратким описанием того, как вы связываете свою среду (через Workspace / через двоичный файл / через CocoaPods / и т. Д.). Обычно такие проблемы вызваны какими-то глупыми вещами, и вы должны проверить все теории, даже сбросить или ввести в заблуждение с первого взгляда:)