Avatar ·

Ошибка "No such module" в Xcode, хотя фреймворк добавлен в проект

Привет! Я новичок в iOS-разработке и использую Swift вместе с Xcode. Столкнулся с проблемой: я добавил фреймворк (например, Alamofire) через Swift Package Manager, а также через CocoaPods в другом проекте. Всё устанавливается без ошибок, я вижу фреймворк в списке зависимостей, но когда пытаюсь импортировать его в своём классе, Xcode выдаёт ошибку: "No such module 'Alamofire'". Вот пример кода, который у меня есть: ```swift import UIKit import Alamofire // <- тут ошибка "No such module 'Alamofire'" class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() AF.request("https://api.example.com/data").response { response in print(response) } } } ``` Я проверил: фреймворк указан в разделе "Frameworks, Libraries, and Embedded Content" в настройках таргета, а также в Podfile (если использую CocoaPods) всё прописано корректно. Clean Build Folder и перезапуск Xcode не помогли. Что я делаю не так? Может, проблема в том, что я использую несколько менеджеров зависимостей одновременно? Или нужно что-то настроить в Build Settings? Буду благодарен за подробное объяснение для новичка. <<>>

Причины ошибки "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", импортируйте именно его.