3

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

我已经尝试过弱链接,但编译器只是给出了一个函数未定义的错误。

4

4 回答 4

4

您说您不想针对 10.9 进行编译,但没有给出任何理由。以防万一你可以

如果您将目标设置为 10.9 并且您的部署设置为更低,那么 Xcode 将弱链接 10.9 框架。然后,您可以通过将其名称与NULL. 此片段取自此文档

extern int MyWeakLinkedFunction() __attribute__((weak_import));

int main()
{
   int result = 0;

   if (MyWeakLinkedFunction != NULL)
   {
      result = MyWeakLinkedFunction();
   }

   return result;
}

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

于 2013-06-20T04:04:33.043 回答
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;通用灰色配置文件)](0 1)

不过,您首先需要弄清楚您想要的函数所在的 dylib。

打破 iOS 和 Mac 上的沙盒限制。这是您试图绕过链接器所付出的代价。

于 2013-06-19T14:26:31.717 回答
0

你应该这样做

if (AXIsProcessTrustedWithOptions != NULL){
    NSDictionary *options = @{(__bridge id)kAXTrustedCheckOptionPrompt: @YES};
    accessibilityEnabled = AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef)options);
}else{
    accessibilityEnabled = AXIsProcessTrusted();
}

这个方法在苹果的文档清单 3-2中有描述。它比您认为正确的 Richard J. Ross III 描述的方法要简单得多。

于 2014-10-18T18:07:34.347 回答
0

如果你正在处理 Objective-C 方法,也许你可以用选择器来做。所以首先检查选择器是否可用:

[object respondsToSelector:@selector(osxMavericksFun)]

如果此测试正确,请尝试通过选择器触发方法

[object performSelector:@selector(osxMavericksFun)];

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

于 2013-06-19T14:01:34.957 回答