如何在Xcode 8.3中导入一个私有框架,而不会得到“架构arm64的未定义符号”

我正在尝试使用_CDBatterySaver打开低功耗模式

[[_CDBatterySaver batterySaver] setMode:1]; 

我知道有没有以前的Xcode相同types的目录,所以这些方法不起作用。

我也试过只导入“.h”文件,但不起作用。

它是CoreDuet框架的一部分(从GitHub下载)

谢谢

您将需要一个.tbd文件来链接。

苹果公司停止从iOS 9.3 SDK开始提供这些私人框架,但你可以自己生成一些:

  1. 为最近的iOS版本获得一个IPSW( ipsw.me或者iPhone wiki有很好的列表)。
  2. 解压缩IPSW并挂载根文件系统(多GB的.dmg )。
  3. /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm*find您的架构的共享库caching。
  4. 使用各种工具之一 (我更喜欢jtool ),从它提取CoreDuet ,例如:

     jtool -e CoreDuet /path/to/dyld_shared_cache 
  5. 可选:为多个体系结构执行第4步,然后将提取的文件合并到一个胖二进制文件中:

     lipo -output CoreDuet dyld_shared_cache_*.CoreDuet 
  6. 使用machotbd或我自己的工具, tbdump 笔记 ,从刚刚提取的库/框架中创build一个.tbd文件,例如:

     tbdump CoreDuet > CoreDuet.tbd 

    笔记 1.我写了,所以我显然是附属的。
    2.这是一个testing版,它现在有点过分热心的符号,甚至打印
    那些它不应该 – 但到目前为止,它一直工作得很好。

  7. 像这样创build一个文件夹结构:

     some_path/ CoreDuet.framework/ CoreDuet.tbd 
  8. 将CoreDuet.framework添加到XCode中的框架中,或者使用这些编译器标志:

     -Fsome_path -framework CoreDuet 
  9. 利润。

此外,如果步骤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 ] ...