documentation macOS pour les structures dans Security.h

J’essaie d’utiliser le framework macOS Security.h via Java et JNA. Cela signifie que je dois reconstruire certaines structures en tant que classes Java.

Le problème est que, lorsque je regarde la documentation d’une structure ( celle-ci par exemple), je ne vois qu’une brève description de la structure sans aucune mention de ses champs. Où puis-je obtenir une description complète d’une structure dans la documentation d’Apple?

Pour un aperçu rapide, vous pouvez trouver les en-têtes sur le site open source d’Apple , mais il est difficile de naviguer, en particulier parce que les en-têtes se trouvent à des emplacements différents en fonction de la version du système d’exploitation que vous souhaitez vérifier. Dans tous les cas, j’ai trouvé que c’est défini dans SecBase.h . Par exemple, voici celui du dernier macOS .

Et là vous obtenez ceci:

 typedef struct CF_BRIDGED_TYPE(id) SECTYPE(SecKeychainItem) *SecKeychainItemRef; 

Donc vous aurez probablement besoin d’autres en-têtes pour retrouver les champs exacts de la structure. Une meilleure façon de procéder consiste à installer XCode avec des frameworks pour le système d’exploitation souhaité et vous obtiendrez les en-têtes sur votre système local. Par exemple:

 $ ls /Applications/Xcode.app/Contents/Developer/Platforms/*.platform/Developer/SDKs/*.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator9.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS2.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator2.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h 

Je n’ai pas une bonne solution avec les documents en ligne, cependant.

Un autre moyen, de mémoire, était plus utile pour recréer la structure en Java pour la JNA, serait de construire un programme C minimal (mais je ne suis pas sûr de savoir comment faire cela sur macOS, en liaison avec le framework de sécurité, peut-être vous et donnez-le à gdb pour imprimer la structure en utilisant ptype :

 (gdb) whatis v type = struct complex (gdb) ptype v type = struct complex { double real; double imag; } 

Mais comme noté dans les commentaires, si nous essayons ceci ici, nous obtenons ceci:

 (gdb) ptype SecKeychainItemRef type = struct OpaqueSecKeychainItemRef {  } 

J’ai bien peur que ce symbole soit volontairement rendu opaque … Confirmé par Brendan dans les commentaires:

chaque type de macOS auquel je pense qui se termine par Ref est un type opaque (en réalité un pointeur), uniquement destiné à être passé à des fonctions

Voici une session de débogage avec Xcode: Capture d'écran Xcode