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


70

我对这个iPhone SDK及其文档感到不快...

我正在呼叫AudioConverterNew

在“返回”下的文档中:它说“返回状态码” ...真的...

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

它们是'mrep'和'?tmf'(将OSStatus广播到char数组),但是具体的代码并不是真正的重点。

据我所知,随机错误代码是在随机文件中定义的,因此您不能仅搜索一个文件,也找不到帮助文档,该文档仅允许您搜索错误代码以获取更多信息,并从我可以说,在OS X中,您可以使用GetMacOSStatusErrorString()将错误转换为有用的东西,但是没有iPhone等效的东西吗?

任何帮助将不胜感激。

编辑:

好的,所以将它们强制转换为反向(我检查了“ mrep”但没有回过头来),fmt吗?在音频转换器api的列表中,如果有点含糊,但还算公道,仍然不存在“烫发”(尽管可能与不支持aac解码的模拟器有关),这很容易解释。一般问题仍然存在。



1
@matt您是否迅速找到了解决方案?顺便问一句
Sam

Answers:


34

不,不完全是。

有些OSStatus是四个字符的代码,因此您可以使用(摘自iPhone SDK的示例代码“ CAXException.h”)

(请参阅iOS / C:将“整数”转换为四个字符串,以获取更多将fourcc转换为字符串的方法,包括Swift)

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

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

还有一个在线服务http://osstatus.com/,它收集所有公共框架中的错误。它们仍然不是很完整,例如,-12792缺少注释中提到的映射。可能是来自私有框架的代码。


1
这会生成一个编译器警告:if条件行上的“函数调用参数是未初始化的值”
cubeybeare 2011年

您是否不认为,如果发明OSStatus的开发人员希望将其作为字符串,他会声明为1而不是有符号整数?您不能或者至少不应该将整数“强制转换”为字符串。
tomk 2012年

6
@tomk:(1)您是否意识到该片段代码来自Apple的官方示例代码?(2)如何确定开发者发明了OSStatus不想使用4个字节作为存储4个字符的紧凑方式?我敢肯定是真的,因为OSType源自Mac OS。
kennytm 2012年

我必须承认,我是后来才发现的。但是正如您所写,“ ...某些OSStatus是四个...”。“ mrep”和“?tmf”听起来确实不像正确的错误代码。请参阅我的答案以获取将OSStatus转换为错误字符串的公共函数。
tomk 2012年

@tomk:那是因为您向后阅读它们。他们是perm烫发-ission误差)和fmt?(错˚F -或--A-牛逼)。您公开的方法显示的是“权限错误”和“格式错误”,还是仅显示“操作无法完成”?顺便说一句,这个答案中的方法也是公开的,只是它没有在一行中完成。
kennytm 2012年

94

OSStatus是一个带符号的整数值。您不能将其转换或“转换”为字符串。您可以将其转换为NSError,如下所示:

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


6
这个问题很旧,但是我会说这是正确的答案。然后,您可以获取描述性字符串,例如2012-11-05 22:28:52.338 foo[7300:707] Error Domain=NSOSStatusErrorDomain Code=-43 "The operation couldn’t be completed. (OSStatus error -43.)" (fnfErr: File not found)
Per Johansson

5
这样,您会因为许多错误而无法获得“无法完成操作”以外的任何操作。将此答案与公认的答案结合使用非常有效。
fishinear 2013年

很快,它没有给出与代码-12792相关的任何内容,我也尝试了其他一些代码,但一无所获。.–
山姆

1
这个答案很有用,但是错误文档不足的根本问题仍然是一个问题。击中OSStatus查找站点可以解决问题,但这对苹果来说是个错误。
MandisaW

“您无法将其转换或“转换”为字符串” ... ...您知道许多Apple的文件格式和API使用“ 4CC”,即4个ASCII字符的序列,通过将它们以大写字母级联来转换为整数。尾序?(4CC还以多种媒体文件格式使用,因此已进入非Apple OS媒体库,例如Windows DirectShow使用它们来标识编解码器)。这意味着将它们转换为用于显示目的的字符串实际上是一件非常明智的事情。
Jules '18

13

我最近遇到了另一种方法:macerror命令。将OSStatus值打印为有符号整数。然后在终端窗口中(在您的Mac上,而不是在iDevice!上)输入例如macerror -50。它将以简短说明进行响应。显然,这仅在开发过程中对您有帮助。


1
这似乎为绝大多数错误代码返回“未知错误代码”
Earlz

12

在macOS和11.3及更高版本的iOS上可用。

我知道这是一篇旧文章,但是我正在阅读与钥匙串相关的部分中的Apple文档。他们提到了一种用于将OSStatus错误转换为可读性的方法。

SecCopyErrorMessageString

返回说明安全性结果代码含义的字符串。

SecCopyErrorMessageString(OSStatus status,void * reserved);

用途:

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


5
不幸的是,SecCopyErrorMessageString在iOS上不存在。

1
了解。我将保留它,以防它对Mac上的某人有所帮助
只是一名编码人员

不幸的是,它不适用于所有OSStatus。例如,它无法使用Core Audio OSStatus
DEADBEEF

1
感谢那。这是快速的语法:如果让错误:CFString = SecCopyErrorMessageString(status,nil){
Darrell Root

1
它包含在iOS 11.3及更高版本中。
johndoe

11

这是我写的代码,希望它可以节省您的键入时间...嗯,不知道如何正确显示它。


1
使用宏进行字符串化并保存更多的键入内容。
trojanfoe 2014年

这很有用,尽管您应该为添加一个大小写0,这意味着没有错误。
inorganik

8

我结合了一些答案。实际上,我正在寻找类似“ throw errorForStatusCode(status)”的东西。但最终实现了:

可从iOS 11.3 https://developer.apple.com/documentation/security/1542001-security_framework_result_codes获得SecCopyErrorMessageString


1
iOS 11.3及更高版本的绝佳答案
Ashley Mills,


6

对于iOS 11.3+,我在OSStatus…上使用扩展程序

你可以这样称呼…

写完这篇文章后,我注意到这与@RomanMykitchak的早期答案非常接近(因此请给他投票)-但我将其保留在此处,因为扩展名可能对某人有用。


4

使用OSX calc程序。在演示菜单中选择“程序员”模式。然后以十进制表示形式输入您的代码。然后选择“ ascii”按钮,计算将显示4个字符的翻译,例如“!init”,“!cat”等。


4

我创建了一个OSStatus扩展,您可能会发现它很有用。它记录有关音频相关错误的完整错误消息,否则,如果可能,则记录四个字符的代码,否则,您可以在https://www.osstatus.com中查找的OSStatus号。

它还进一步添加了有用的信息,例如文件,函数和发生错误的行。

这是代码:

用法将是:

三个测试的结果日志:

2018-11-12 19:41:48.427606 + 0100 HexaSynth [5875:102611] AUGraph无效音频单元,SoftSynthesizer.swift中的OSStatus = -10864-init(soundFontFileName :),第40行

2018-11-12 19:41:48.428403 + 0100 HexaSynth [5875:102611]!dat,OSStatus = 560226676在SoftSynthesizer.swift中-init(soundFontFileName :),第41行

2018-11-12 19:41:48.428638 + 0100 HexaSynth [5875:102611] OSStatus = -125在SoftSynthesizer.swift中-init(soundFontFileName :),第42行


感谢你的回答。该代码可以正常工作,但是我错过了与AVAudioRecorder相关的错误。我已经借用了您的代码,并在此处添加了缺少的错误:stackoverflow.com/a/58348781/598057。您也可以在此处添加它们。
斯坦尼斯拉夫·潘克维奇

1
很高兴这对您有用。当然,每个人都应该针对其上下文中有用的错误调整代码。
KerCodex


2

如果您想创建一个命令行实用程序,以便在开发和支持期间使用,那么即使在10.9(Mavericks)中,仍然可以使用不推荐使用的Carbon方法。您显然无法在提交给Apple以便包含在App Store中的应用程序中使用此功能。

编译:

将其复制到您的某处$PATH

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


2

如果没有描述字符串,可以很方便地将OSStatus值转换为看起来像四个字符定义的字符串。至少您可以在grep标头中找到有关状态含义的注释。


1
CreateTypeStringWithOSType在Swift中相当于什么?我无法使用它...
DEADBEEF

1

这不是对OP问题的直接答案,但是我认为这对于关心以下OSStatus返回码的人将是有用的:

在Xcode文档(Organizer)中搜索关键字“结果代码”,然后在“系统指南”结果中获得或多或少归类的返回代码文档部分。

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



1

这可能会有所帮助。


这在iOS 9上不起作用(我没有尝试过其他版本),因为[NSBundle bundleWithIdentifier:@"com.apple.security"]return nil
humblehacker 2015年

1

鉴于SecCopyErrorMessageString在DYI平台上缺失,因此支持IOS上的安全框架

在底部添加错误代码

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

转到您自己的开关。

例如



-4

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


8
如果不久之后堆栈上没有0字节,那将导致崩溃。
DarkDust

您将使用printf(“%d”,err)。
Martin Konicek

2
甚至乔恩·斯基特(Jon Skeet)在地球上的存在也不足以做出正确的答案!
兰德尔·库克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.