web-dev-qa-db-ja.com

iPhone OSステータスコードをどのように有用なものに変換しますか?

このiPhone SDKとそのドキュメントに少しうんざりしています...

AudioConverterNewを呼び出しています

リターンの下のドキュメントで:それは「ステータスコードを返す」と言う...本当に...

これまでのところ、パラメーターをいじってみると、2つの異なるエラーしか取得できませんでした。どちらもAudio Converterリファレンスの下部にリストされていません。

それらは 'mrep'と '?tmf'(OSStatusをchar配列にキャストする)ですが、特定のコードは実際にはポイントではありません。

私が知る限り、ランダムなエラーコードはランダムなファイルで定義されているため、1つのファイルを検索することはできません。エラーコードを検索して詳細情報を取得できるヘルプドキュメントは見つかりません。 OS Xでは、GetMacOSStatusErrorString()を使用してエラーを有用なものに変換できますが、iPhoneに相当するものはありませんか?

どんな助けも大歓迎です。

編集:

わかりましたので、それらをキャストすると逆になります(「mrep」をチェックしましたが、どちらにもありませんでした)、fmt? Audio Converter apiのリストにあり、少しあいまいですが、十分に公平で、まだ「perm」が存在しない場合(それはAACデコードをサポートしていないシミュレータと関係があるかもしれませんが)、一般的な疑問がまだ残っています。

63
matt

いいえ。完全ではありません。

一部のOSStatusは4文字コードなので、使用できます(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:「整数」を4文字の文字列に変換する を参照して、Swiftを含むfourccを文字列に変換する他の方法を参照してください)

NSErrorのNSOSStatusErrorDomainは、いくつかのOSエラーをデコードできます。 @ tomk's answer を参照してください。

ユーザーのプログラムで数値をデコードする必要がない場合は、 @ lrosの答え で説明されているように、macerrorスクリプトを使用して手動で意味を見つけることができます。サポートされているOSStatusのリストは、/System/Library/Perl/Extras/5.18/Mac/Errors.pmのソースコードから見つけることができます。

また、オンラインサービス http://osstatus.com/ があり、すべてのパブリックフレームワークからエラーを収集しています。それらはまだ完全ではありません。コメントに記載されている-12792へのマッピングがありません。おそらく、プライベートフレームワークからのコードです。

30
kennytm

OSStatusは符号付き整数値です。文字列に変換または「キャスト」することはできません。次のようにNSErrorに変換できます:

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

88
tomk

最近、別のアプローチに出くわしました:macerrorコマンド。 OSStatus値を符号付き整数として出力します。次に、ターミナルウィンドウ(iDeviceではなくMac)で、たとえばmacerror -5と入力します。簡単な説明で応答します。これは明らかに、開発中にのみ役立ちます。

13
lros

ここに私が書いたコードがありますが、それはあなたがいくつかの入力を節約することを望みます...えー、正しく表示する方法を知らない.

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

これは、macOSおよびiOS 11.3以降で使用できます。

私はこれが古い投稿であることを知っていますが、キーチェーンに関連するセクションで Apple docs を読んでいました。彼らはOSStatusエラーを読みやすいもの。

SecCopyErrorMessageString

セキュリティ結果コードの意味を説明する文字列を返します。

SecCopyErrorMessageString(OSStatusステータス、void *予約済み);

使用法:

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

キーチェーンのOSStatusエラーでうまくいきました。それはあなたのために働きますか?このメソッドを使用するには、プロジェクトにSecurity.Frameworkを追加する必要があります。

いくつかの答えを組み合わせました。実際、私は「throw errorForStatusCode(status)」のようなものを探していました。しかし、最終的に達成された:

    guard status == errSecSuccess else {
        throw  NSError(domain: NSOSStatusErrorDomain, code: Int(status), userInfo: [NSLocalizedDescriptionKey: SecCopyErrorMessageString(status, nil) ?? "Undefined error"])
    }

SecCopyErrorMessageStringはiOS 11.3から利用可能です https://developer.Apple.com/documentation/security/1542001-security_framework_result_codes

5
Roman Mykitchak

私は最近、私が投げたすべてのステータス値に対して機能するこの本当に素晴らしいウェブサイトを見つけました。フレームワークヘッダーファイルをgrepするよりもユーザーフレンドリーです。 http://www.osstatus.com/

5
Earlz

OSX calcプログラムを使用します。プレゼンテーションメニューで[プログラマ]モードを選択します。次に、10進数表現でコードを入力します。次に、「ascii」ボタンを選択すると、Calcは「!init」、「!cat」などの4文字の翻訳を表示します。

4
Albrecht

開発およびサポート中に使用するコマンドラインユーティリティを作成する場合、10.9(Mavericks)でも非推奨のCarbonメソッドを使用できます。明らかに、App Storeに含めるためにAppleに送信するアプリでこれを使用することはできません。

#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)
2
trojanfoe

ほとんどの場合、.hファイルでエラーコードを見つける必要があるだけです。

コードを見つけるためにpythonスクリプトを作成しました(osstatusコードをデバッグ/印刷するとき)

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

2
sprhawk

説明文字列に失敗した場合、OSStatus値を4文字の定義のように見える文字列に変換すると便利です。少なくとも、ステータスの意味についてのコメントを見つけることを期待して、ヘッダーを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;
}
2
Shon

OSStatus拡張機能を作成しました。これは役に立つかもしれません。オーディオ関連エラーの完全なエラーメッセージを記録します。可能な場合は4文字コード、そうでない場合は https://www.osstatus.com で検索できるOSStatus番号

さらに、ファイル、関数、エラーが発生した行などの有用な情報を追加します。

コードは次のとおりです。

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

3つのテストの結果ログ:

2018-11-12 19:41:48.427606 + 0100 HexaSynth [5875:102611] AUGraph Invalid Audio Unit、OSStatus = SoftSynthesizer.Swiftの-10864-init(soundFontFileName :)、行40

2018-11-12 19:41:48.428403 + 0100 HexaSynth [5875:102611]!dat、OSStatus = SoftSynthesizer.Swiftの560226676-init(soundFontFileName :)、行41

2018-11-12 19:41:48.428638 + 0100 HexaSynth [5875:102611] OSStatus = SoftSynthesizer.Swiftの-125-init(soundFontFileName :)、42行目

1
KerCodex

これは助けになるかもしれません。

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
Mimu

これは、OPの質問に対する直接的な答えではありませんが、これらのOSStatusリターンコードに関心がある人には役立つと思います。

Xcodeドキュメンテーション(オーガナイザー)でキーワード「結果コード」を検索すると、「システムガイド」結果に多かれ少なかれ分類されたリターンコードドキュメンテーションセクションが表示されます。

カスタム関数でいくつかのコードを直接使用する必要がある場合、それらは非常に役立ちます。

1
kakyo

これが必要なものです https://www.osstatus.com/ 。指定されたOSStatusを検索するだけです。

1
Boris Nikolic

OSStatusエラーは、4文字のコードを表すバイト、またはMacErrors.hで定義された任意の数のエラーです。

OSStatusエラーが0またはnoErrの場合、エラーがないことを意味します。

または、MacErrors.hでエラー番号を検索してみてください:

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

1
inorganik

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
Anton Tropashko

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
Ashley Mills