Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将iPhone OSStatus代码转换为有用的代码?_Ios_Macos_Cocoa Touch_Cocoa_Error Handling - Fatal编程技术网

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

Ios 如何将iPhone OSStatus代码转换为有用的代码?,ios,macos,cocoa-touch,cocoa,error-handling,Ios,Macos,Cocoa Touch,Cocoa,Error Handling,我对这个iPhone SDK及其文档已经有点厌倦了 我打电话给AudioConverterNew 在“返回”下的文档中,它显示“返回状态代码” ... 真的 到目前为止,通过使用参数,我只能得到两个不同的错误,这两个错误都没有列在音频转换器参考的底部 它们是“mrep”和“tmf”(将OSStatus转换为字符数组),但具体的代码并不是重点 据我所知,随机错误代码是在随机文件中定义的,所以你不能只搜索一个文件,我找不到一个帮助文档,它只允许你搜索错误代码以获得更多信息,而且从我所知,在OS X中

我对这个iPhone SDK及其文档已经有点厌倦了

我打电话给AudioConverterNew

在“返回”下的文档中,它显示“返回状态代码” ... 真的

到目前为止,通过使用参数,我只能得到两个不同的错误,这两个错误都没有列在音频转换器参考的底部

它们是“mrep”和“tmf”(将OSStatus转换为字符数组),但具体的代码并不是重点

据我所知,随机错误代码是在随机文件中定义的,所以你不能只搜索一个文件,我找不到一个帮助文档,它只允许你搜索错误代码以获得更多信息,而且从我所知,在OS X中,你可以使用GetMacOSStatusErrorString()将错误转换成有用的东西,但是没有iPhone的等价物

任何帮助都将不胜感激

编辑:

好的,所以铸造它们会得到相反的结果(我检查了“mrep”,但两个方向都没有),fmt?在音频转换器api的列表中,如果有点含糊不清,这是非常自明的,但足够公平,仍然没有“perm”(尽管可能与模拟器不支持aac解码有关),我的一般问题仍然存在。

不,不完全是

一些OSStatus是四个字符的代码,因此您可以使用(从iPhone SDK的示例代码“
CAXException.h
”)中提取)

(有关将fourcc转换为字符串的更多方法,请参阅,包括Swift)

NSError的NSOSStatusErrorDomain能够解码一些操作系统错误。看

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

还有一个在线服务收集来自所有公共框架的错误。它们仍然没有真正完成,例如注释中提到的到
-12792
的映射丢失。可能是来自私有框架的代码。

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

OSStatus是一个有符号整数值。不能将其转换或“强制转换”为字符串。您可以将其转换为如下所示的N错误:


NSError*error=[NSError errorWithDomain:nsossstatuserrordomain: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";
    }
}

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

我知道这是一篇老文章,但我读的是一篇关于钥匙链的文章。他们提到了一种用于将OSStatus错误转换为可读内容的方法

SecCopyErrorMessageString

返回解释安全结果代码含义的字符串

SecCopyErrorMessageString(OSStatus状态,无效*保留)

用途:

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

我的钥匙链OSStatus错误对我有效。对你有用吗?您需要将Security.Framework添加到您的项目中才能使用此方法。

这并不是对OP问题的直接回答,但我认为它对关注这些OSStatus返回代码的人非常有用:

在Xcode文档(Organizer)中搜索关键字“结果代码”,我们会在“系统指南”结果中或多或少地得到一个分类的返回代码文档部分


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

大多数情况下,您可能只需要在.h文件中查找错误代码

我刚刚编写了一个python脚本来查找代码(在调试/打印osstatus代码时)


使用OSX计算程序。在演示菜单中选择“编程器”模式。
然后用十进制表示法键入代码。然后选择“ascii”按钮,计算器将显示4个字符的翻译,如“!init”、“!cat”等。

我最近遇到了另一种方法:macerror命令。将OSStatus值打印为带符号整数。然后在终端窗口中(在Mac电脑上,而不是在iDevice上!)键入例如macerror-50。它将以简短的描述作为回应。显然,这只在开发过程中对您有用。

如果您想创建一个命令行实用程序,以便在开发和支持过程中使用,那么即使在10.9(Mavericks)中,您仍然可以使用不推荐的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]);
            }
        }
    }
}
将其复制到
$PATH
中的某个位置:

$ cp osstatus ~/bin
并从日志文件或错误报告中输入错误代码:

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

如果描述字符串失败,则可以方便地将OSStatus值转换为类似于其四个字符定义的字符串。至少你可以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;
}

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

如果OSStatus错误为
0
noErr
,则表示您没有错误

或者,尝试在
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上的Security framework,考虑到平台上缺少SecCopyErrorMessageString,它是DYI

在页面底部添加错误代码

到你自己的开关

比如说

        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"
        }
这就是你需要的。
只需搜索给定的OSStatus。

我结合了几个答案。实际上,我看起来像是“抛出errorForStatusCode(状态)”。 但最终实现了:

    guard status == errSecSuccess else {
        throw  NSError(domain: NSOSStatusErrorDomain, code: Int(status), userInfo: [NSLocalizedDescriptionKey: SecCopyErrorMessageString(status, nil) ?? "Undefined error"])
    }
SecCopyErrorMessageString i
        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"
        }
    guard status == errSecSuccess else {
        throw  NSError(domain: NSOSStatusErrorDomain, code: Int(status), userInfo: [NSLocalizedDescriptionKey: SecCopyErrorMessageString(status, nil) ?? "Undefined error"])
    }
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])
    }
}
let status = SecItemAdd(attributes as CFDictionary, nil)

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

//**************************
// OSStatus extensions for logging
//**************************
extension OSStatus {
    //**************************
    func asString() -> String? {
        let n = UInt32(bitPattern: self.littleEndian)
        guard let n1 = UnicodeScalar((n >> 24) & 255), n1.isASCII else { return nil }
        guard let n2 = UnicodeScalar((n >> 16) & 255), n2.isASCII else { return nil }
        guard let n3 = UnicodeScalar((n >>  8) & 255), n3.isASCII else { return nil }
        guard let n4 = UnicodeScalar( n        & 255), n4.isASCII else { return nil }
        return String(n1) + String(n2) + String(n3) + String(n4)
    } // asString

    //**************************
    func detailedErrorMessage() -> String? {
        switch(self) {
        //***** AUGraph errors
        case kAUGraphErr_NodeNotFound:             return "AUGraph Node Not Found"
        case kAUGraphErr_InvalidConnection:        return "AUGraph Invalid Connection"
        case kAUGraphErr_OutputNodeErr:            return "AUGraph Output Node Error"
        case kAUGraphErr_CannotDoInCurrentContext: return "AUGraph Cannot Do In Current Context"
        case kAUGraphErr_InvalidAudioUnit:         return "AUGraph Invalid Audio Unit"

        //***** MIDI errors
        case kMIDIInvalidClient:     return "MIDI Invalid Client"
        case kMIDIInvalidPort:       return "MIDI Invalid Port"
        case kMIDIWrongEndpointType: return "MIDI Wrong Endpoint Type"
        case kMIDINoConnection:      return "MIDI No Connection"
        case kMIDIUnknownEndpoint:   return "MIDI Unknown Endpoint"
        case kMIDIUnknownProperty:   return "MIDI Unknown Property"
        case kMIDIWrongPropertyType: return "MIDI Wrong Property Type"
        case kMIDINoCurrentSetup:    return "MIDI No Current Setup"
        case kMIDIMessageSendErr:    return "MIDI Message Send Error"
        case kMIDIServerStartErr:    return "MIDI Server Start Error"
        case kMIDISetupFormatErr:    return "MIDI Setup Format Error"
        case kMIDIWrongThread:       return "MIDI Wrong Thread"
        case kMIDIObjectNotFound:    return "MIDI Object Not Found"
        case kMIDIIDNotUnique:       return "MIDI ID Not Unique"
        case kMIDINotPermitted:      return "MIDI Not Permitted"

        //***** AudioToolbox errors
        case kAudioToolboxErr_CannotDoInCurrentContext: return "AudioToolbox Cannot Do In Current Context"
        case kAudioToolboxErr_EndOfTrack:               return "AudioToolbox End Of Track"
        case kAudioToolboxErr_IllegalTrackDestination:  return "AudioToolbox Illegal Track Destination"
        case kAudioToolboxErr_InvalidEventType:         return "AudioToolbox Invalid Event Type"
        case kAudioToolboxErr_InvalidPlayerState:       return "AudioToolbox Invalid Player State"
        case kAudioToolboxErr_InvalidSequenceType:      return "AudioToolbox Invalid Sequence Type"
        case kAudioToolboxErr_NoSequence:               return "AudioToolbox No Sequence"
        case kAudioToolboxErr_StartOfTrack:             return "AudioToolbox Start Of Track"
        case kAudioToolboxErr_TrackIndexError:          return "AudioToolbox Track Index Error"
        case kAudioToolboxErr_TrackNotFound:            return "AudioToolbox Track Not Found"
        case kAudioToolboxError_NoTrackDestination:     return "AudioToolbox No Track Destination"

        //***** AudioUnit errors
        case kAudioUnitErr_CannotDoInCurrentContext: return "AudioUnit Cannot Do In Current Context"
        case kAudioUnitErr_FailedInitialization:     return "AudioUnit Failed Initialization"
        case kAudioUnitErr_FileNotSpecified:         return "AudioUnit File Not Specified"
        case kAudioUnitErr_FormatNotSupported:       return "AudioUnit Format Not Supported"
        case kAudioUnitErr_IllegalInstrument:        return "AudioUnit Illegal Instrument"
        case kAudioUnitErr_Initialized:              return "AudioUnit Initialized"
        case kAudioUnitErr_InvalidElement:           return "AudioUnit Invalid Element"
        case kAudioUnitErr_InvalidFile:              return "AudioUnit Invalid File"
        case kAudioUnitErr_InvalidOfflineRender:     return "AudioUnit Invalid Offline Render"
        case kAudioUnitErr_InvalidParameter:         return "AudioUnit Invalid Parameter"
        case kAudioUnitErr_InvalidProperty:          return "AudioUnit Invalid Property"
        case kAudioUnitErr_InvalidPropertyValue:     return "AudioUnit Invalid Property Value"
        case kAudioUnitErr_InvalidScope:             return "AudioUnit InvalidScope"
        case kAudioUnitErr_InstrumentTypeNotFound:   return "AudioUnit Instrument Type Not Found"
        case kAudioUnitErr_NoConnection:             return "AudioUnit No Connection"
        case kAudioUnitErr_PropertyNotInUse:         return "AudioUnit Property Not In Use"
        case kAudioUnitErr_PropertyNotWritable:      return "AudioUnit Property Not Writable"
        case kAudioUnitErr_TooManyFramesToProcess:   return "AudioUnit Too Many Frames To Process"
        case kAudioUnitErr_Unauthorized:             return "AudioUnit Unauthorized"
        case kAudioUnitErr_Uninitialized:            return "AudioUnit Uninitialized"
        case kAudioUnitErr_UnknownFileType:          return "AudioUnit Unknown File Type"
        case kAudioUnitErr_RenderTimeout:             return "AudioUnit Rendre Timeout"

        //***** AudioComponent errors
        case kAudioComponentErr_DuplicateDescription:   return "AudioComponent Duplicate Description"
        case kAudioComponentErr_InitializationTimedOut: return "AudioComponent Initialization Timed Out"
        case kAudioComponentErr_InstanceInvalidated:    return "AudioComponent Instance Invalidated"
        case kAudioComponentErr_InvalidFormat:          return "AudioComponent Invalid Format"
        case kAudioComponentErr_NotPermitted:           return "AudioComponent Not Permitted "
        case kAudioComponentErr_TooManyInstances:       return "AudioComponent Too Many Instances"
        case kAudioComponentErr_UnsupportedType:        return "AudioComponent Unsupported Type"

        //***** Audio errors
        case kAudio_BadFilePathError:      return "Audio Bad File Path Error"
        case kAudio_FileNotFoundError:     return "Audio File Not Found Error"
        case kAudio_FilePermissionError:   return "Audio File Permission Error"
        case kAudio_MemFullError:          return "Audio Mem Full Error"
        case kAudio_ParamError:            return "Audio Param Error"
        case kAudio_TooManyFilesOpenError: return "Audio Too Many Files Open Error"
        case kAudio_UnimplementedError:    return "Audio Unimplemented Error"

        default: return nil
        } // switch(self)
    } // detailedErrorMessage

    //**************************
    func debugLog(filePath: String = #file, line: Int = #line, funcName: String = #function) {
        guard isDebug, self != noErr else { return }
        let fileComponents = filePath.components(separatedBy: "/")
        let fileName = fileComponents.last ?? "???"

        var logString = "OSStatus = \(self) in \(fileName) - \(funcName), line \(line)"

        if let errorMessage = self.detailedErrorMessage() { logString = errorMessage + ", " + logString }
        else if let errorCode = self.asString()           { logString = errorCode    + ", " + logString }

        NSLog(logString)
    } // debugLog
} // extension OSStatus
//***** Create audioGraph
NewAUGraph(&audioGraph).debugLog()

//***** Testing .debugLog() OSStatus extension
kAUGraphErr_InvalidAudioUnit.debugLog()
OSStatus(560226676).debugLog()
OSStatus(-125).debugLog()