HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 处理Xcode中的私有框架≥7.3大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
来自iOS SDK的 With Xcode 7.3 / iOS 9.3 Apple removed all private frameworks.为了研究目的(而不是App Store!),我需要使用一个私有框架(即BluetoothManager.framework,但这也是任何其他私有框架的一个问题).

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

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

解决方法@H_262_8@
您可以通过动态链接到私有框架来解决此问题,而不是在构建时更常见的连接方式.在构建时,蓝牙管理器框架将需要存在于您的开发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所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。