因为这些框架不再在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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)