2010-02-04 120 views
60

我得到比這個iPhone SDK中的小病多,它的文檔......如何將iPhone OSStatus代碼轉換爲有用的東西?

我打電話AudioConverterNew

下返回的文件中:它說:「返回狀態代碼」 ... 真的...

到目前爲止,通過玩弄參數,我只能得到兩個不同的錯誤,這兩個錯誤都沒有列出在音頻轉換器參考的底部。

他們是「mrep」和「?TMF」(鑄造OSStatus的字符數組),但具體的代碼是不是真的點。

,據我所知,隨機錯誤代碼在隨機文件中定義的,所以你不能只是搜索一個文件,我無法找到一個幫助文件,只是讓你搜索一個錯誤代碼,以獲得更多信息,從我可以告訴,在OSX中,您可以使用GetMacOSStatusErrorString()將錯誤轉換爲有用的東西,但是沒有iphone等價物?

任何幫助將不勝感激。

編輯:

好了,他們鑄造使他們在相反的(東西我查「mrep」,但並沒有出現任何一種方式圓),格式化?是在音頻轉換器API的列表中,並且如果有點模糊,但足夠公平,仍然'燙髮'不存在(雖然它可能與模擬器不支持aac解碼有關),並且我的一般問題依然存在。

+0

[Apple Docs](https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices/#//apple_ref/c/econst/errSecSuccess) – 2016-05-04 20:35:06

+0

@matt您是否發現瞭解決方案迅速?很好的問題,順便說一句 – Sam 2016-05-23 11:09:49

回答

30

不完全。

一些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; 
} 

(對於一些更多的方式來FOURCC轉換成字符串,包括斯威夫特見iOS/C: Convert "integer" into four character string

NSError的NSOSStatusErrorDomain能夠解碼一些操作系統錯誤。見@tomk's answer

如果您不需要爲用戶解碼程序中的號碼,則可以使用macerror腳本手動查找含義,如@lros's answer中所述。支持的OSStatus列表可以從其源代碼/System/Library/Perl/Extras/5.18/Mac/Errors.pm中找到。

還有一個在線服務http://osstatus.com/所有公共框架收集錯誤。他們仍然不完整,例如映射到評論中提到的-12792缺失。可能它是一個來自私人框架的代碼。

+0

是的,通過它的外觀,這是你能做的最好的... – matt 2010-02-07 23:09:38

+18

這是令人沮喪的... – sehugg 2010-03-17 13:51:39

+1

這會產生一個編譯器警告:「函數調用的參數是一個未初始化值」對如果有條件線 – coneybeare 2011-10-30 15:52:22

-4

OSStatus ERR; ... printf(「%s」,(char *)& err);

+8

如果堆棧中不存在0字節,那麼這將導致很好的崩潰。 – DarkDust 2010-10-13 15:09:41

+0

你會使用printf(「%d」,err)。 – 2012-07-08 11:33:37

+2

行星上甚至沒有Jon Skeet的存在就足以讓這個答案正確! – 2013-10-07 07:40:05

86

OSStatus是一個符號的整數值。您不能將其轉換或「轉換」爲字符串。你可以把它轉換成NSError這樣的:

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

+5

這個問題很古老,但我會說這是正確的答案。然後你可以得到一個清晰的字符串,例如'2012-11-05 22:28:52.338 foo [7300:707] Error Domain = NSOSStatusErrorDomain Code = -43「The operation could not be completed。(OSStatus error -43。)」(fnfErr:File not found)' – 2012-11-05 21:29:30

+5

您無法通過這種方式獲得超出「操作無法完成」的錯誤。這個答案和接受的答案組合很好。 – fishinear 2013-07-04 18:26:58

+0

在迅速它不給任何相關的代碼-12792,我也嘗試了一些其他的代碼,但沒有.. – Sam 2016-05-23 11:07:40

11

這裏是我寫的代碼,希望能爲您節省一些打字......呃,不知道如何使它正確顯示。

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

使用宏和字符串化並保存更多的輸入。 – trojanfoe 2014-06-04 20:11:59

+0

這很有幫助,雖然你應該添加一個'0'的情況,這意味着沒有錯誤。 – inorganik 2015-06-05 16:46:42

7

[編輯] - >這個響應僅適用於OSX和iOS的不

我知道這是舊的文章,但我讀有關鑰匙扣一個部分the apple docs。他們提到了一種用於將OSStatus錯誤轉換爲可讀性的方法。

SecCopyErrorMessageString

返回一個字符串,解釋的安全結果代碼的含義。

SecCopyErrorMessageString(OSStatus狀態,無效*保留);

用途:

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

它爲我用我的鑰匙串OSStatus錯誤。對你起作用嗎?您需要將Security.Framework添加到您的項目中才能使用此方法。

+5

不幸的是,SecCopyErrorMessageString在iOS上不存在。 – quellish 2013-07-21 22:48:33

+1

瞭解。我會離開這對Mac上的某人有幫助 – 2015-10-21 17:33:20

+0

不幸的是,它不適用於所有的OSStatus。例如,它不能打印錯誤核心音頻OSStatus – DEADBEEF 2017-05-17 09:41:45

1

這不是直接回答OP的問題,但我認爲這將是對誰而言這些OSStatus返回代碼有用:

搜索Xcode的文檔中的關鍵字「結果代碼」(主辦單位),我們在「系統指南」結果中獲得或多或少分類的返回代碼文檔部分。

如果你只需要直接在您的自定義功能,使用一些代碼,他們是非常有幫助的。

4

使用OSX計算程序。在演示菜單中選擇「編程器」模式。 然後以十進制再現方式輸入您的代碼。然後選擇「ASCII」按鈕,鈣會告訴你4個字符的翻譯,如「初始化!」,「貓!」等等......

11

我最近碰到另一種方法運行:在macerror命令。將OSStatus值打印爲有符號整數。然後在終端窗口(你的Mac,而不是你的iDevice上!)類型例如macerror -50。它會迴應一個簡短的描述。顯然這隻對你有幫助,在開發過程中。

+0

這似乎返回「未知的錯誤代碼」爲絕大多數的錯誤代碼 – Earlz 2015-09-21 17:01:58

+0

@Earlz在這裏相同 – Sam 2016-05-23 11:10:28

2

如果你想創建一個命令行實用程序,用於開發和支持過程中使用,那麼你仍然可以使用已棄用的碳方法,即使是在10.9(小牛)。您顯然不能在您提交給蘋果公司的應用程序中使用這個應用程序商店。

#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

此實用程序已存在,稱爲'macerror'。 – OrangeDog 2014-12-01 14:53:16

2

失敗descr iption字符串,將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; 
} 
+0

Swift中「CreateTypeStringWithOSType」的等價物是什麼?我無法使用它... – DEADBEEF 2017-05-16 16:06:29

1

這可能是幫助。

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

這不適用於iOS 9(我還沒有嘗試過任何其他版本),因爲'[NSBundle bundleWithIdentifier:@「com.apple.security」]'returns'nil' 。 – humblehacker 2015-12-17 17:42:17

4

我最近發現這個非常好的網站,它適用於我所投射的每個狀態值。這是一個很多用戶不是通過框架頭文件grepping友好:http://www.osstatus.com/

+1

它無法理解-34018 – 2016-04-13 06:11:39

+0

沒有爲-12792 – Sam 2016-05-23 11:06:20

1

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