Как конвертировать код iPhone OSStatus во что-то полезное? - PullRequest
62 голосов
/ 04 февраля 2010

Мне более чем надоел этот iPhone SDK и его документация ...

Я звоню AudioConverterNew

в документации под Returns: написано "возвращает код состояния" ... на самом деле ...

До сих пор, играя с параметрами, я смог получить только две разные ошибки, ни одна из которых не указана в нижней части справочника Audio Converter.

это 'mrep' и '? Tmf' (приведение OSStatus к массиву символов), но конкретные коды на самом деле не имеют значения.

Насколько я могу судить, случайные коды ошибок определены в случайных файлах, поэтому вы не можете просто найти один файл, я не могу найти справочный документ, который просто позволяет вам искать код ошибки, чтобы получить больше информации и из того, что я могу сказать, в OS X вы можете использовать GetMacOSStatusErrorString (), чтобы преобразовать ошибку во что-то полезное, но нет эквивалента iPhone?

любая помощь будет принята с благодарностью.

EDIT:

хорошо, поэтому приведение к ним дает их в обратном порядке (что-то, что я проверил на «mrep», но не было в любом случае), fmt? находится в списке для Audio Converter api, и довольно понятен, если немного расплывчатый, но достаточно справедливый, все еще «perm» не существует (хотя это может быть что-то связанное с симулятором, не поддерживающим декодирование aac) общий вопрос все еще стоит.

Ответы [ 19 ]

2 голосов
/ 17 мая 2014

Если вы хотите создать утилиту командной строки для использования во время разработки и поддержки, вы все равно можете использовать устаревшие методы Carbon, даже в 10.9 (Mavericks). Очевидно, что вы не можете использовать это в приложении, которое вы отправляете в Apple для включения в App Store.

#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)
1 голос
/ 26 июня 2013

Это не прямой ответ на вопрос OP, но я думаю, что он будет полезен для тех, кто интересуется этими кодами возврата OSStatus:

Выполните поиск по ключевому слову «Коды результата» в документации XCode (Организатор), и мы получим более или менее категоризированные разделы документации кодов возврата в результате «Системные руководства».

Если вам просто нужно использовать некоторые коды непосредственно в ваших пользовательских функциях, они очень полезны.

1 голос
/ 13 апреля 2016

для платформы безопасности на IOS, учитывая, что SecCopyErrorMessageString отсутствует на платформе DYI

добавить коды ошибок внизу

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"
        }
1 голос
/ 15 июля 2015

Это может помочь.

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 голос
/ 09 июня 2015

Ошибки OSStatus могут быть байтами, представляющими 4-символьный код, или любым количеством ошибок, определенных в MacErrors.h.

Если ошибка OSStatus равна 0 или noErr, это означает, что у вас нет ошибок.

Или попробуйте найти свой номер ошибки в MacErrors.h:

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

0 голосов
/ 12 ноября 2018

Я создал расширение OSStatus, которое может оказаться полезным. Он регистрирует полное сообщение об ошибках, связанных со звуком, в противном случае, когда это возможно, четырехзначный код, в противном случае номер OSStatus, который можно найти в https://www.osstatus.com

Далее добавлена ​​полезная информация, такая как файл, функция и строка, в которой произошла ошибка.

Вот код:

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()

Полученные журналы для трех тестов:

2018-11-12 19: 41: 48.427606 + 0100 HexaSynth [5875: 102611] Недопустимый аудиоблок AUGraph, OSStatus = -10864 в SoftSynthesizer.swift - 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

0 голосов
/ 21 августа 2018

Для iOS 11.3+ я использую расширение на 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])
    }
}

который вы можете назвать как ...

let status = SecItemAdd(attributes as CFDictionary, nil)

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

Написав это, я заметил, что это очень близко к более раннему ответу @ RomanMykitchak (поэтому, пожалуйста, дайте ему ответ), но я оставлю это здесь, так как расширение может оказаться полезным для кого-то.

0 голосов
/ 28 июля 2017

Это то, что вам нужно https://www.osstatus.com/. Просто найдите данный OSStatus.

0 голосов
/ 05 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...