2013-06-19 121 views
3

我想使用仅在OS X 10.9上可用的函数,但不需要使用10.9 SDK进行编译。那可能吗?可可检查函数是否存在

我试过弱链接,但编译器只是给出了该函数没有定义的错误。

+0

等待 - 这是一种功能还是方法。这两者非常不同。 –

+1

这是一个C函数(AXIsProcessTrustedWithOptions),它只能在10.9上使用。 – bogdansrc

回答

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中的作用不过,首先你要居住。

This will打破了iOS和Mac上的沙盒限制。这是您尝试解决链接器所付出的代价。

+0

任何想法,我可以找到/系统/库/框架/应用程序服务框架/版本/当前/框架作品/ HIServices.framework /版本/当前/ HIServices dylib? – bogdansrc

+0

@bogdansrc yup,用框架中的符号更新了我的答案。 –

+0

确认:它工作得很好:)非常感谢! – bogdansrc

0

如果你处理的Objective-C的方法,也许你可以用选择做吧.. 所以首先检查是否选择可用:

[object respondsToSelector:@selector(osxMavericksFun)] 

如果这个测试是正确的尝试发射的通过选择器的方法

[object performSelector:@selector(osxMavericksFun)]; 

如果您想调用c函数,则无法执行此操作。

+0

这个问题是关于函数,而不是方法。 – bogdansrc

+0

那么,如果可以提供的话,你想打电话到底是什么? – lukaswelte

+0

有没有办法做到这一点..你将需要建立在10.9上使用10.9的功能,实际上,使用dlopen/dlsym你可以做到这一点,如果你想要的10.9 – lukaswelte

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; 
} 

(顺便说一句:没有沙箱问题,这种方式)。

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所描述的方法简单得多,你接受的是正确的。