Comment convertir Un Code OSStatus D'IPhone en quelque chose d'utile?

j'en ai plus qu'un peu marre de ce sdk iphone et de sa documentation...

J'appelle AudioConverterNew

dans la documentation sous Returns: it says "renvoie un code de statut" ... vraiment...

jusqu'à présent, en jouant avec les paramètres, Je n'ai pu obtenir que deux erreurs différentes dont aucune n'est listée au bas de la référence du Convertisseur Audio.

ils sont "mrep' et '?tmf' (le casting du OSStatus à un char array) mais les codes spécifiques ne sont pas vraiment au point.

autant que je puisse dire, les codes d'erreur aléatoires sont définis dans les fichiers aléatoires, donc vous ne pouvez pas simplement rechercher un fichier, je ne peux pas trouver un document d'aide qui vous permet juste de rechercher un code d'erreur pour obtenir plus d'informations, et de ce que je peux dire, dans OSX, vous pouvez utiliser GetMacOSStatusErrorString() pour convertir une erreur en quelque chose d'utile, mais il n'y a pas d'équivalent iphone?

toute aide serait grandement appréciée.

EDIT:

ok, donc les mouler les donne à l'envers (quelque chose que j'ai vérifié pour 'mrep' mais n'était pas là dans les deux sens) , fmt? est dans la liste pour l'api de Convertisseur Audio, et est assez explicite si un peu vague, mais assez juste, toujours "perm" n'est pas là (bien que ce pourrait être quelque chose à voir avec le simulateur ne supportant pas le décodage aac) et ma question générale tient toujours.

61
demandé sur tomk 2010-02-04 04:55:15

18 réponses

Pas de. Pas complètement.

certains OSStatus sont des codes à quatre caractères, de sorte que vous pouvez utiliser (extrait du code d'échantillon d'iPhone SDK " CAXException.h ")

static char *FormatError(char *str, OSStatus error)
{
    // see if it appears to be a 4-char-code
    *(UInt32 *)(str + 1) = CFSwapInt32HostToBig(error);
    if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) {
        str[0] = str[5] = '\'';
        str[6] = '"151900920"';
    } else {
        // no, format it as an integer
        sprintf(str, "%d", (int)error);
    }
    return str;
}

(voir iOS/C: Convertissez "entier" en chaîne de quatre caractères pour d'autres façons de convertir fourcc en chaîne, y compris Swift)

Nserstatuserrordomain de NSError est capable de décoder certaines erreurs OS. Voir la réponse de @tomk .

si vous n'avez pas besoin de décoder le numéro dans le programme pour l'utilisateur, vous pouvez utiliser le script macerror pour trouver manuellement le sens, comme mentionné dans la réponse de @lros . La liste des OSStatus supportés peut être trouvée à partir de son code source dans /System/Library/Perl/Extras/5.18/Mac/Errors.pm .

Il y a aussi un service en ligne http://osstatus.com/ collecte les erreurs de tous les cadres. Ils ne sont pas encore réellement complet, par exemple la correspondance avec -12792 mentionnée dans le commentaire est manquante. C'est probablement un code d'un cadre privé.

30
répondu kennytm 2017-05-23 12:10:10

OSStatus est une valeur entière signée. Vous ne pouvez pas le convertir ou le "lancer" à une corde. Vous pouvez le convertir en NSError comme ceci:

NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:osStatus userInfo:nil];

88
répondu tomk 2012-06-21 09:41:59

j'ai récemment rencontré une autre approche: la commande macerror. Imprimez la valeur OSStatus comme un entier signé. Puis dans une fenêtre de terminal (sur votre Mac, pas votre iDevice!) Tapez par exemple macerror -50 . Il y répondra par une brève description. Évidemment, cela n'est utile que pour vous, pendant le développement.

12
répondu lros 2014-04-17 20:25:20

voici le code que j'ai écrit, j'espère que ça vous évitera de taper... Je ne sais pas comment le faire apparaître correctement.

- (NSString *)OSStatusToStr:(OSStatus)st
{
    switch (st) {
        case kAudioFileUnspecifiedError:
            return @"kAudioFileUnspecifiedError";

        case kAudioFileUnsupportedFileTypeError:
            return @"kAudioFileUnsupportedFileTypeError";

        case kAudioFileUnsupportedDataFormatError:
            return @"kAudioFileUnsupportedDataFormatError";

        case kAudioFileUnsupportedPropertyError:
            return @"kAudioFileUnsupportedPropertyError";

        case kAudioFileBadPropertySizeError:
            return @"kAudioFileBadPropertySizeError";

        case kAudioFilePermissionsError:
            return @"kAudioFilePermissionsError";

        case kAudioFileNotOptimizedError:
            return @"kAudioFileNotOptimizedError";

        case kAudioFileInvalidChunkError:
            return @"kAudioFileInvalidChunkError";

        case kAudioFileDoesNotAllow64BitDataSizeError:
            return @"kAudioFileDoesNotAllow64BitDataSizeError";

        case kAudioFileInvalidPacketOffsetError:
            return @"kAudioFileInvalidPacketOffsetError";

        case kAudioFileInvalidFileError:
            return @"kAudioFileInvalidFileError";

        case kAudioFileOperationNotSupportedError:
            return @"kAudioFileOperationNotSupportedError";

        case kAudioFileNotOpenError:
            return @"kAudioFileNotOpenError";

        case kAudioFileEndOfFileError:
            return @"kAudioFileEndOfFileError";

        case kAudioFilePositionError:
            return @"kAudioFilePositionError";

        case kAudioFileFileNotFoundError:
            return @"kAudioFileFileNotFoundError";

        default:
            return @"unknown error";
    }
}
11
répondu Echo Lu 2012-11-02 13:19:11

[EDIT] --> cette réponse ne s'applique qu'à OSX et non à iOS

je sais que c'est un vieux post, mais je lisais the apple docs dans une section relative aux porte-clés. Ils mentionnent une méthode qui est utilisée pour convertir les erreurs D'OSStatus en quelque chose de lisible.

SecCopyErrorMessageString

renvoie une chaîne expliquant la signification d'un code de résultat de sécurité.

SecCopyErrorMessageString (OSStatus état, void* réservé );

Useage:

NSString* ErrMsg = (__bridge_transfer NSString *) SecCopyErrorMessageString(theOSStatusError, NULL);

ça a marché pour moi avec mes erreurs de porte-clés OSStatus. Faut-il travailler pour vous? Vous aurez besoin de la sécurité .Cadre ajouté à votre projet d'utiliser cette méthode.

8
répondu iOS Calendar View OnMyProfile 2016-07-15 08:50:45

utilisez le programme OSX calc. Sélectionnez le mode" programmeur " dans le menu Présentation. Puis tapez votre code dans la représentation décimale. Ensuite, choisissez le bouton" ascii "et le calc vous montrera la traduction de 4 char telle que"!init","!chat", etc...

4
répondu Albrecht 2013-10-21 13:24:28

j'ai récemment trouvé ce site Web vraiment sympa qui a fonctionné pour chaque valeur de statut que je lui ai jeté. C'est beaucoup plus facile à utiliser que de passer à travers les fichiers d'en-tête de framework: http://www.osstatus.com/

4
répondu Earlz 2015-09-24 18:05:44

j'ai combiné quelques réponses. En fait, je ressemblais à quelque chose comme"jeter errorForStatusCode(statut)". Mais à la fin atteint:

    guard status == errSecSuccess else {
        throw  NSError(domain: NSOSStatusErrorDomain, code: Int(status), userInfo: [NSLocalizedDescriptionKey: SecCopyErrorMessageString(status, nil) ?? "Undefined error"])
    }

SecCopyErrorMessageString est disponible à partir de iOS 11.3 https://developer.apple.com/documentation/security/1542001-security_framework_result_codes

3
répondu Roman Mykitchak 2018-07-27 13:52:45

la plupart du temps, peut-être que vous avez juste besoin de trouver le code d'erreur dans le .h les fichiers

je viens de faire un script python pour trouver le code (quand vous déboguez/imprimez un code osstatus)

https://github.com/sprhawk/MyGist/blob/master/tools/find_osstatus_error.py

2
répondu sprhawk 2013-08-09 05:26:23

si vous voulez créer un utilitaire en ligne de commande, pour utilisation pendant le développement et le support, alors vous pouvez toujours utiliser les méthodes carbone dépréciées, même dans 10.9 (Mavericks). Vous ne pouvez évidemment pas l'utiliser dans une application que vous soumettez à Apple pour inclusion dans les App Stores.

#import <Foundation/Foundation.h>
#import <CoreServices/CoreServices.h>

int main(int argc, const char **argv)
{
    @autoreleasepool {
        for (int i = 1; i < argc; i++) {
            char *endp;
            long value = strtol(argv[i], &endp, 10);
            if (*endp == '"151900920"') {
                printf("%10ld: %s (%s)\n",
                    value,
                    GetMacOSStatusCommentString((OSStatus)value),
                    GetMacOSStatusErrorString((OSStatus)value));
            } else {
                fprintf(stderr, "Invalid OSStatus code '%s' ignored\n", argv[i]);
            }
        }
    }
}

compiler avec:

$ clang -fobjc-arc -o osstatus osstatus.m -framework Foundation -framework CoreServices

Copiez-le quelque part dans votre $PATH :

$ cp osstatus ~/bin

et l'alimenter de codes d'erreur à partir de votre fichiers journaux ou rapports d'erreur:

$ osstatus -47
   -47: File is busy (delete) (fBsyErr)
2
répondu trojanfoe 2014-05-17 06:53:50

sans chaîne de description, il est commode de convertir les valeurs OSStatus en chaînes qui ressemblent à leurs définitions à quatre caractères. Au moins alors vous pouvez grep headers dans l'espoir de trouver un commentaire sur ce que le statut signifie.

// declaration:  extern CFStringRef CreateTypeStringWithOSType(OSType inType);

OSStatus result = ...;

if (result != noErr) {
    NSString *statusString = (NSString *)CreateTypeStringWithOSType(result);
    NSLog(@"Error while $VERBing: %@", statusString);
    [statusString release]; // because "Create..."
    statusString = nil;
}
2
répondu Shon 2015-01-08 16:05:02

ce n'est pas une réponse directe à la question de L'OP, mais je pense qu'elle sera utile à quiconque est concerné par ces codes de retour OSStatus:

recherche de mots-clés" codes de résultat "dans la documentation de Xcode (organisateur) et nous obtenons une plus ou moins catégorisés codes de retour de la documentation sections dans le résultat" guides système".

Si vous avez besoin d'utiliser certains codes directement dans vos fonctions personnalisées, ils sont très utiles.

1
répondu kakyo 2013-06-26 18:40:19
Les erreurs

OSStatus peuvent être des octets représentant un code à 4 caractères, ou n'importe quel nombre d'erreurs défini dans MacErrors.h .

si une erreur D'OSStatus est 0 ou noErr cela signifie que vous n'avez pas d'erreur.

Ou, essayez de rechercher votre numéro d'erreur dans MacErrors.h :

http://www.opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/MacErrors.h

1
répondu inorganik 2015-06-09 15:55:06

ça pourrait aider.

static NSString *stringForOSStatus(OSStatus status)
{
    NSBundle *bundle = [NSBundle bundleWithIdentifier:@"com.apple.security"];
    NSString *key = [NSString stringWithFormat:@"%d", status];
    return [bundle localizedStringForKey:key value:key table:@"SecErrorMessages"];
}
1
répondu Mimu 2015-07-15 01:55:37

pour un cadre de Sécurité sur IOS étant donné que SecCopyErrorMessageString est manquant sur la plate-forme c'est DYI

ajouter les codes d'erreur au bas de

https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices

à votre propre commutateur.

par exemple

        let status : OSStatus = SecItemAdd(query as CFDictionaryRef, nil)
        switch status {
        case errSecSuccess:
            return nil
        case errSecAuthFailed:
            // that's the result of dumping kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly into the query
            return "changing app lock type on a device without fingerprint and/or passcode setup is not allowed".localized
        default:
            return "unhandled case: implement this"
        }
1
répondu Anton Tropashko 2016-04-13 08:52:53

C'est ce dont vous avez besoin https://www.osstatus.com / . Il suffit de chercher un OSStatus donné.

0
répondu Boris Nikolić 2017-07-28 09:37:14

pour iOS 11.3+, j'utilise une extension sur OSStatus ...

extension OSStatus {

    var error: NSError? {
        guard self != errSecSuccess else { return nil }

        let message = SecCopyErrorMessageString(self, nil) as String? ?? "Unknown error"

        return NSError(domain: NSOSStatusErrorDomain, code: Int(self), userInfo: [
            NSLocalizedDescriptionKey: message])
    }
}

que vous pouvez appeler comme ...

let status = SecItemAdd(attributes as CFDictionary, nil)

if let error = status.error {
    throw error
}    
// etc

après avoir écrit ceci, j'ai remarqué que c'est très proche de la réponse précédente de @RomanMykitchak (alors s'il vous plaît donnez - lui l'upvote) - mais je vais le laisser ici car l'extension pourrait s'avérer utile à quelqu'un.

0
répondu Ashley Mills 2018-08-21 09:22:46

OSStatus err; ... printf ("%s", (char*)&err);

-4
répondu peter 2010-10-05 15:40:37