Ошибка "No such module" в Xcode, хотя фреймворк добавлен в проект
Причины ошибки "No such module" и основные решения
Ошибка "No such module" возникает, когда Xcode не может найти фреймворк во время компиляции, даже если он физически присутствует в проекте. Чаще всего это связано с неправильной настройкой путей поиска или конфликтом менеджеров зависимостей. Вот пошаговое руководство, как это исправить.
1. Проверьте, какой менеджер зависимостей вы используете
Никогда не смешивайте CocoaPods и Swift Package Manager (SPM) для одного и того же фреймворка. Это частая ошибка новичков. Если вы добавили Alamofire через CocoaPods, удалите его из SPM, и наоборот. Для проверки:
- CocoaPods: откройте Podfile и убедитесь, что строка
pod 'Alamofire'есть только один раз. Затем выполнитеpod installв терминале в папке проекта. После этого всегда открывайте.xcworkspace, а не.xcodeproj. - SPM: в Xcode перейдите в File → Add Packages... и проверьте, что пакет добавлен. Убедитесь, что он включён в нужный таргет (галочка напротив вашего приложения).
2. Настройте Build Settings
Если фреймворк добавлен правильно, но ошибка остаётся, проверьте следующие параметры в настройках вашего таргета:
// Путь: Project Navigator → Ваш проект → TARGETS → Ваш таргет → Build Settings
// 1. Framework Search Paths — должен содержать путь к папке с фреймворками.
// Для CocoaPods: $(inherited) и "${PODS_ROOT}/Alamofire"
// Для SPM: обычно не требуется, но если нужно: $(BUILT_PRODUCTS_DIR)
// 2. Always Embed Swift Standard Libraries — установите в YES (для старых проектов).
// 3. Runpath Search Paths — добавьте @executable_path/Frameworks (для динамических библиотек).
3. Очистите кеш и пересоберите проект
Иногда Xcode кеширует старые данные. Выполните:
- Product → Clean Build Folder (зажмите Option, чтобы пункт стал доступен).
- Закройте Xcode полностью.
- Удалите папку
DerivedDataвручную:~/Library/Developer/Xcode/DerivedData. - Откройте проект заново и соберите (Cmd+B).
4. Проверьте файл .podspec или Package.swift
Если вы сами создаёте фреймворк, убедитесь, что в его конфигурации (например, Package.swift для SPM) указаны все платформы и таргеты:
// Пример Package.swift для Alamofire (упрощённо)
let package = Package(
name: "Alamofire",
platforms: [.iOS(.v13)], // Убедитесь, что версия iOS совместима
products: [.library(name: "Alamofire", targets: ["Alamofire"])],
targets: [.target(name: "Alamofire", path: "Source")]
)
5. Альтернативный метод: ручной импорт
Если ничего не помогает, попробуйте удалить фреймворк и добавить его заново через другой менеджер. Например, если вы использовали CocoaPods, перейдите на SPM:
// 1. Закомментируйте строку pod 'Alamofire' в Podfile
// 2. Выполните pod install, чтобы удалить под
// 3. В Xcode: File → Add Packages... → введите https://github.com/Alamofire/Alamofire
// 4. Выберите версию и добавьте в таргет
После этого ошибка должна исчезнуть. Если нет — проверьте, что ваш проект использует правильную схему сборки (например, Debug vs Release) и что фреймворк совместим с вашей версией iOS.
<<Дополнительное решение: проверка архитектуры и симулятора
Иногда ошибка "No such module" возникает из-за несовместимости архитектуры фреймворка с текущим симулятором или устройством. Особенно это актуально для старых фреймворков, собранных только для физических устройств. Попробуйте следующее:
- В Xcode выберите симулятор iPhone с процессором Apple Silicon (например, iPhone 15 Pro). Если фреймворк не поддерживает arm64 для симулятора, он не будет найден.
- Проверьте, что в Build Settings вашего таргета параметр
Excluded Architecturesпуст для Debug и Release. Если там указаноarm64для симулятора, удалите это значение. - Для CocoaPods: добавьте в Podfile строку
post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' end end— это исключит arm64 для симулятора, если фреймворк не поддерживает его.
Также убедитесь, что вы не используете import с неправильным регистром. Swift чувствителен к регистру: import Alamofire — правильно, а import alamofire — нет. Если фреймворк называется "Alamofire", но модуль внутри называется "AlamofireCore", импортируйте именно его.