3 votes

Vérifiez si la fonction Cocoa existe

Je voudrais utiliser une fonction qui n'est disponible que sur OS X 10.9, mais SANS compiler avec le SDK 10.9. Est-ce possible?

J'ai essayé le lien faible, mais le compilateur renvoie simplement une erreur indiquant que la fonction n'est pas définie.

4voto

CRD Points 21578

Vous dites que vous ne voulez pas compiler contre 10.9, mais ne donnez aucune raison. Juste au cas où vous le pouvez:

Si vous définissez votre cible sur 10.9 et votre déploiement sur quelque chose de plus bas, alors Xcode liera faiblement les frameworks 10.9. Vous pouvez ensuite tester si une fonction C est disponible en comparant son nom à NULL. Ce fragment est tiré de ce document:

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

int main()
{
   int result = 0;

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

   return result;
}

(BTW: pas de problèmes de sandbox de cette façon.)

3voto

Richard J. Ross III Points 33152

En supposant que vous parlez d'une fonction C, vous pouvez le faire avec la fonction dlopen:

#include 

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);
}

Sortie:

2013-06-20 12:43:13.510 TestProj\[1699:303\]  \[ (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Profile)\] ( 0 1 )

Vous devrez d'abord trouver la dylib dans laquelle réside la fonction que vous voulez.

Ceci va contourner les limitations de sandbox sur iOS, et probablement aussi sur Mac. C'est le prix à payer pour essayer de contourner le linker.

0voto

lukaswelte Points 1737

Si vous travaillez avec des méthodes Objective-C, peut-être pourriez-vous le faire avec des sélecteurs... Alors vérifiez d'abord si le sélecteur est disponible avec :

[object respondsToSelector:@selector(osxMavericksFun)]

Et si ce test est correct, essayez de déclencher la méthode via les sélecteurs

[object performSelector:@selector(osxMavericksFun)];

S'il s'agit d'appeler des fonctions en C, il n'y a pas de moyen de le faire.

0voto

Vladimir Prudnikov Points 2106

Vous devriez le faire comme ceci

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

Cette méthode est décrite dans la documentation d'Apple Listing 3-2. Elle est beaucoup plus simple que la méthode décrite par Richard J. Ross III que vous avez acceptée comme correcte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X