2015-09-07 74 views
13

AVFoundationでバイナリコード化されたQRコードを読み取ることは可能ですか?AVFoundationでバイナリQRコードを読み取る

しかし私は、これが唯一のQRコードに含まれるデータが文字列にやさしい表現に変換することができないため、動作しませんstringValueプロパティがあり、.typeAVMetadataObjectTypeQRCodeAVMetadataMachineReadableCodeObjectオブジェクトを取得することができます。

代わりにZXingを使用する必要がありますか?

おかげ

+1

解決方法を見つけましたか?私は同じことをしようとしています – Johannes

答えて

7

生データは、あなたのAVMetadataMachineReadableCodeObjectには存在しないが、それは公共ゲッターを介して利用できません。

ただし、KVOを使用して抽出することはできますが、アップルはアプリを拒否することがあります。また、将来のiOSバージョンではプライベートAPIが変更され、コードが無効になる可能性があります(ハードキー付きの秘密鍵のため)。

スウィフト:

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

のObjective-C

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

私は内のデータをBase64エンコードすることで、この問題を解決することができたのiOS 8および9

+0

これは私のために働いたが、結果は 'AnyObject'型です。もっと使いやすいタイプにキャストすることはできますか?オブジェクトに含まれるデータのタイプは何ですか? – oelna

+1

Swiftでは 'readableCodeObject.valueForKeyPath(" _ internal.basicDescriptor ")![" BarcodeRawData "]を?として使用できます。 NSData'を呼び出して、 'AVMetadataMachineReadableCodeObject'に格納されているNSDataを取得します。 – alexdmotoc

+0

非常に役に立ちます。ただし、生データから取得したバイトは、テストで参照データと一致しません。アプリケーション* bctester *は、例えば、正しいバイトを返し、 'AVMetadataMachineReadableCodeObject'によって返されたものとはまったく異なります。あなたは正しい方向に私を向けることができますか?私はこれを別の質問として投稿するつもりだと思う。それは厳密にはこのトピックの話題ではないからだ。 – oelna

0

のためにこれをテストしましたQRコード。 これは明らかにQRコードを生成していない場合には機能しませんが、その人のためのオプションとなります。

QRコードに保存できるデータの上限に達していましたが、zlibを使用してデータを圧縮してから、圧縮データをBase64でエンコードすると、データが75%元のサイズのいくつかの追加容量を取得し、stringValueプロパティを使用してデータを元に戻すことができます。元のデータを元に戻すには、Base64でデコードして解凍するだけです。

バイナリデータで圧縮していない場合でも、Base64のオーバーヘッドを処理してQRコードの制限内に収めることができれば、これは回避可能な実行可能なオプションです事実、AVMetadataMachineReadableCodeObjectは文字列値を扱いたいと思うようです。

関連する問題