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; 一般的なグレー プロファイル)] ( 0 1 )
ただし、最初に、必要な関数が存在する dylib を把握する必要があります。
これにより、iOS および Mac のサンドボックスの制限が解除される可能性が高くなります。これは、リンカーを回避しようとするために支払う代償です。
Objective-C のメソッドを扱っている場合は、おそらくセレクターを使用して行うことができます。まず、セレクターが使用可能かどうかを確認します。
[object respondsToSelector:@selector(osxMavericksFun)]
そして、このテストが正しい場合は、セレクターを介してメソッドを起動してみてください
[object performSelector:@selector(osxMavericksFun)];
C関数を呼び出したい場合、これを行う方法はありません。
このようにすればいい
if (AXIsProcessTrustedWithOptions != NULL){
NSDictionary *options = @{(__bridge id)kAXTrustedCheckOptionPrompt: @YES};
accessibilityEnabled = AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef)options);
}else{
accessibilityEnabled = AXIsProcessTrusted();
}
このメソッドは、アップルのドキュメント Listing 3-2 で説明されています。これは、あなたが正しいと認めた Richard J. Ross III によって記述された方法よりもはるかに簡単です。