我想使用仅在OS X 10.9上可用的功能,但不使用10.9 SDK进行编译。这可能吗?
我尝试过弱链接,但编译器只是发出了一个错误,即函数没有定义。
答案 0 :(得分:3)
假设您正在讨论C函数,可以使用dlopen
函数执行此操作:
#include <dlfcn.h>
int main() {
void *lib = dlopen("/System/Library/Frameworks/ApplicationServices.framework/ApplicationServices", RTLD_LAZY);
void *function = dlsym(lib, "CGColorGetConstantColor");
// cast the function to the right format
CGColorRef (*dynamic_getConstantColor)(CFStringRef colorName) = function;
NSLog(@"%@", dynamic_getConstantColor(CFSTR("kCGColorBlack")));
dlclose(lib);
}
输出:
2013-06-20 12:43:13.510 TestProj[1699:303] [ (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Profile)] ( 0 1 )
首先,你需要弄清楚你想要的功能所在的dylib。
这个将打破iOS和Mac上的沙盒限制。这是你试图绕过链接器所付出的代价。
答案 1 :(得分:3)
你说你不想编译10.9,但没有理由。以防你可以:
如果将目标设置为10.9并将部署设置为较低的值,那么Xcode将弱化链接10.9框架。然后,您可以通过将其名称与NULL
进行比较来测试可用的C函数。此片段取自this document:
extern int MyWeakLinkedFunction() __attribute__((weak_import));
int main()
{
int result = 0;
if (MyWeakLinkedFunction != NULL)
{
result = MyWeakLinkedFunction();
}
return result;
}
(顺便说一句:没有沙箱问题这样。)
答案 2 :(得分:0)
如果您正在处理Objective-C方法,也许您可以使用选择器来完成它。 因此,首先检查选择器是否可用:
[object respondsToSelector:@selector(osxMavericksFun)]
如果此测试正确,请尝试通过选择器触发方法
[object performSelector:@selector(osxMavericksFun)];
如果要调用c函数,则无法执行此操作。
答案 3 :(得分:0)
你应该这样做
if (AXIsProcessTrustedWithOptions != NULL){
NSDictionary *options = @{(__bridge id)kAXTrustedCheckOptionPrompt: @YES};
accessibilityEnabled = AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef)options);
}else{
accessibilityEnabled = AXIsProcessTrusted();
}
此方法在apple's documentation Listing 3-2中描述。它比Richard J. Ross III所描述的方法简单得多,你认为它是正确的。