2015-09-07 19 views
13

Czy można odczytać binarny kod QR z AVFoundation?Odczytaj binarny kod QR z AVFoundation

mogę uzyskać AVMetadataMachineReadableCodeObject przedmiot .typeAVMetadataObjectTypeQRCode, jednak nie ma to tylko właściwość stringValue, która nie będzie działać, ponieważ dane zawarte w kodzie QR nie mogą być zamienione na ciąg przyjazny reprezentacji.

Czy powinienem używać ZXing?

Dzięki

+1

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Próbuję zrobić to samo – Johannes

Odpowiedz

7

Surowe dane nie istnieje w swojej AVMetadataMachineReadableCodeObject, ale to nie jest dostępne za pośrednictwem publicznych getter.

Możesz jednak użyć KVO, aby go wyodrębnić, ale Apple może odrzucić Twoją aplikację. Również przyszłe wersje systemu iOS mogą zmienić prywatne interfejsy API, a kod może stać się nieprawidłowy (z powodu zakodowanych kluczy prywatnych).

Swift:

readableCodeObject.valueForKeyPath("_internal.basicDescriptor")!["BarcodeRawData"] 

Cel C

[readableCodeObject valueForKeyPath:@"_internal.basicDescriptor"][@"BarcodeRawData"]; 

I przetestowane iOS 8 i 9.

+0

To działało dla mnie, ale wynikiem jest typ 'AnyObject'. Czy mogę rzucić to do typu, który jest bardziej użyteczny? Jaki jest typ danych zawartych w Obiekcie? – oelna

+1

W Swift możesz użyć 'readableCodeObject.valueForKeyPath (" _ internal.basicDescriptor ")! [" BarcodeRawData "] jako? NSData', aby uzyskać NSData przechowywany w twoim 'AVMetadataMachineReadableCodeObject'. – alexdmotoc

+0

Bardzo pomocny. Jednak bajty, które otrzymuję z nieprzetworzonych danych, nie pasują do mojego materiału referencyjnego w teście. Aplikacja * bctester * na przykład zwraca poprawne bajty i są one całkowicie różne od tych zwróconych przez 'AVMetadataMachineReadableCodeObject'. Czy możesz wskazać mi właściwy kierunek? Myślę, że zamieści to również jako osobne pytanie, ponieważ nie jest to ściśle temat na ten temat. – oelna

0

że udało się rozwiązać ten problem przez base64 kodującego dane w Kod QR. To oczywiście nie zadziała, jeśli nie generujesz kodów QR, ale może to być opcja dla osób, które są.

Uruchomiliśmy górny limit danych, które można zapisać w kodzie QR, ale kompresując dane (użyliśmy zlib), a następnie Base64 kodując skompresowane dane, o ile dane kompresują do mniej niż 75% jego pierwotnego rozmiaru otrzymujesz dodatkową pojemność i możesz użyć właściwości stringValue, aby odzyskać dane, wystarczy dekodować Base64, a następnie dekompresować, aby odzyskać oryginalne dane.

Nawet jeśli zaczynasz od danych binarnych, które nie są bardzo kompresowalne, tak długo, jak możesz poradzić sobie z obciążeniem Base64 i nadal być w granicach ograniczeń kodów QR, to może być realną opcją, która unika pracy wokół fakt, że wydaje się, że AVMetadataMachineReadableCodeObject chce pracować z wartościami ciągu.