2015-09-07 9 views
13

È possibile leggere un codice QR codificato in formato binario con AVFoundation?Leggi codice binario QR con AVFoundation

posso ottenere un oggetto di .typeAVMetadataObjectTypeQRCodeAVMetadataMachineReadableCodeObject, tuttavia questo ha solo una proprietà stringValue, che non funzionerà, perché i dati contenuti nel codice QR non possono essere convertiti in una rappresentazione di stringa amichevole.

Devo utilizzare invece ZXing?

Grazie

+1

Hai mai trovato una soluzione a questo? Sto cercando di fare lo stesso – Johannes

risposta

7

I dati grezzi esiste nel vostro AVMetadataMachineReadableCodeObject, ma non è disponibile attraverso un getter pubblico.

Tuttavia, è possibile utilizzare KVO per estrarlo, ma Apple potrebbe rifiutare la propria app. Inoltre, le versioni future di iOS potrebbero cambiare le loro API private e il tuo codice potrebbe diventare non valido (a causa delle chiavi private hardcoded).

Swift:

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

Objective-C

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

Ho testato questo per iOS 8 e 9.

+0

Questo ha funzionato per me, ma il risultato è di tipo 'AnyObject'. Posso trasmettere questo ad un tipo che è più utilizzabile? Qual è il tipo di dati contenuti nell'oggetto? – oelna

+1

In Swift puoi usare 'readableCodeObject.valueForKeyPath (" _ internal.basicDescriptor ")! [" BarcodeRawData "] come? NSData' per ottenere NSData memorizzato in 'AVMetadataMachineReadableCodeObject'. – alexdmotoc

+0

Molto utile. Tuttavia, i byte che ottengo dai dati grezzi non corrispondono al mio materiale di riferimento in un test. L'applicazione * bctester *, ad esempio, restituisce i byte corretti e sono completamente diversi da quelli restituiti da 'AVMetadataMachineReadableCodeObject'. Puoi indicarmi la giusta direzione? Penso che pubblicherò anche questo come una domanda separata, poiché non è strettamente in argomento per questo. – oelna

0

ho potuto risolvere questo problema Base64 codifica dei dati nel QR Code. Questo ovviamente non funzionerà se non stai generando anche i codici QR, ma potrebbe essere un'opzione per le persone che lo sono.

Stavamo raggiungendo il limite superiore di dati che possono essere memorizzati in un codice QR ma comprimendo i dati (abbiamo usato zlib) e poi Base64 codificando i dati compressi, a patto che i dati si comprimano a meno del 75% delle sue dimensioni originali si ottiene un po 'di capacità aggiuntiva e si può usare la proprietà stringValue per recuperare i dati, basta decodificare Base64 e quindi decomprimere per recuperare i dati originali.

Anche se si inizia con dati binari che non sono molto compressibili, purché sia ​​possibile gestire il sovraccarico di Base64 e rimanere comunque entro i limiti dei codici QR, questa potrebbe essere una valida opzione che evita di aggirare il problema il fatto che AVMetadataMachineReadableCodeObject sembra voler lavorare con valori di stringa.

Problemi correlati