如何在Xcode 8.3中导入一个私有框架,而不会得到“架构arm64的未定义符号”
我正在尝试使用_CDBatterySaver打开低功耗模式
[[_CDBatterySaver batterySaver] setMode:1];
我知道有没有以前的Xcode相同types的目录,所以这些方法不起作用。
我也试过只导入“.h”文件,但不起作用。
它是CoreDuet框架的一部分(从GitHub下载)
谢谢
您将需要一个.tbd
文件来链接。
苹果公司停止从iOS 9.3 SDK开始提供这些私人框架,但你可以自己生成一些:
- 为最近的iOS版本获得一个IPSW( ipsw.me或者iPhone wiki有很好的列表)。
- 解压缩IPSW并挂载根文件系统(多GB的
.dmg
)。 - 在
/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm*
find您的架构的共享库caching。 -
使用各种工具之一 (我更喜欢jtool ),从它提取
CoreDuet
,例如:jtool -e CoreDuet /path/to/dyld_shared_cache
-
可选:为多个体系结构执行第4步,然后将提取的文件合并到一个胖二进制文件中:
lipo -output CoreDuet dyld_shared_cache_*.CoreDuet
-
使用machotbd或我自己的工具, tbdump 笔记 ,从刚刚提取的库/框架中创build一个
.tbd
文件,例如:tbdump CoreDuet > CoreDuet.tbd
笔记 1.我写了,所以我显然是附属的。
2.这是一个testing版,它现在有点过分热心的符号,甚至打印
那些它不应该 – 但到目前为止,它一直工作得很好。 -
像这样创build一个文件夹结构:
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 ] ...
根据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 ] ...