如何将iPhone OSStatus代码转换为有用的东西?

我得到这个iPhone SDK的一点点,它是文件…

我打电话AudioConverterNew

在返回文档:它说:“返回一个状态码”…真的…

到目前为止,通过玩弄参数,我只能得到两个不同的错误,都没有列出在audio转换器参考的底部。

他们是'mrep'和'?tmf'(将OSStatus转换为char数组),但具体的代码并不是真正的重点。

据我所知,随机错误代码被定义在随机文件中,所以你不能只search一个文件,我找不到一个帮助文件,只是让你search一个错误代码来获取更多的信息,并从我可以告诉,在OSX中,您可以使用GetMacOSStatusErrorString()将错误转换为有用的东西,但是没有iphone的等价物?

任何帮助将不胜感激。

编辑:

好吧,所以铸造他们给他们倒过来(我检查了“mrep”,但不是在那里),fmt? 是在audio转换器api的列表中,如果有点模糊,但足够公平,仍然'烫发'不存在(虽然这可能是与模拟器不支持aac解码)和我的一般问题依然存在。

不,不完全。

一些OSStatus是四字符代码,所以你可以使用(从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] = '\0'; } else { // no, format it as an integer sprintf(str, "%d", (int)error); } return str; } 

(请参阅iOS / C:将“integer”转换为四个string ,以便将fourcc转换为string(包括Swift)

NSError的NSOSStatusErrorDomain能够解码一些操作系统错误。 见@ tomk的答案 。

如果你不需要在程序中为用户解码数字,你可以使用macerror脚本来手动找出含义,如@ lros的答案中所提到的 。 支持的OSStatus列表可以从其源代码/System/Library/Perl/Extras/5.18/Mac/Errors.pm/System/Library/Perl/Extras/5.18/Mac/Errors.pm

还有一个在线服务http://osstatus.com/从所有公共框架收集错误。; 他们仍然不是完整的,例如在评论中提到的-12792映射失踪。 可能它是一个来自私人框架的代码。

OSStatus是一个有符号的整数值。 您不能将其转换或“转换”为string。 你可以把它转换成这样的NSError:

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

这里是我写的代码,希望它可以帮你节省一些打字…呃,不知道如何让它正确显示。

 - (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"; } } 

我最近遇到另一种方法:makerror命令。 将OSStatus值打印为有符号整数。 然后在一个terminal窗口(在你的Mac上,而不是你的iDevice!)types,例如macerror -50 。 它会回应一个简短的描述。 显然这只对你有帮助,在开发过程中。

[编辑] – >这个回应只适用于OSX而不适用于iOS

我知道这是一个旧post,但是我正在阅读与钥匙链有关的部分的苹果文档 。 他们提到了一种用来将OSStatus错误转换成可读性的方法。

SecCopyErrorMessageString

返回解释安全性结果代码含义的string。

SecCopyErrorMessageString(OSStatus状态,void *保留);

用途:

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

它与我的钥匙串OSStatus错误工作。 对你起作用吗? 您需要将Security.Framework添加到您的项目中才能使用此方法。

使用OSX calc程序。 在演示菜单中select“编程器”模式。 然后用十进制重新input你的代码。 然后select“ascii”button,calc将显示4个字符转换,如“!init”,“!cat”等。

我最近发现这个非常好的网站,它为我所投的每个状态值工作。 与通过框架头文件进行匹配相比,它更加便于用户使用: http : //www.osstatus.com/

大多数时候也许你只需要在.h文件中find错误代码

我只是做了一个Python脚本来find代码(当你debugging/打印一个osstatus代码)

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

如果您想要创build一个命令行实用程序,以便在开发和支持期间使用,那么即使在10.9(小牛)中,仍然可以使用已弃用的Carbon方法。 你显然不能在你提交给苹果公司的应用程序中使用这个应用程序商店。

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

编译:

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

将它复制到$PATH某处:

 $ cp osstatus ~/bin 

并从日志文件或错误报告中提供错误代码:

 $ osstatus -47 -47: File is busy (delete) (fBsyErr) 

如果描述string失败,将OSStatus值转换为看起来像四字符定义的string会很方便。 至less你可以通过grep头文件来寻找关于状态的意思。

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

这不是对OP问题的直接回答,但是我认为对于那些关心这些OSStatus返回代码的人来说是有用的:

在Xcode文档(组织者)中search关键字“结果代码”,我们会在“系统指南”结果中获得或多或less分类的返回代码文档部分。

如果您只需要在自定义函数中直接使用一些代码,那么它们非常有用。

OSStatus错误可以是代表4字符代码的字节,也可以是MacErrors.h定义的任意数量的错误。

如果OSStatus错误是0noErr ,那意味着你没有错误。

或者,请尝试在MacErrors.h查找您的错误号码:

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

这可能是帮助。

 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"]; } 

对于IOS上的安全框架,因为在它的DYI平台上SecCopyErrorMessageString是缺less的

在底部添加错误代码

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

到你自己的开关。

例如

  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" } 

这就是你需要的https://www.osstatus.com/ 。 只要search给定的OSStatus。

OSStatus err; … printf(“%s”,(char *)&err);