在 Xcode ≥ 7.3 中处理私有框架

2024-01-03

在 Xcode 7.3 / iOS 9.3 中,Apple 删除了所有私有框架 https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html来自 iOS SDK。出于研究目的(不是 App Store!),我需要使用私有框架(即BluetoothManager.framework,但这对于任何其他人来说也是一个问题private构架)。

由于这些框架不再在 iOS SDK 中提供,因此如果我的项目尝试显式链接到此框架,我会收到构建(链接器)错误。

对于长期解决方案有什么想法吗?


可以通过链接私有框架来解决这个问题动态地,而不是更常见的链接方式构建时间。在构建时,BluetoothManager.framework 需要存在于您的开发 Mac 上,以便链接器能够使用它。通过动态链接,您可以将进程推迟到运行时。在设备上,iOS 9.3 仍然存在该框架(当然还有其他框架)。

以下是您可以修改项目的方法Github https://github.com/michaeldorner/BeeTee:

1) 在 Xcode 的 Project Navigator 中的 Frameworks 下,删除对 BluetoothManager.framework 的引用。无论如何,它可能显示为红色(未找到)。

2)项目下构建设置,您将旧的私有框架目录明确列为框架搜索路径。删除它。如果您找不到“PrivateFrameworks”,请在构建设置中搜索它。

3) 确保添加您需要的实际标头,以便编译器理解这些私有类。我相信你可以获得当前的标题例如这里 https://github.com/nst/iOS-Runtime-Headers/tree/master/PrivateFrameworks/BluetoothManager.framework。即使框架从 Mac SDK 中删除,我相信这个人也使用过类似的工具运行时浏览器 https://github.com/nst/RuntimeBrowser在设备上生成头文件。根据您的情况,将BluetoothManager.h 和BluetoothDevice.h 标头添加到Xcode 项目中。

3a) Note:生成的标头有时无法编译。我不得不评论一些struct上面的 typedef运行时浏览器标头 https://github.com/nst/iOS-Runtime-Headers/tree/master/PrivateFrameworks/BluetoothManager.framework为了让项目建成。下面是哈蒂普@Alan_s。

4) 更改您的导入:

#import <BluetoothManager/BluetoothManager.h>

to

#import "BluetoothManager.h"

5) 在使用私有类的地方,您需要首先动态地打开框架。为此,请使用(在 MDBluetoothManager.m 中):

#import <dlfcn.h>

static void *libHandle;

// A CONVENIENCE FUNCTION FOR INSTANTIATING THIS CLASS DYNAMICALLY
+ (BluetoothManager*) bluetoothManagerSharedInstance {
   Class bm = NSClassFromString(@"BluetoothManager");
   return [bm sharedInstance];
}

+ (MDBluetoothManager*)sharedInstance
{
   static MDBluetoothManager* bluetoothManager = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      // ADDED CODE BELOW
      libHandle = dlopen("/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager", RTLD_NOW);
      BluetoothManager* bm = [MDBluetoothManager bluetoothManagerSharedInstance];
      // ADDED CODE ABOVE
      bluetoothManager = [[MDBluetoothManager alloc] init];
   });
   return bluetoothManager;
}

我拨打了电话至dlopen在您的单例方法中,但您可以将其放在其他地方。只需要调用它before任何代码都使用私有 API 类。

我添加了一个方便的方法[MDBluetoothManager bluetoothManagerSharedInstance]因为你会反复调用它。当然,我确信您可以找到替代的实现。重要的细节是这个新方法使用动态实例化私有类NSClassFromString().

6) 任何你直接调用的地方[BluetoothManager sharedInstance],将其替换为新的[MDBluetoothManager bluetoothManagerSharedInstance] call.

我使用 Xcode 7.3 / iOS 9.3 SDK 对此进行了测试,您的项目在我的 iPhone 上运行良好。

Update

由于似乎存在一些混乱,因此相同的技术(和确切的代码)仍然适用于 iOS 10.0-11.1(截至撰写本文时)。

此外,强制加载框架的另一个选项是使用[NSBundle bundleWithPath:]代替dlopen()。但请注意路径上的细微差别:

handle = dlopen("/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager", RTLD_NOW);
NSBundle *bt = [NSBundle bundleWithPath: @"/System/Library/PrivateFrameworks/BluetoothManager.framework"];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Xcode ≥ 7.3 中处理私有框架 的相关文章

  • Swift 3:将 UIButton 扩展添加到 ViewController

    我是 iOS Swift 的初学者 尝试创建一个没有 Storyboard 的简单应用程序 我创建了一个UIButton扩展名 我想在我的视图中添加一个简单的按钮 稍后将设置约束 不幸的是 该按钮不可见 如果有人帮助我 我将不胜感激 谢谢你
  • 检测 AVPlayerViewController 是否正在播放视频或正在缓冲并向播放器添加覆盖

    我必须检测视频是否处于播放模式或缓冲模式 我正在从 URL 加载视频 我已经尝试了下面的代码 我可以在视频开始播放后进行跟踪 但不能在视频处于缓冲状态时进行跟踪 另外 我想在我的播放器中添加覆盖视图 我尝试在 AVPlayer 中添加叠加层
  • 在 IOS 设备上制作动画时,2 个相互堆叠的动画元素会发生变化(z 索引位置)吗?

    JSFIDDLE http fiddle jshell net 6gdrQ 18 我有 2 个动画元素 一种是简单的旋转脚本 它像硬币一样旋转徽标的中间部分 另一个动画是中间部分翻转时您看到的徽标后面的粒子画布烟雾动画 我遇到的问题是画布烟
  • 如何在 swift 3 中发布原始数据?

    如果我使用 Postman 发布原始数据 就会收到响应 我正在使用这个代码 var dict Dictionary
  • Swift 和 Objective-C 框架公开其内部结构

    我正在尝试将 Swift 添加到具有公共 私有和项目文件的现有 Objective C 框架中 为了让 Swift 能够访问项目文件 我添加了一个定义新模块的模块映射 例如MyFramework Internal 通过包含所有项目标题 如下
  • 外围 BLE 设备的唯一标识符

    所以我有外围设备BLE设备 我需要一些标识符以便稍后与另一部 iPhone 共享 我连接的示例iPhone A 为外围设备 iPhone A 将外围设备的标识符保存到数据库中 稍后我可以轻松获取iPhone B 并连接到通过该标识符找到的外
  • 记录使用 OpenAL 播放的样本

    我在 iOS 上使用 OpenAL 同时播放 9 个循环 为了使循环 100 同步 它们开始在不同的线程上运行 有关使用 OpenAL 记录正在播放的内容的任何指示 教程 如果我使用不同的线程 我会遇到录制问题吗 iOS 上的 OpenAL
  • UICollectionView 项目顺序在从右到左语言中不颠倒

    我注意到一个大问题 在从右到左的语言中 单元格顺序没有正确颠倒 只有对齐是正确的 但仅适用于水平流布局 并且如果集合视图包含不同的细胞大小 是的 我知道这听起来很疯狂 如果所有单元格大小相同 则排序和对齐就很好 这是到目前为止我通过示例应用
  • 在 Alamofire 中快速发送 GET 请求中的 json 对象

    我正在尝试执行一个绑定了 json 对象的 GET 请求 这就是我生成 JSON 对象的方式 let jsonObject String AnyObject ean code type match value 16743799 然后我执行了
  • 平板电脑在第一次单击时悬停,在第二次单击时单击

    发布这个问题主要是希望证实我对该行为的怀疑 从而为其他程序员记录下来 因为我在网上没有找到任何记录 我正在构建一个网站 其导航栏具有以下属性 水平截面是 ul of li 和一些 li li s 两者都有 A n a 元素带您进入该主题 触
  • scrollToRowAtIndexPath:atScrollPosition:动画滚动太慢

    基于分页 UIScrollView 的页面更改 我正在调用scrollToRowAtIndexPath atScrollPosition animated到所显示的该页面的表详细信息 void scrollViewDidScroll UIS
  • 即席分发失败

    我在一家大公司工作 正在开发一个适用于 iOS 5 的 iOS 应用程序 分发应用程序的唯一方式是通过临时部署 我拥有自己的服务器已经有一段时间了 由 o2switch 法国托管商 托管 当我开始开发时 我们使用它来部署应用程序以进行 Be
  • 错误:模块是为不兼容的目标arm64-apple-ios8.0创建的

    有一个名为 Appetize 的网站 需要 app 捆绑包 应用程序的 iOS 模拟器版本 才能在在线模拟器中显示您的应用程序 以下是所需应用程序包的指南 https support appetize io help how to uplo
  • Xcode 6.3 Parse SDK 1.7.1 PFTableViewCell 错误“具有不兼容的类型”

    My code override func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath object PFObject gt PFT
  • 处理核心数据中的重复条目

    我有一个允许用户保存收藏夹的应用程序 我正在使用 Core Data 将收藏夹存储为托管对象 我已经编写了一些代码来防止存储重复项的可能性 但我想知道是否有更好的方法来做到这一点 每个收藏夹对象都有一个唯一的 ID 字段 在下面的代码中 我
  • 使用导航控制器在 Storyboard 中呈现视图控制器 - Swift

    我目前在下面的新故事板中显示了一个 viewController var storyboard UIStoryboard UIStoryboard name AccountStoryboard bundle nil var vc Welco
  • 连接到 Apple Music

    所以我尝试使用 React Native 应用程序从 iOS 设备连接到 Apple Music 有一个 API 可以执行相同的操作 但我需要从 storekit 框架调用一个函数 提出个性化请求 苹果音乐API https develop
  • 为什么 iOS 5.0 不喜欢纯窗口应用程序?为什么它要求使用视图控制器?

    我有一个使用 Xcode 4 0 的 基于窗口的应用程序 模板创建的 iOS 应用程序 当时运行良好 并且使用的是 iOS 4 3 SDK 这是一个简单地将按钮 标签等直接放置到窗口上的应用程序 没有视图控制器 什么都没有 但现在我已经升级
  • 获取 Swift 子目录中资源的所有 URL

    我正在尝试为 iOS 应用程序的子目录中的所有资源创建 URL 数组 我似乎无法到达正确的路径 即使我不知道名称 我也希望能够检索 URL 即我不想将文件名硬编码到代码中 Below is a screen shot of the hier
  • 如何正确使用 nsoperationqueue 的 autoreleasepool

    我有一个正在重构的应用程序 我刚刚实现了多线程 以便 UI 可以运行得更流畅 在 iPhone 模拟器中 我没有遇到任何泄漏 但在运行 iOS 4 2 的 iPhone 3G 上进行测试时 出现了内存泄漏 我已经做了很多搜索来使用操作队列实

随机推荐

  • 如何在不更改 kubernetes 中部署 yaml 的情况下滚动重启 Pod?

    在 kubernetes 中 有滚动更新 自动无停机 但没有滚动重启 至少我找不到 我们必须更改部署 yaml 有没有办法让滚动 重新启动 最好不更改部署yaml 在 kubernetes 1 15 之前 答案是否定的 但是有一种解决方法可
  • SlimDX:在 Visual Studio 2010 中无法看到 Direct3D 调试输出

    我已经安装了 2010 年 6 月的 SDK 在 DirectX 控制面板中启用调试运行时 将调试输出级别设置为最大 更多 启用非托管代码调试 结果 Direct3D 的调试输出丢失 但是 如果我从外部启动应用程序并使用 dbgview e
  • 如何在 ActiveAdmin 上过滤布尔列?

    这个问题与活动管理员 https github com gregbell active admin宝石 我正在尝试过滤具有布尔类型的列 但没有成功 filter column name and filter column name as g
  • 用json、python保存键为元组的字典

    我正在用 python 编写一个小程序 并且使用一个字典 其 如标题所示 键和值是元组 我尝试使用 json 如下 import json data 1 2 3 a b c 2 6 3 6 3 2 print json dumps data
  • -D_DEFAULT_SOURCE 的作用是什么?

    之前我收到过来自gcc std c99 that usleep 被隐含地声明了 然后我偶然发现这个 stackoverflow 帖子 https stackoverflow com a 10053817 2002146 这导致我使用 D B
  • 整数真常数的类型是什么?

    很抱歉问了一个非常基本的问题 考虑以下示例 const c1 1 Is this Byte or ShortInt c2 1234 Is this Word or Smallint c3 123456 Is this Cardinal or
  • C# - 如何使用自定义字体而不将其安装在系统中

    我再次需要你的帮助 我正在 C 上开发一个使用自定义字体的小型应用程序 问题是 字体必须预先安装在系统上 如果系统中不存在该字体 则仅使用 Times New Roman 有没有什么方法可以将字体文件嵌入到应用程序中 这样就不需要在每个系统
  • Vue 或 Axios 不存储会话 cookie

    我遇到了问题 但我不知道问题出在哪里以及为什么 我有一个基于express4 nodejs 的后端API我们已经使用护照实现了Auth 当我使用邮递员时 我使用 login 上的 post 进行登录 它存储一个会话 cookie 并且所有路
  • JavaScript 无法找到元素 id

    我的 javascript 函数位于 javascript 文件中 因为该函数使用了我页面的大部分内容 function setSecondaryItem var select document getElementById var len
  • 从字符串创建 Pandas DataFrame

    为了测试一些功能我想创建一个DataFrame来自字符串 假设我的测试数据如下 TESTDATA col1 col2 col3 1 4 4 99 2 4 5 200 3 4 7 65 4 3 2 140 将数据读入 Pandas 的最简单方
  • _declspec 和 __declspec 之间的区别?

    我有时会看到关键字以两个下划线开头 有时则只有一个 有什么区别吗 我相信 declspec是同一 Microsoft 特定关键字的旧名称 declspec 从 C 标准的角度来看 对于这样的扩展 两个下划线比单个下划线更正确 根据 17 4
  • 创建或附加到字典中的列表 - 可以缩短吗?

    可以使用 itertools 和 set 缩短此 Python 代码并仍然可读吗 result for widget type app in widgets if widget type not in result result widge
  • 如何在某种条件下跳过第一个活动

    我正在将一组应用程序构建为类似于 MS Office 的包 这里每个应用程序都有自己的启动器 并且可以从家庭应用程序内部启动 每个应用程序都有一个登录页面 当应用程序从 android 启动器启动时 我需要显示登录页面 而从家庭应用程序启动
  • 如何以编程方式强制停止应用程序 - Android

    我想从我的 Android 应用程序中强制停止应用程序 而不是通过 Man apps gt force stop 手动执行 如何实现这一目标 Process killProcess Process myPid
  • 在 CSS 缩放画布中获取正确的鼠标位置

    我一直在尝试采用几个简单的 MooTools 操作的逻辑并将其转换为与 jQuery 一起使用 我想要的逻辑是这样的jsfiddle http jsfiddle net rQkSF 它允许通过 css 调整大小来获得画布元素上准确的鼠标位置
  • 如何绘制宽度不等的直方图而不从原始数据计算?

    Matplotlib 的hist http matplotlib org api pyplot api html matplotlib pyplot hist说 计算并绘制 x 的直方图 我想做一个情节without首先计算任何东西 我有箱
  • iOS10 中的动画导航栏 barTintColor 更改不起作用

    我升级到 XCode 8 0 iOS 10 现在导航栏的颜色变化动画不再起作用 它直接改变颜色 没有任何动画 UIView animateWithDuration 0 2 animations self navigationControll
  • 如何在android中获取设备的最大宽度和高度

    您好 我在为 Android 应用程序创建自定义视图时遇到问题 如果允许 我的自定义视图想要使用最大屏幕宽度 我找不到任何方法来检索该值 有人能指出我正确的方法吗 Try mWinMgr WindowManager context getS
  • a 的 b 次方,不带 (a**b),Python

    正在努力完成一项要求我在没有此运算符的情况下编写 a b 的练习 尝试自己写一些东西 但没有得到正确的结果 我得到的不是一个值 而是两个 两者都不正确 看起来计数器并没有真正增加 我可以寻求帮助吗 谢谢 def powerof base e
  • 在 Xcode ≥ 7.3 中处理私有框架

    在 Xcode 7 3 iOS 9 3 中 Apple 删除了所有私有框架 https developer apple com library ios releasenotes DeveloperTools RN Xcode Chapter