2013-06-19 5 views
3

Я хотел бы использовать функцию, доступную только на OS X 10.9, но БЕЗ компиляции с 10.9 SDK. Это возможно?Проверка какао, если существует функция

Я пробовал слабое соединение, но компилятор просто выдает ошибку, что функция не определена.

+0

Wait - это функция или способ. Эти два очень разные. –

+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, в котором функция вы хотите проживать, во-первых, хотя.

Это будет сломать ограничения на песочницу на iOS, а Mac, скорее всего, также. Это цена, которую вы платите за попытку обойти линкер.

+0

Любая идея, где я мог бы найти dylib для /System/Library/Frameworks/ApplicationServices.framework/Versions/Current/Frame works/HIServices.framework/Versions/Current/HIServices? – 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 для использования функции c 10.9 – lukaswelte

3

Вы говорите, что не хотите компилироваться против 10.9, но не дают никакой причины. На всякий случай может:

Если вы установили цель в 10.9 и ваше развертывание на что-то ниже, то Xcode будет слабо связывать рамки 10.9. Затем вы можете проверить, доступна ли функция C, сравнив ее имя с NULL. Этот фрагмент не берется из this document:

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

int main() 
{ 
    int result = 0; 

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

    return result; 
} 

(BTW: никаких проблем песочницы этот путь.)

0

Вы должны это сделать, как этот

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

Этот метод описан в apple's documentation Listing 3-2. Это намного проще, чем метод, описанный Ричардом Дж. Росс III, который вы приняли как правильный.