Bir İPhone OSStatus kodunu yararlı bir şeye nasıl dönüştürebilirsiniz?

bu iphone sdk'sından biraz daha fazla alıyorum ve belgeler...

AudioConverterNew

çağırıyorum

döndürür altındaki belgelerde: "bir durum kodu döndürür" ... gerçekten...

şimdiye kadar, parametrelerle oynayarak sadece ses dönüştürücü referansının alt kısmında listelenmeyen iki farklı hata elde edebildim.

onlar 'mrep ' ve'?Tmf ' (Osstatus'u bir char dizisine dökmek) ancak belirli kodlar gerçekten nokta değildir.

bildiğim kadarıyla, rastgele hata kodları rastgele dosyalarda tanımlanır, bu yüzden sadece bir dosyayı arayamazsınız, daha fazla bilgi almak için bir hata kodu aramanıza izin veren bir yardım belgesi bulamıyorum ve söyleyebileceğim kadarıyla, OSX'DE bir hatayı yararlı bir şeye dönüştürmek için GetMacOSStatusErrorString() kullanabilirsiniz, ancak iphone eşdeğeri yoktur?

herhangi bir yardım büyük takdir edilecektir.

Düzenle:

Tamam, bu yüzden onları tersine çeviriyor ('mrep' için kontrol ettiğim bir şey ama her iki şekilde de yoktu), fmt? Audio Converter API'si listesinde ve biraz belirsiz olsa da, yeterince adil olsa da, hala 'perm' orada değilse (simülatör ile aac kod çözücüsünü desteklemeyen bir şey olsa da) oldukça açıklayıcı ve genel sorum hala duruyor.

61
tarihinde sordu tomk 2010-02-04 04:55:15
kaynak

18 ответов

Hayır. Tamamen değil.

bazı OSStatus dört karakterli kodlardır, bu nedenle kullanabilirsiniz (iPhone SDK'nın örnek kodundan " 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] = ''151900920'';
    } else {
        // no, format it as an integer
        sprintf(str, "%d", (int)error);
    }
    return str;
}

(bkz. iOS/C: dört karakter dizesine "tamsayı" dönüştürme , dört karakter dizesini Swift dahil olmak üzere dizeye dönüştürmenin bazı yolları için)

Nserror's NSOSStatusErrorDomain bazı işletim sistemi hatalarını çözebilir. Bkz. @ tomk's answer .

kullanıcı için programdaki numarayı çözmenize gerek yoksa, macerror komut dosyasını @lros'un cevabında belirtildiği gibi anlamı el ile bulmak için kullanabilirsiniz . Desteklenen OSStatus listesi /System/Library/Perl/Extras/5.18/Mac/Errors.pm kaynak kodundan bulunabilir .

orada da bir online hizmet http://osstatus.com / tüm kamu çerçevelerinden hata toplama. Onlar hala değil gerçekten örneğin, yorumda belirtilen -12792 haritalama eksik. Muhtemelen özel bir çerçeveden bir koddur.

30
cevap kennytm 2017-05-23 15:10:10
kaynak

osstatus imzalı bir tamsayı değeridir. Bir dizeye dönüştüremez veya "atamazsınız". Aşağıdaki gibi bir NSError dönüştürebilirsiniz:

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

88
cevap tomk 2012-06-21 13:41:59
kaynak

geçenlerde başka bir yaklaşımla karşılaştım: xerror komutu. Osstatus değerini imzalı bir tamsayı olarak yazdırın. Sonra bir terminal penceresinde (mac'inizde, idevice'inizde değil!) örneğin yazın xerror -50 . Kısa bir açıklama ile cevap verecektir. Açıkçası bu sadece sizin için yararlı, geliştirme sırasında.

12
cevap lros 2014-04-18 00:25:20
kaynak

işte yazdığım kod, umarım bazı yazarak kurtarırsınız... nasıl düzgün görüneceğini bilmiyorum.

- (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
cevap Echo Lu 2012-11-02 17:19:11
kaynak

[değiştir / kaynağı değiştir] - > bu yanıt yalnızca OSX için geçerlidir ve iOS

için geçerlidir

bunun eski bir yazı olduğunu biliyorum, ancak anahtarlıklarla ilgili bir bölümde apple dokümanları okuyordum. Osstatus hatalarını okunabilir bir şeye dönüştürmek için kullanılan bir yöntemden bahsediyorlar.

SecCopyErrorMessageString

, bir güvenlik sonucu kodunun anlamını açıklayan bir dize döndürür.

SecCopyErrorMessageString (OSStatus durumu, void* ayrılmış);

kullanım alanı:

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

benim Anahtarlık OSStatus hataları ile benim için çalıştı. Senin için işe yarıyor mu? güvenliğine ihtiyacınız olacak.Çerçeve bu yöntemi kullanmak için projenize eklendi.

8
cevap iOS Calendar View OnMyProfile 2016-07-15 11:50:45
kaynak

OSX calc programını kullanın. Sunum menüsünde" programcı " modunu seçin. Sonra ondalık représentation kodunuzu yazın. Sonra" ascıı "düğmesini seçin ve calc size" gibi 4 char çeviri gösterecektir!ınit","!kedi", vb...

4
cevap Albrecht 2013-10-21 17:24:28
kaynak

son zamanlarda Attığım her durum değeri için çalışan bu gerçekten güzel Web sitesini buldum. Çerçeve başlık dosyalarını açmaktan çok daha kullanıcı dostu: http://www.osstatus.com/

4
cevap Earlz 2015-09-24 21:05:44
kaynak

birkaç cevabı birleştirdim. Aslında "errorforstatuscode(status)" gibi bir şey arıyordum. Ama sonunda elde:

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

SecCopyErrorMessageString iOS 11.3 ' dan temin edilebilir https://developer.apple.com/documentation/security/1542001-security_framework_result_codes

3
cevap Roman Mykitchak 2018-07-27 16:52:45
kaynak

çoğu zaman belki de sadece hata kodunu bulmanız gerekir .h dosyalar

kodu bulmak için sadece bir python betiği yaptım (bir osstatus kodunu ayıkladığınızda/yazdırdığınızda)

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

2
cevap sprhawk 2013-08-09 09:26:23
kaynak

geliştirme ve destek sırasında kullanılmak üzere bir komut satırı yardımcı programı oluşturmak istiyorsanız, 10.9'da (Mavericks) bile kullanım dışı karbon yöntemlerini kullanabilirsiniz. Açıkçası app Stores dahil olmak üzere Apple'a gönderdiğiniz bir uygulamada bunu kullanamazsınız.

#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 == ''151900920'') {
                printf("%10ld: %s (%s)\n",
                    value,
                    GetMacOSStatusCommentString((OSStatus)value),
                    GetMacOSStatusErrorString((OSStatus)value));
            } else {
                fprintf(stderr, "Invalid OSStatus code '%s' ignored\n", argv[i]);
            }
        }
    }
}

ile derleyin:

$ clang -fobjc-arc -o osstatus osstatus.m -framework Foundation -framework CoreServices

$PATH bir yere kopyalayın:

$ cp osstatus ~/bin

ve hata kodlarını sizin günlük dosyaları veya hata raporları:

$ osstatus -47
   -47: File is busy (delete) (fBsyErr)
2
cevap trojanfoe 2014-05-17 10:53:50
kaynak

bir açıklama dizgesidir, osstatus değerlerini dört karakterli tanımlarına benzeyen dizelere dönüştürmek uygundur. En azından o zaman, durumun ne anlama geldiği hakkında bir yorum bulma umuduyla başlıkları grep edebilirsiniz.

// 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
cevap Shon 2015-01-08 19:05:02
kaynak

bu OP'NİN sorusuna doğrudan bir cevap değil, ancak bu OSStatus iade kodlarıyla ilgilenen herkes için yararlı olacağını düşünüyorum:

Xcode belgelerinde (Organizatör) anahtar kelime "sonuç kodları" için arama ve biz "sistem kılavuzları" sonucu az ya da çok kategorize dönüş kodları Dokümantasyon bölümleri olsun.

sadece özel fonksiyonlarınızda doğrudan bazı kodları kullanmanız gerekiyorsa, çok yardımcı olurlar.

1
cevap kakyo 2013-06-26 22:40:19
kaynak

OSStatus hataları, 4-char kodunu veya MacErrors.h de tanımlanan herhangi bir hata sayısını temsil eden bayt olabilir .

bir OSStatus hatası 0 veya noErr ise hata yapmadığınız anlamına gelir.

veya MacErrors.h hata numaranızı aramayı deneyin:

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

1
cevap inorganik 2015-06-09 18:55:06
kaynak

bu yardımcı olabilir.

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
cevap Mimu 2015-07-15 04:55:37
kaynak

Seccopyerrormessagestring'in platformda eksik olduğu göz önüne alındığında İOS'TA Güvenlik çerçevesi için

alt kısmında hata kodları ekleyin

https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices

kendi anahtarınıza.

örneğin

        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
cevap Anton Tropashko 2016-04-13 11:52:53
kaynak

ihtiyacınız olan şey https://www.osstatus.com / . Sadece verilen OSStatus arayın.

0
cevap Boris Nikolić 2017-07-28 12:37:14
kaynak

iOS 11.3+ için, OSStatus üzerinde bir uzantı kullanıyorum ...

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])
    }
}

gibi çağırabilirsiniz ...

let status = SecItemAdd(attributes as CFDictionary, nil)

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

bunu yazdıktan sonra, bunun @Romanmykitchak'ın önceki cevabına çok yakın olduğunu fark ettim (bu yüzden lütfen ona upvote verin) - ama uzantı birisi için yararlı olabileceğinden burada bırakacağım.

0
cevap Ashley Mills 2018-08-21 12:22:46
kaynak

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

-4
cevap peter 2010-10-05 19:40:37
kaynak