ios – 处理Xcode中的私有框架≥7.3

ios – 处理Xcode中的私有框架≥7.3,第1张

概述来自iOS SDK的 With Xcode 7.3 / iOS 9.3 Apple removed all private frameworks.为了研究目的(而不是App Store!),我需要使用一个私有框架(即BluetoothManager.framework,但这也是任何其他私有框架的一个问题). 因为这些框架不再在iOS SDK中传递,如果我的项目试图明确地链接到这个框架,我会收到一个 来自iOS SDK的 With Xcode 7.3 / iOS 9.3 Apple removed all private frameworks.为了研究目的(而不是App Store!),我需要使用一个私有框架(即BluetoothManager.framework,但这也是任何其他私有框架的一个问题).

因为这些框架不再在iOS SDK中传递,如果我的项目试图明确地链接到这个框架,我会收到一个构建(链接器)错误.

任何长时间(呃)-term解决方案的想法?

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

以下是您可以在Github修改您的项目的方法:

1)在Xcode的Project Navigator中,在框架下,删除对BluetoothManager.framework的引用.这可能是红色的(没有找到).

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

3)确保添加所需的实际头文件,因此编译器可以理解这些私有类.我相信你可以得到当前的标头here for example.即使框架从Mac SDK中删除,我相信这个人在设备上使用了像Runtime Browser这样的工具来生成头文件.在您的情况下,将BluetoothManager.h和BluetoothDevice.h标头添加到Xcode项目中.

3a)注意:生成的标头有时不编译.我不得不在上述Runtime Browser headers中注释掉一些结构typedefs,以获得项目的构建. Hattip @Alan_s在下面.

4)从

#import <BluetoothManager/BluetoothManager.h>

#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,但你可以把它放在别处.只需要在任何代码使用私有API类之前调用​​它.

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

6)您正在直接呼叫[BluetoothManager sharedInstance]的地方,将其替换为新的[MDBluetoothManager bluetoothManagerSharedInstance]调用.

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

更新

由于似乎有一些混乱,同样的技术(和确切的代码)仍然可以在iOS 10.0-10.1.

总结

以上是内存溢出为你收集整理的ios – 处理Xcode中的私有框架≥7.3全部内容,希望文章能够帮你解决ios – 处理Xcode中的私有框架≥7.3所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1113209.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存