Я хотел бы использовать функцию, доступную только на OS X 10.9, но БЕЗ компиляции с 10.9 SDK. Это возможно?Проверка какао, если существует функция
Я пробовал слабое соединение, но компилятор просто выдает ошибку, что функция не определена.
Я хотел бы использовать функцию, доступную только на OS X 10.9, но БЕЗ компиляции с 10.9 SDK. Это возможно?Проверка какао, если существует функция
Я пробовал слабое соединение, но компилятор просто выдает ошибку, что функция не определена.
Предполагая, что вы говорите о функции 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, скорее всего, также. Это цена, которую вы платите за попытку обойти линкер.
Любая идея, где я мог бы найти dylib для /System/Library/Frameworks/ApplicationServices.framework/Versions/Current/Frame works/HIServices.framework/Versions/Current/HIServices? – bogdansrc
@bogdansrc yup, обновил мой ответ символом из фреймворка. –
Подтверждено: он работает очень хорошо :) Большое спасибо! – bogdansrc
Если вы имеете дело с методами Objective-C, может быть, вы могли бы сделать это с селекторами .. Так сначала проверьте, если селектор доступен с:
[object respondsToSelector:@selector(osxMavericksFun)]
И если этот тест является правильным попытаться стрельбой из Метод с помощью селекторов
[object performSelector:@selector(osxMavericksFun)];
Если вы хотите вызвать функции c, это невозможно.
Этот вопрос касается функций, а не методов. – bogdansrc
Итак, что именно вы хотите назвать, если оно будет доступно? – lukaswelte
Невозможно сделать это. Вам нужно будет построить 10.9 для использования функции c 10.9 – lukaswelte
Вы говорите, что не хотите компилироваться против 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: никаких проблем песочницы этот путь.)
Вы должны это сделать, как этот
if (AXIsProcessTrustedWithOptions != NULL){
NSDictionary *options = @{(__bridge id)kAXTrustedCheckOptionPrompt: @YES};
accessibilityEnabled = AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef)options);
}else{
accessibilityEnabled = AXIsProcessTrusted();
}
Этот метод описан в apple's documentation Listing 3-2. Это намного проще, чем метод, описанный Ричардом Дж. Росс III, который вы приняли как правильный.
Wait - это функция или способ. Эти два очень разные. –
Это функция C (AXIsProcessTrustedWithOptions), которая доступна только на 10.9. – bogdansrc