2013-06-19 138 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所描述的方法簡單得多,你接受的是正確的。