ios - verificacion - ¿Cómo se convierte un código de OSStatus de iPhone a algo útil?
se enviaron demasiados codigos iphone (16)
Al fallar una cadena de descripción, es conveniente convertir valores OSStatus a cadenas que se parecen a sus definiciones de cuatro caracteres. Al menos entonces puedes grep encabezados con la esperanza de encontrar un comentario sobre lo que significa el estado.
// 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;
}
Me estoy enfermando un poco de este sdk de iphone y es documentación ...
Estoy llamando AudioConverterNew
en la documentación en Devoluciones: dice "devuelve un código de estado" ... realmente ...
hasta el momento, al jugar con los parámetros, solo he podido obtener dos errores diferentes, ninguno de los cuales se enumeran en la parte inferior de la referencia del convertidor de audio.
son ''mrep'' y ''? tmf'' (convirtiendo el OSStatus en una matriz de caracteres) pero los códigos específicos no son realmente el punto.
Por lo que puedo decir, los códigos de error aleatorio se definen en archivos aleatorios, por lo que no puede buscar un solo archivo, no puedo encontrar un documento de ayuda que simplemente le permita buscar un código de error para obtener más información, y desde Lo que sí puedo decir es que en OSX puedes usar GetMacOSStatusErrorString () para convertir un error en algo útil, pero no hay un equivalente de iPhone.
cualquier ayuda sería muy apreciada.
EDITAR:
ok, entonces lanzarlos los pone en reversa (algo que revisé para ''mrep'' pero que no estaba allí), fmt? está en la lista de la API de Audio Converter, y se explica bastante bien si es un poco vago, pero es justo, todavía ''permanente'' no está allí (aunque podría tener algo que ver con que el simulador no admita la decodificación aac) y mi la pregunta general sigue en pie.
Aquí está el código que escribí, espero que te salve algo de tipeo ... er, no sé cómo hacerlo aparecer correctamente.
- (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";
}
}
Esta no es una respuesta directa a la pregunta de OP, pero creo que será útil para quien esté preocupado con estos códigos de retorno OSStatus:
Busque la palabra clave "Códigos de resultado" en la documentación de Xcode (Organizador) y obtendremos una sección de documentación de códigos de retorno más o menos categorizada en el resultado "Guías del sistema".
Si solo necesita utilizar algunos códigos directamente en sus funciones personalizadas, son muy útiles.
Esto es lo que necesita https://www.osstatus.com/ . Simplemente busque el estado OSS dado.
Esto podría ser de ayuda.
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"];
}
Hace poco encontré este sitio web realmente bueno que ha funcionado para todos los valores de estado que le he echado. Es mucho más fácil de usar que compilar a través de los archivos de encabezado del framework: http://www.osstatus.com/
La mayoría del tiempo tal vez solo necesites encontrar el código de error en los archivos .h
Acabo de hacer una secuencia de comandos python para encontrar el código (cuando depura / imprime un código osstatus)
https://github.com/sprhawk/MyGist/blob/master/tools/find_osstatus_error.py
Los errores OSStatus pueden ser bytes que representan un código de 4 caracteres o cualquier cantidad de errores definidos en MacErrors.h
.
Si un error OSStatus es 0
o noErr
eso significa que no tiene ningún error.
O bien, intente buscar su número de error en MacErrors.h
:
http://www.opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/MacErrors.h
No. No completamente.
Algunos OSStatus son códigos de cuatro caracteres, por lo que puedes usarlos (extraídos del código de muestra SDK de iPhone " 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] = ''/0'';
} else {
// no, format it as an integer
sprintf(str, "%d", (int)error);
}
return str;
}
(Ver iOS / C: Convierta "entero" en una cadena de cuatro caracteres para obtener más formas de convertir cuatrocc en una cadena, incluido Swift)
NSError''s NSOSStatusErrorDomain es capaz de decodificar algunos errores del sistema operativo. Ver la respuesta de @ tomk .
Si no necesita decodificar el número en el programa para el usuario, puede usar el script macerror
para averiguar el significado manualmente, como se menciona en la respuesta de @ lros . La lista de OSStatus compatible se puede encontrar desde su código fuente en /System/Library/Perl/Extras/5.18/Mac/Errors.pm
.
También hay un servicio en línea http://osstatus.com/ recopila errores de todos los marcos públicos. Todavía no están completos, por ejemplo, -12792
el mapeo a -12792
mencionado en el comentario. Probablemente es un código de un marco privado.
OSStatus err; ... printf ("% s", (char *) & err);
OSStatus es un valor entero con signo. No puede convertirlo o "lanzarlo" a una cadena. Puede convertirlo a un NSError como este:
NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:osStatus userInfo:nil];
Recientemente encontré otro enfoque: el comando macerror. Imprima el valor OSStatus como un entero con signo. Luego, en una ventana de terminal (en tu Mac, ¡no en tu iDevice!) Escribe por ejemplo macerror -50 . Responderá con una breve descripción. Obviamente, esto solo es útil para ti, durante el desarrollo.
Si desea crear una utilidad de línea de comandos, para usar durante el desarrollo y la asistencia técnica, puede seguir utilizando los métodos obsoletos de Carbon, incluso en 10.9 (Mavericks). Obviamente, no puedes utilizar esto en una aplicación que estás enviando a Apple para su inclusión en las tiendas de aplicaciones.
#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 == ''/0'') {
printf("%10ld: %s (%s)/n",
value,
GetMacOSStatusCommentString((OSStatus)value),
GetMacOSStatusErrorString((OSStatus)value));
} else {
fprintf(stderr, "Invalid OSStatus code ''%s'' ignored/n", argv[i]);
}
}
}
}
Compilar con:
$ clang -fobjc-arc -o osstatus osstatus.m -framework Foundation -framework CoreServices
cópialo en algún lugar de tu $PATH
:
$ cp osstatus ~/bin
y alimentarlo con códigos de error de sus archivos de registro o informes de errores:
$ osstatus -47
-47: File is busy (delete) (fBsyErr)
Use el programa de cálculo OSX. Seleccione el modo "programador" en el menú de presentación. Luego escriba su código en representación decimal. Luego elija el botón "ascii" y el calc le mostrará la traducción de 4 caracteres como "! Init", "! Cat", etc ...
[EDITAR] -> Esta respuesta solo se aplica a OSX y no a iOS
Sé que esta es una publicación anterior, pero estaba leyendo los documentos de Apple en una sección relacionada con llaveros. Mencionan un método que se utiliza para convertir errores OSStatus en algo legible.
SecCopyErrorMessageString
Devuelve una cadena que explica el significado de un código de resultado de seguridad.
SecCopyErrorMessageString (estado OSStatus, void * reservado);
Uso:
NSString* ErrMsg = (__bridge_transfer NSString *) SecCopyErrorMessageString(theOSStatusError, NULL);
Me funcionó con los errores de OSStatus de mi llavero. ¿Funciona para ti? Necesitará Security.Framework agregado a su proyecto para usar este método.
para el marco de seguridad en IOS dado que SecCopyErrorMessageString falta en la plataforma es DYI
agregar códigos de error en la parte inferior de
https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices
a tu propio interruptor.
por ejemplo
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"
}