ios - 如何在 Xcode 8.3 中导入私有(private)框架而不出现 "Undefined symbols for architecture arm64"

标签 ios xcode jailbreak iphone-privateapi

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

    [[_CDBatterySaver batterySaver] setMode:1];

我知道没有与以前的 Xcode 相同类型的目录,因此这些方法不起作用。

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

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

谢谢

最佳答案

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

从 iOS 9.3 SDK 开始,Apple 停止为私有(private)框架提供这些,但您可以通过一些努力自己生成它们:

  1. 获取最新 iOS 版本的 IPSW(ipsw.methe iPhone wiki 有不错的列表)。
  2. 解压 IPSW 并挂载根文件系统(.dmg,大小为多个 GB)。
  3. /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm* 中查找适合您的架构的共享库缓存。
  4. 使用one of various tools (我更喜欢 jtool ),从中提取 CoreDuet ,例如:

    jtool -e CoreDuet /path/to/dyld_shared_cache
    
  5. 可选:对多个架构执行步骤 4,然后将提取的文件合并为胖二进制文件:

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

    tbdump CoreDuet > CoreDuet.tbd
    

    注释 1. 我写了它,所以我显然有隶属关系。
    2. 这是一个测试版,目前对符号有点过于热衷,甚至打印
    那些不应该的 - 但到目前为止它对我来说一直工作得很好。

  7. 创建如下文件夹结构:

    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 ]
...

关于ios - 如何在 Xcode 8.3 中导入私有(private)框架而不出现 "Undefined symbols for architecture arm64",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43962260/

相关文章:

java - 检查一个字符串是否只有字母+空格?

php - JSON 请求发送空数据(swift)

ios - iPhone 上的 dyld API - 奇怪的输出

ios - 如何在越狱的 iOS 设备上截取整个屏幕?

iphone - 将应用程序置于前台

ios - 如何通过外观协议(protocol)设置 UIBarButtonItem 的 tintColor?

ios - 如何在长按上显示用户选择的表格 View 单元格

ios - 删除弹出 View Controller -swift

ios - 从 plist 加载的注释不显示

ios - 添加UIGesture的函数自动执行override函数中的button方法