因为这些框架不再在iOS SDK中传递,如果我的项目试图明确地链接到这个框架,我会收到一个构建(链接器)错误.
任何长时间(呃)-term解决方案的想法?
解决方法
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.