Cocoa检查函数是否存在

时间:2013-06-19 13:51:36

标签: objective-c xcode macos cocoa

我想使用仅在OS X 10.9上可用的功能,但不使用10.9 SDK进行编译。这可能吗?

我尝试过弱链接,但编译器只是发出了一个错误,即函数没有定义。

4 个答案:

答案 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所描述的方法简单得多,你认为它是正确的。

相关问题