Как импортировать частный фреймворк в Xcode 8.3, не получая "Неопределенные символы для архитектуры arm64"
Я пытаюсь использовать _CDBatterySaver, чтобы включить режим низкого энергопотребления, просто используя
[[_CDBatterySaver batterySaver] setMode:1];
Я знаю, что нет такого же типа каталогов, как в предыдущем Xcode, поэтому эти методы не работают.
Я также попытался просто импортировать файл ".h", но это не работает.
Он является частью инфраструктуры CoreDuet (загружается с GitHub)
Спасибо
3 ответа
Вам понадобится .tbd
файл для ссылки.
Apple прекратила поставлять их для частных платформ, начиная с iOS 9.3 SDK, но вы можете сгенерировать их самостоятельно, приложив немного усилий:
- Получите IPSW для какой-то недавней версии iOS ( https://ipsw.me/ или вики- страницы iPhone имеют хорошие списки).
- Разархивируйте IPSW и смонтируйте корневую файловую систему (
.dmg
это несколько ГБ). - Найдите кеш общей библиотеки для вашей архитектуры в
/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm*
, Используя один из различных инструментов (я предпочитаю jtool), извлеките
CoreDuet
из него, например:jtool -e CoreDuet /path/to/dyld_shared_cache
Необязательно: Выполните шаг 4 для нескольких архитектур, затем объедините извлеченные файлы в толстый двоичный файл:
lipo -output CoreDuet dyld_shared_cache_*.CoreDuet
Используя machotbd или мой собственный инструмент, tbdump notes, создайте
.tbd
файл из библиотеки / фреймворка, который вы только что извлекли, например:tbdump CoreDuet > CoreDuet.tbd
Примечания 1. Я написал это, так что я очевидно связан.
2. Это бета-версия, и в настоящее время она слишком усердна в отношении символов, даже печатая
те, которые он не должен - но пока он всегда работал хорошо для меня.Создайте структуру папок следующим образом:
some_path/ CoreDuet.framework/ CoreDuet.tbd
Либо добавьте CoreDuet.framework в ваши фреймворки в XCode, либо используйте следующие флаги компилятора:
-Fsome_path -framework CoreDuet
Прибыль.
Кроме того, если шаги 1-6 слишком хлопотны для вас, и вам просто нужно _CDBatterySaver
символ, то вы можете просто использовать это для вашего CoreDuet.tbd
и покончим с этим:
---
archs: [ armv7, armv7s, arm64 ]
platform: ios
install-name: /System/Library/PrivateFrameworks/CoreDuet.framework/CoreDuet
exports:
- archs: [ armv7, armv7s, arm64 ]
objc-classes: [ __CDBatterySaver ]
...
Там есть официальный инструмент для генерации .tbd
файлы в эти дни, tapi
(Текстовый API). Не уверен, когда он был выпущен точно, но это было по крайней мере столько же, сколько Xcode 9.
Для генерации .tbd
для двоичного файла вы делаете что-то вроде следующего. Здесь я использую приватную SafariShared.framework для OSX. Если вам нужно .tbd
для платформы iOS вам нужно будет следовать началу ответа Siguza, чтобы получить двоичный файл, но в остальном этот процесс будет работать остальным.
Создайте пустой каталог для заглушки фреймворка с именем, например, "SafariShared.framework":
$ md SafariShared.framework
Запустите команду, подобную следующей, чтобы сгенерировать заглушку:
$ xcrun tapi stubify -o SafariShared.framework/SafariShared.tbd /System/Library/PrivateFrameworks/SafariShared.framework/SafariShared
-o
Аргумент - это выходной файл, а последний аргумент - это путь к двоичному файлу (обратите внимание, что это не путь к.framework
сам; вы получите ошибку, если вы это сделаете). Замените оба при необходимости.Есть одна потенциальная ловушка. Заглушки могут содержать список программ, которым разрешено связываться с этим двоичным файлом, и если ваша программа не указана в этом списке, компоновщик завершится ошибкой. Откройте
.tbd
в вашем любимом текстовом редакторе найдите строки вроде следующего:allowable-clients: [ <a bunch of bundle IDs>, ... ]
Удалите все из них (их может не быть) и сохраните файл.
Теперь ты в порядке! Заглушка .framework
каталог, который вы создали в шаге 1, будет работать так же, как реальный фреймворк в Xcode. В общих настройках вашего проекта XCode вы можете нажать "плюс" в "Связанных фреймворках и библиотеках" и добавить каталог-заглушку.
(Возможно, вам также придется добавить каталог, содержащий заглушку .framework
к настройке проекта "Framework Search Paths". Кажется неясным, произойдет ли это автоматически.)
На основании ответа Siguza
Более новые версии Xcode используют tbd v2
формат. Вот .tbd
Заглушка, которая будет компилироваться с последней версией Xcode.
--- !tapi-tbd-v2
archs: [ armv7, armv7s, arm64 ]
uuids: [ 'armv7: CBD84526-2D11-4CF3-83A7-4408DA532D3E', 'armv7s: 37ACF720-FA66-4B2D-8411-09D0B607E1A0',
'arm64: 19F91B79-9FA2-4944-9E68-3E632C938AE3' ]
platform: ios
install-name: /System/Library/PrivateFrameworks/CoreDuet.framework/CoreDuet
objc-constraint: none
exports:
- archs: [ armv7, armv7s, arm64 ]
objc-classes: [ __CDBatterySaver ]
objc-ivars: [ __CDBatterySaver._connection ]
...