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", и я полагаю, что вы найдете множество рабочих скриптов, которые сделают все это за вас. Вот один, который я считаю наиболее полезным.

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

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

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

Другие вопросы по тегам