Невозможно использовать XCFramework на watchOS

Я разрабатываю приложение для iOS, которое использует отдельный SDK для некоторой общей бизнес-логики. Этот SDK разработан в другом отдельном проекте, который на выходе создает динамическую двоичную структуру. Тип пакета этой структуры - XCFramework, который Apple предложила использовать, начиная с Xcode 11. Содержимое этой XCFramework следующее:

MySDK.xcframework
├── Info.plist
├── ios-arm64
│   └── MySDK.framework
│   ├── Headers
│   │   ├── MySDK.h
│   │   ├── ...
│   ├── Info.plist
│   ├── Modules
│   │   └── module.modulemap
│   ├── MySDK
│   └── _CodeSignature
│   └── CodeResources
├── ios-x86_64-simulator
│   └── MySDK.framework
│   ├── Headers
│   │   ├── MySDK.h
│   │   ├── ...
│   ├── Info.plist
│   ├── Modules
│   │   └── module.modulemap
│   ├── MySDK
│   └── _CodeSignature
│   └── CodeResources
└── watchos-armv7k_arm64_32
    └── MySDK.framework
    ├── Headers
    │   ├── MySDK.h
    │   ├── ...
    ├── Info.plist
    ├── Modules
    │   └── module.modulemap
    ├── MySDK
    └── _CodeSignature
    └── CodeResources

Если я использую XCFramework на цели iOS, все работает, как ожидалось, и, просто импортировав модуль MySDK, я могу использовать SDK без каких-либо проблем.

Однако, если я импортирую ту же платформу в цель Watch Extension и запускаю ее в реальном iWatch, это дает нам следующую ошибку:

Детали

Unable to install "Watch"
  Domain: com.apple.dt.MobileDeviceErrorDomain
  Code: -402620393
  --
  A signed resource has been added, modified, or deleted.
  Domain: com.apple.dt.MobileDeviceErrorDomain
  Code: -402620393
  User Info: {
    DVTRadarComponentKey = 364477;
    MobileDeviceErrorCode = "(0xE8008017)";
    "com.apple.dtdevicekit.stacktrace" = (
    0 DTDeviceKitBase 0x000000011ff4681a DTDKCreateNSErrorFromAMDErrorCode + 233
    1 DTDeviceKitBase 0x000000011ff87f70 __90-[DTDKMobileDeviceToken installApplicationBundleAtPath:withOptions:andError:withCallback:]_block_invoke + 155
    2 DVTFoundation 0x000000010697e385 DVTInvokeWithStrongOwnership + 73
    3 DTDeviceKitBase 0x000000011ff87ca8 -[DTDKMobileDeviceToken installApplicationBundleAtPath:withOptions:andError:withCallback:] + 1654
    4 IDEiOSSupportCore 0x000000011fdfee91 __118-[DVTiOSDevice(DVTiPhoneApplicationInstallation) processAppInstallSet:appUninstallSet:installOptions:completionBlock:]_block_invoke.352 + 4165
    5 DVTFoundation 0x0000000106ab1a10 __DVT_CALLING_CLIENT_BLOCK__ + 7
    6 DVTFoundation 0x0000000106ab3652 __DVTDispatchAsync_block_invoke + 1194
    7 libdispatch.dylib 0x00007fff729b6583 _dispatch_call_block_and_release + 12
    8 libdispatch.dylib 0x00007fff729b750e _dispatch_client_callout + 8
    9 libdispatch.dylib 0x00007fff729bcace _dispatch_lane_serial_drain + 597
    10 libdispatch.dylib 0x00007fff729bd452 _dispatch_lane_invoke + 363
    11 libdispatch.dylib 0x00007fff729c6a9e _dispatch_workloop_worker_thread + 598
    12 libsystem_pthread.dylib 0x00007fff72c116fc _pthread_wqthread + 290
    13 libsystem_pthread.dylib 0x00007fff72c10827 start_wqthread + 15
  );
}

--

System Information

macOS Version 10.15.3 (Build 19D76)
Xcode 11.4 (16134)

Цель SDK скомпилирована для архитектуры watchOS, так как вы, ребята, можете видеть соответствующую папку в ее содержимом (watchos-armv7k_arm64_32). Кроме того, я убедился, что он был правильно скомпилирован с помощью инструмента LIPO.

Что я пробовал:

  • Следите за связанными проблемами здесь, здесь и здесь, но безуспешно.
  • Дублируйте XCFramework только с архитектурой наблюдения и включите обе платформы в проект, но нацеленные на разные места назначения. Тоже не работает.
  • Попробуйте все варианты встраивания фреймворка: "Вставить и подписать" или "Вставить без подписи". Это дает ошибку, показанную выше.

Я немного растерялся и не знаю, что еще я мог бы попробовать. Любой, кто сможет пролить свет на это, будет очень признателен.

1 ответ

Я решил ту же проблему, создав пользовательскую структуру с staticlib Тип Mach-O:

  1. Откройте настройки проекта вашей пользовательской платформы (например, MySDK).
  2. Выберите цель для watchOS.
  3. Найдите тип Mach-O и установите для него значение Static Library. Тип Mach-O: Статическая библиотека
  4. Создавайте фреймворки и xcframework.

Теперь вы можете связать свое приложение с MySDK.xcframework. Не встраивайте xcframework для цели watchOS в приложение - она ​​должна быть связана статически.

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