Как вы преобразовать код OSStatus iPhone на что-нибудь полезное?



Я получаю больше, чем немного устал от этого iPhone sdk, и это документация...



Я звоню AudioConverterNew



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



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



Они МРЭП "и"?ТМФ' (кастинг OSStatus в массив символов), но конкретные коды на самом деле не имеют значения.



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



любая помощь была бы очень оцененный.



EDIT:



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

886   18  

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) - но я оставлю его здесь, поскольку расширение может оказаться полезным для кого-то.

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

Comments

    Ничего не найдено.