GLM 4.5 Air

Исправление сборки модуля Titanium iOS: полное руководство

Исправление сбоев сборки модуля Titanium iOS с предупреждениями симулятора. Узнайте, почему зависимости вызывают ошибки и как устранять несоответствия архитектуры при сборке для физических устройств.

Вопрос

Сбой сборки модуля Titanium iOS с предупреждениями xcodebuild для симулятора, несмотря на цель физического устройства

Я сталкиваюсь с ошибками сборки при попытке генерировать .zip-файл для модуля Titanium iOS. Сборка завершается сбоем только при включении зависимостей (.xcframeworks / Packages), но успешно проходит без них.

Окружение:

  • Titanium SDK: 12.7.1.GA
  • Node.js: v22.17.0
  • Xcode: 16.2

Выполненные шаги:

  1. Создан новый модуль Titanium iOS
  2. Открытый сгенерированный .xcodeproj в Xcode
  3. Импортированы сторонние пакеты и .xcframeworks (скопированы в корень проекта и добавлены как зависимости)
  4. Попытка собрать модуль с использованием: ti build -p ios --build-only

Проблема:

  • Сборка завершается сбоем только при включении зависимостей (.xcframeworks / Packages)
  • SDK provider notes: no simulator slices provided (device-only)
  • Несмотря на цель физического iPhone, сборка все равно выдает ошибки, связанные с архитектурой симулятора

Вопросы:

  1. Требуется ли подключение физического устройства для сборки модуля с флагом --build-only?
  2. Почему Titanium все равно ссылается на срезы симулятора, даже при цели реального устройства?

Сообщение об ошибке:
[ERROR] [xcode-sim] — xcodebuild: WARNING: Using the first of multiple matching destinations:
[ERROR] [xcode-sim] { platform:iOS Simulator, id:dvtdevice-DVTiOSDeviceSimulatorPlaceholder-iphonesimulator:placeholder, name:Any iOS Simulator Device }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:4F7BE224-2D3D-4702-B44B-937D9E36BF64, OS:18.3.1, name:iPad (10th generation) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:4F7BE224-2D3D-4702-B44B-937D9E36BF64, OS:18.3.1, name:iPad (10th generation) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:B97F0BA8-5249-4B1F-B54C-3753A4D7FB43, OS:18.3.1, name:iPad (A16) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:B97F0BA8-5249-4B1F-B54C-3753A4D7FB43, OS:18.3.1, name:iPad (A16) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:695ED476-5007-46FA-8BB4-DF40B2EF5F02, OS:18.3.1, name:iPad Air 11-inch (M2) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:695ED476-5007-46FA-8BB4-DF40B2EF5F02, OS:18.3.1, name:iPad Air 11-inch (M2) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:7373F603-6ED5-4484-8456-5229E724CBCE, OS:18.3.1, name:iPad Air 11-inch (M3) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:7373F603-6ED5-4484-8456-5229E724CBCE, OS:18.3.1, name:iPad Air 11-inch (M3) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:728B0D52-EE40-407D-BE1F-BD4B62D218D5, OS:18.3.1, name:iPad Air 13-inch (M2) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:728B0D52-EE40-407D-BE1F-BD4B62D218D5, OS:18.3.1, name:iPad Air 13-inch (M2) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:E154E704-3901-492B-A685-8F7CC1ECEBEB, OS:18.3.1, name:iPad Air 13-inch (M3) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:E154E704-3901-492B-A685-8F7CC1ECEBEB, OS:18.3.1, name:iPad Air 13-inch (M3) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:773FF7EA-C3FA-4705-A363-7CDFB482474D, OS:18.3.1, name:iPad Pro 11-inch (M4) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:773FF7EA-C3FA-4705-A363-7CDFB482474D, OS:18.3.1, name:iPad Pro 11-inch (M4) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:1A47D593-EE9E-4F7F-9C5D-6861DD476636, OS:18.3.1, name:iPad Pro 13-inch (M4) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:1A47D593-EE9E-4F7F-9C5D-6861DD476636, OS:18.3.1, name:iPad Pro 13-inch (M4) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:64A2762B-09D6-4F6C-9262-6346FB70030F, OS:18.3.1, name:iPad mini (A17 Pro) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:64A2762B-09D6-4F6C-9262-6346FB70030F, OS:18.3.1, name:iPad mini (A17 Pro) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:72E2FA73-C4D7-4D31-B89C-9D03DD95D467, OS:18.3.1, name:iPhone 16 }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:72E2FA73-C4D7-4D31-B89C-9D03DD95D467, OS:18.3.1, name:iPhone 16 }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:FCF33745-0970-43F9-BD88-C03EA31F439A, OS:18.3.1, name:iPhone 16 Plus }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:FCF33745-0970-43F9-BD88-C03EA31F439A, OS:18.3.1, name:iPhone 16 Plus }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:D8F785EE-D58A-4F22-AB7D-7A3985939361, OS:18.3.1, name:iPhone 16 Pro }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:D8F785EE-D58A-4F22-AB7D-7A3985939361, OS:18.3.1, name:iPhone 16 Pro }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:5331D689-16E8-47DD-BBC6-2F82D2355D8D, OS:18.3.1, name:iPhone 16 Pro Max }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:5331D689-16E8-47DD-BBC6-2F82D2355D8D, OS:18.3.1, name:iPhone 16 Pro Max }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:F30EBE5A-5E80-41C8-A922-1F694CC9172B, OS:18.3.1, name:iPhone 16e }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:F30EBE5A-5E80-41C8-A922-1F694CC9172B, OS:18.3.1, name:iPhone 16e }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:784A55D0-10F1-4134-B69F-5AD5EB2AD23E, OS:18.3.1, name:iPhone SE (3rd generation) }
[ERROR] [xcode-sim] { platform:iOS Simulator, id:784A55D0-10F1-4134-B69F-5AD5EB2AD23E, OS:18.3.1, name:iPhone SE (3rd generation) }
[ERROR] [xcode-sim] { platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Any iOS Device }
[ERROR] [xcode-sim] ** ARCHIVE FAILED **
[ERROR] [xcode-sim] The following build commands failed:
[ERROR] [xcode-sim] Archiving project TestModule with scheme ComSgaTest
[ERROR] [xcode-sim] (1 failure)

GLM 4.5 Air

Сбой сборки модуля Titanium iOS с предупреждениями симулятора несмотря на цель физического устройства

Сбой сборки, с которым вы сталкиваетесь, происходит потому, что ваш модуль Titanium iOS пытается собрать для симуляторов, хотя вы указали зависимости только для устройств. Даже если вы ориентируетесь на физическое устройство, процесс сборки все равно ссылается на срезы симулятора, которые отсутствуют в ваших зависимостях. Это несоответствие вызывает сбой сборки.

Содержание

Понимание основной проблемы

При сборке модуля Titanium iOS с внешними зависимостями, такими как .xcframeworks или Swift Packages, процесс сборки должен генерировать срезы как для симуляторов, так и для физических устройств. Ваше сообщение об ошибке указывает, что:

  1. Titanium обнаруживает несколько целей сборки (и симуляторы, и устройства)
  2. По умолчанию он выбирает цель симулятора первой, как показано в предупреждении: “Используется первый из нескольких совпадающих целей”
  3. Ваши зависимости содержат только срезы для устройств (как указано в “Примечания поставщика SDK: не предоставлены срезы симулятора”)
  4. Это несоответствие архитектур вызывает сбой сборки

Ключевое понимание заключается в том, что даже когда вы указываете флаг --build-only и намерены нацелиться на физическое устройство, система сборки Titanium все равно оценивает все доступные цели, включая симуляторы.

Нужно ли подключать физическое устройство?

Для сборки модуля Titanium с флагом --build-only не требуется подключать физическое устройство. Флаг --build-only явно указывает Titanium:

  • Генерировать пакет модуля (.zip файл)
  • Не устанавливать его на устройство или симулятор
  • Сконцентрироваться на процессе компиляции и линковки

Однако проблема не связана с подключением устройства — она заключается в совместимости архитектур. Titanium должен знать, для каких архитектур собирать, и когда зависимости предоставляют только срезы для устройств, процесс сборки должен по умолчанию использовать сборку только для устройств.

Почему Titanium ссылается на срезы симулятора

Titanium ссылается на срезы симулятора по нескольким причинам:

  1. Рабочий процесс разработки: Конфигурация сборки Titanium по умолчанию часто включает симуляторы для тестирования целей во время разработки.

  2. Отсутствие конфигурации только для устройств: Когда не установлена явная конфигурация только для устройств, Titanium возвращается к оценке всех доступных целей сборки.

  3. Архитектура зависимостей: Ваши .xcframeworks или пакеты могут быть настроены таким образом, что они должным образом не сообщают о своей ориентации только на устройства системе сборки.

  4. Система сборки Titanium: CLI Titanium может по умолчанию использовать “общую” сборку, которая проверяет все доступные цели перед определением подходящей архитектуры.

Вот что происходит, когда вы включаете зависимости без правильной конфигурации архитектуры:

Процесс сборки Titanium
                      |
                      v
Определение доступных целей
                      |
                      v
[Симуляторы] [Устройства]
      |           |
      v           v
Проверка зависимостей   Проверка зависимостей
на наличие срезов       на наличие срезов
      |           |
      v           v
Сбой (нет срезов) Успех (срезы устройства)

Решение проблемы со сборкой

Решение 1: Явное указание сборки только для устройств

Измените команду сборки, чтобы явно указать цель устройства:

bash
ti build -p ios --build-only --target-device iphone

Это указывает Titanium рассматривать только сборки для устройств и игнорировать симуляторы.

Решение 2: Правильная настройка зависимостей

Для .xcframeworks убедитесь, что они содержат правильные срезы архитектур. Если вы создаете свой собственный .xcframework:

bash
# Создание фреймворка для устройства
xcodebuild -project YourProject.xcodeproj -scheme YourScheme -configuration Release -sdk iphoneos -arch arm64 -archivePath YourProject.xcarchive archive

# Создание фреймворка для симулятора
xcodebuild -project YourProject.xcodeproj -scheme YourScheme -configuration Release -sdk iphonesimulator -arch x86_64 -archivePath YourProject-sim.xcarchive archive

# Объединение в универсальный xcframework
xcodebuild -create-xcframework -framework YourProject.xcarchive/Products/Library/Frameworks/YourProject.framework -framework YourProject-sim.xcarchive/Products/Library/Frameworks/YourProject.framework -output YourProject.xcframework

Решение 3: Изменение конфигурации модуля

Обновите файл module.xcconfig вашего модуля, чтобы явно указать архитектуры только для устройств:

xcconfig
// module.xcconfig
ONLY_ACTIVE_ARCH = NO
VALID_ARCHS = arm64 arm64e
ARCHS = arm64 arm64e

Решение 4: Обновление скрипта сборки в вашем модуле

В файле build.py вашего модуля Titanium измените скрипт сборки, чтобы явно установить конфигурацию только для устройств:

python
def build(titaniumSdk):
    import os
    import subprocess
    
    # Получение пути к xcodeproj
    xcodeproj_path = os.path.join(os.getcwd(), "YourModule.xcodeproj")
    
    # Сборка только для устройства
    cmd = ["xcodebuild", "-project", xcodeproj_path, "-scheme", "YourModule", "-configuration", "Release", "-sdk", "iphoneos", "archive"]
    
    # Выполнение команды
    subprocess.call(cmd)

Решение 5: Проверка и обновление зависимостей пакетов

Для зависимостей Swift Package убедитесь, что они правильно настроены для включения архитектур устройств. В Xcode:

  1. Выберите ваш проект в навигаторе проектов
  2. Перейдите к “Frameworks, Libraries, and Embedded Content” для вашей цели
  3. Убедитесь, что зависимости пакетов установлены на “Embed & Sign”
  4. Проверьте раздел “Platforms”, чтобы убедиться, что выбран iOS с соответствующими архитектурами

Лучшие практики для зависимостей модуля

1. Универсальные фреймворки

Всегда создавайте универсальные .xcframeworks, которые включают:

  • Срезы устройств (arm64, arm64e)
  • Срезы симуляторов (x86_64, arm64 для Mac на базе Apple Silicon)

2. Условный код

Используйте условную компиляцию для разделения кода для симулятора и устройства:

swift
#if targetEnvironment(simulator)
    // Код, специфичный для симулятора
#else
    // Код, специфичный для устройства
#endif

3. Проверка архитектуры

Добавьте проверку в ваш модуль для обеспечения правильных архитектур:

swift
import Foundation

public class ArchitectureValidator {
    public static func validate() {
        #if targetEnvironment(simulator)
            print("Запущено на симуляторе")
        #else
            print("Запущено на устройстве")
        #endif
    }
}

4. Правильное управление зависимостями

Используйте инструмент управления зависимостями, такой как Swift Package Manager или CocoaPods, для правильной обработки сторонних библиотек.

5. Лучшие практики для скриптов сборки

При создании модулей Titanium всегда:

  1. Явно указывайте архитектуры
  2. Используйте правильные цели SDK
  3. Обрабатывайте конфигурации как для симулятора, так и для устройства
  4. Включайте обработку ошибок в скриптах сборки

Чек-лист для устранения неполадок

Перед попыткой сборки вашего модуля проверьте эти пункты:

  • [ ] Ваши .xcframeworks содержат срезы как для симулятора, так и для устройства
  • [ ] Ваши Swift Packages правильно настроены для iOS
  • [ ] Файл module.xcconfig вашего модуля указывает правильные архитектуры
  • [ ] Вы используете последние совместимые версии Titanium SDK и Xcode
  • [ ] Ваш скрипт сборки явно нацелен на сборку только для устройств
  • [ ] Все зависимости правильно связаны с целью вашего модуля
  • [ ] Вы пробовали собирать с флагом --target-device iphone

Заключение

Сбой сборки модуля Titanium iOS с предупреждениями симулятора происходит потому, что процесс сборки пытается включить срезы симулятора, когда ваши зависимости предоставляют только срезы для устройств. Для решения этой проблемы:

  1. Явно укажите сборку только для устройств с помощью флага --target-device iphone
  2. Убедитесь, что ваши зависимости содержат правильные срезы архитектур
  3. Настройте параметры сборки вашего модуля для архитектур только для устройств
  4. Рассмотрите возможность создания универсальных фреймворков, включающих как срезы симулятора, так и устройства

Следуя этим шагам, вы должны успешно собирать ваш модуль Titanium iOS с внешними зависимостями, даже при нацеливании на физические устройства. Помните, что правильная настройка архитектур имеет решающее значение при работе с фреймворками и пакетами в модулях Titanium.