Как вы преобразовать код OSStatus iPhone на что-нибудь полезное?
Я получаю больше, чем немного устал от этого iPhone sdk, и это документация...
Я звоню AudioConverterNew
в документации под Returns: он говорит "возвращает код состояния"
...
действительно...
до сих пор, играя с параметрами, я смог получить только две разные ошибки, ни одна из которых не указана в нижней части ссылки на Аудиоконвертер.
Они МРЭП "и"?ТМФ' (кастинг OSStatus в массив символов), но конкретные коды на самом деле не имеют значения.
насколько я могу судить, случайные коды ошибок определены в случайных файлов, так что вы можете не просто искать один файл, я не могу найти документ, который просто позволяет искать код ошибки, чтобы получить больше информации, и, насколько я могу судить, в OSX вы можете использовать GetMacOSStatusErrorString (), чтобы преобразовать сообщение об ошибке, чтобы что-то полезное, но нет iPhone эквивалент?
любая помощь была бы очень оцененный.
EDIT:
хорошо, поэтому литье их дает их в обратном порядке (что-то я проверил на "mrep", но не было там в любом случае), fmt? находится в списке для api Аудиоконвертера и довольно понятен, если немного расплывчато, но достаточно справедливо, все еще "Пермь" не существует (хотя это может быть связано с симулятором, не поддерживающим декодирование aac), и мой общий вопрос все еще стоит.
18 ответов:
нет. Не совсем так.
некоторые 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] = ''; } else { // no, format it as an integer sprintf(str, "%d", (int)error); } return str; }(см. прошивкой/Градусы: преобразование "целое" в четыре строки символов для некоторых других способов преобразования fourcc в строку, включая Swift)
NSOSStatusErrorDomain NSError способен декодировать некоторые ошибки ОС. Смотрите @томк же!--11-->.
Если вам не нужно расшифровать номер в программе для пользователя, вы можете использовать
macerrorскрипт для ручного поиска смысла, как уже упоминалось в @lros по. Список поддерживаемых OSStatus можно найти из его исходного кода в/System/Library/Perl/Extras/5.18/Mac/Errors.pm.есть также онлайн-сервис http://osstatus.com/ сбор ошибок из всех публичных фреймворков. Они все еще не совсем завершены, например, отображение на
-12792упомянутый в комментарии отсутствует. Возможно это код от частного лица рамки.
OSStatus-это целочисленное значение со знаком. Вы не можете преобразовать или "бросить" его в строку. Вы можете преобразовать его в NSError следующим образом:
NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:osStatus userInfo:nil];
недавно я столкнулся с другим подходом: командой macerror. Выведите значение OSStatus в виде целого числа со знаком. Затем в окне терминала (на вашем компьютере, не вашего іустройства!) введите например macerror -50. Он ответит с кратким описанием. Очевидно, что это полезно только для вас, во время разработки.
вот код, который я написал, надеюсь, что это сэкономит вам немного набрав... Эм, не знаю, как заставить его появиться правильно.
- (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"; } }
[EDIT] -- > этот ответ относится только к OSX, а не iOS
Я знаю, это старый пост, но я читал документы apple в разделе, связанном с брелками. Они упоминают метод, который используется для преобразования ошибок OSStatus во что-то читаемое.
SecCopyErrorMessageString
возвращает строку, объясняющую значение кода результата безопасности.
SecCopyErrorMessageString (статус OSStatus, void* зарезервировано);
использование:
NSString* ErrMsg = (__bridge_transfer NSString *) SecCopyErrorMessageString(theOSStatusError, NULL);это сработало для меня с моими ошибками keychain OSStatus. Это работает для вас? Вам понадобится безопасность.Рамки добавил в свой проект, чтобы использовать этот метод.
используйте программу OSX calc. Выберите режим "программист" в меню презентации. Затем введите код в десятичной репрезентации. Затем выберите кнопку" ascii", и calc покажет вам перевод 4 символов, такой как"!инит", "!кот " и др...
недавно я нашел этот действительно хороший сайт, который работал для каждого значения статуса, которое я бросил на него. Это намного более удобно для пользователя, чем grepping через файлы заголовков фреймворка:http://www.osstatus.com/
Я объединил несколько ответов. На самом деле я искал что-то вроде "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
в большинстве случаев, возможно, Вам просто нужно найти код ошибки .H-файлы
Я только что сделал скрипт python, чтобы найти код (при отладке/печати кода osstatus)
https://github.com/sprhawk/MyGist/blob/master/tools/find_osstatus_error.py
если вы хотите создать утилиту командной строки, для использования во время разработки и поддержки, то вы все еще можете использовать устаревшие методы углерода, даже в 10.9 (Mavericks). Вы, очевидно, не можете использовать это в приложении, которое вы отправляете в 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 == '') { 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)
при отсутствии строки описания удобно преобразовать значения 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; }
Это не прямой ответ на вопрос OP, но я думаю, что это будет полезно для тех, кто связан с этими кодами возврата OSStatus:
поиск по ключевому слову " коды результатов "в документации Xcode (организатор), и мы получаем более или менее категоризированные разделы документации по кодам возврата в результате" Системные руководства".
Если вам просто нужно использовать некоторые коды непосредственно в пользовательской функции, они очень полезны.
ошибки OSStatus могут быть байтами, представляющими 4-х символьный код, или любое количество ошибок, определенных в
MacErrors.h.если ошибка OSStatus
0илиnoErrэто означает, что у вас нет ошибок.или попробуйте найти свой номер ошибки в
MacErrors.h:http://www.opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/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 учитывая, что 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" }
Это то, что вам нужно https://www.osstatus.com/. Просто найдите данный OSStatus.
для 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 (поэтому, пожалуйста, дайте ему upvote) - но я оставлю его здесь, поскольку расширение может оказаться полезным для кого-то.
Comments