我想使用仅在 OS X 10.9 上可用但不使用 10.9 SDK 编译的功能。那可能吗?
我已经尝试过弱链接,但编译器只是给出了一个函数未定义的错误。
我想使用仅在 OS X 10.9 上可用但不使用 10.9 SDK 编译的功能。那可能吗?
我已经尝试过弱链接,但编译器只是给出了一个函数未定义的错误。
您说您不想针对 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;
}
(顺便说一句:这种方式没有沙盒问题。)
假设您正在谈论 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 上的沙盒限制。这是您试图绕过链接器所付出的代价。
你应该这样做
if (AXIsProcessTrustedWithOptions != NULL){
NSDictionary *options = @{(__bridge id)kAXTrustedCheckOptionPrompt: @YES};
accessibilityEnabled = AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef)options);
}else{
accessibilityEnabled = AXIsProcessTrusted();
}
这个方法在苹果的文档清单 3-2中有描述。它比您认为正确的 Richard J. Ross III 描述的方法要简单得多。
如果你正在处理 Objective-C 方法,也许你可以用选择器来做。所以首先检查选择器是否可用:
[object respondsToSelector:@selector(osxMavericksFun)]
如果此测试正确,请尝试通过选择器触发方法
[object performSelector:@selector(osxMavericksFun)];
如果您想调用 c 函数,则无法执行此操作。