2015-09-07 13 views
13

के साथ बाइनरी क्यूआर कोड पढ़ें क्या AVFoundation के साथ एक बाइनरी एन्कोडेड क्यूआर कोड पढ़ना संभव है?AVFoundation

मैं, .typeAVMetadataObjectTypeQRCode के AVMetadataMachineReadableCodeObject वस्तु प्राप्त कर सकते हैं लेकिन यह केवल एक stringValue संपत्ति है, जो काम नहीं करेगा, क्योंकि डेटा QR कोड में निहित एक स्ट्रिंग अनुकूल प्रतिनिधित्व करने के लिए नहीं बदला जा सकता है।

क्या मुझे इसके बजाय ज़ेडएक्सिंग का उपयोग करना चाहिए?

धन्यवाद

+1

क्या आपको कभी इसका समाधान मिला? मैं वही – Johannes

उत्तर

7

कच्चे डेटा अपने AVMetadataMachineReadableCodeObject में मौजूद है, लेकिन यह एक सार्वजनिक गेटर माध्यम से उपलब्ध नहीं है।

हालांकि, आप इसे निकालने के लिए केवीओ का उपयोग कर सकते हैं, लेकिन ऐप्पल आपके ऐप को अस्वीकार कर सकता है। साथ ही, भविष्य के आईओएस संस्करण उनके निजी एपीआई बदल सकते हैं और आपका कोड अमान्य हो सकता है (हार्डकोडेड निजी कुंजी की वजह से)।

स्विफ्ट:

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

Objective-C

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

मैं आईओएस 8 के लिए इस परीक्षण किया है और 9.

+0

करने की कोशिश कर रहा हूं यह मेरे लिए काम करता है, लेकिन परिणाम 'AnyObject' प्रकार का है। क्या मैं इसे एक ऐसे प्रकार में डाल सकता हूं जो अधिक उपयोग योग्य है? ऑब्जेक्ट में निहित डेटा का प्रकार क्या है? – oelna

+1

स्विफ्ट में आप 'readableCodeObject.valueForKeyPath ("_ internal.basicDescriptor") का उपयोग कर सकते हैं! ["बारकोडरडाडाटा"] के रूप में? एनएसडाटा 'को आपके' AVMetadataMachineReadableCodeObject' में संग्रहीत एनएसडीटा प्राप्त करने के लिए। – alexdmotoc

+0

बहुत उपयोगी। हालांकि, कच्चे डेटा से प्राप्त बाइट्स एक परीक्षण में मेरी संदर्भ सामग्री से मेल नहीं खाते हैं। आवेदन * bctester * उदाहरण के लिए सही बाइट्स देता है, और वे 'AVMetadataMachineReadableCodeObject' द्वारा लौटाए गए लोगों से बिल्कुल अलग हैं। क्या मुझे आपसे सही दिशा निर्देशन मिलेगा? मुझे लगता है कि मैं इसे एक अलग प्रश्न के रूप में भी पोस्ट करूंगा, क्योंकि यह इस के लिए सख्ती से विषय पर नहीं है। – oelna

0

मैं Base64 में डेटा एन्कोडिंग द्वारा इस समस्या का समाधान करने में सक्षम था क्यूआर कोड। यह स्पष्ट रूप से काम नहीं करेगा यदि आप क्यूआर कोड भी नहीं बना रहे हैं लेकिन वे लोगों के लिए विकल्प हो सकते हैं।

हम डेटा की ऊपरी सीमा में भाग रहे थे जिसे एक क्यूआर कोड में संग्रहीत किया जा सकता है लेकिन डेटा को संपीड़ित करके (हमने zlib का उपयोग किया) और फिर संकुचित डेटा को बेस 64 एन्कोडिंग करके, जब तक आपका डेटा 75% से कम तक संपीड़ित हो जाता है, अपने मूल आकार के बारे में आपको कुछ अतिरिक्त क्षमता मिलती है और stringValue प्रॉपर्टी का उपयोग अपने डेटा को वापस पाने के लिए कर सकते हैं, आपको केवल बेस 64 डीकोड करना होगा और फिर मूल डेटा वापस पाने के लिए डिकंप्रेस करना होगा।

भले ही आप बाइनरी डेटा से शुरू कर रहे हैं जो बहुत संपीड़ित नहीं है, तब तक जब तक आप बेस 64 के ओवरहेड को संभाल सकें और फिर भी क्यूआर कोड की सीमाओं के भीतर हो, यह एक व्यवहार्य विकल्प हो सकता है जो आसपास के आसपास काम करने से बचें तथ्य यह है कि AVMetadataMachineReadableCodeObject स्ट्रिंग मानों के साथ काम करना चाहता है।

संबंधित मुद्दे