2013-04-27 8 views
5

प्राप्त करें UIWebView स्वचालित रूप से Passbook .pkpass फ़ाइलों की प्रसंस्करण का समर्थन नहीं करता है।UIWebView प्रतिनिधि को MIME प्रकार

इस technical note में, ऐप्पल UIWebViewDelegate विधियों के माध्यम से MIME प्रकार को बाहर निकालने और उसके अनुसार प्रक्रिया करने के लिए एक चेक लागू करने की अनुशंसा करता है।

एक UIWebView का उपयोग कर गुजरता जोड़ने के लिए, की पहचान करने के लिए उपयुक्त UIWebViewDelegate तरीकों को लागू जब आवेदन की एक MIME प्रकार/vnd.apple.pkpass

हालांकि साथ दृश्य लोड डेटा, मैं UIWebView Delegate Protocol Reference के भीतर कुछ भी नहीं मिला जो एमआईएमई प्रकार प्रदान करने में सक्षम है।

मैं सफलतापूर्वक डाउनलोड कर सकते हैं और इस प्रक्रिया में कोई समस्या नहीं के साथ एक NSURLConnection प्रतिनिधि का उपयोग करते हुए फ़ाइलों को सीधे, लेकिन मैं क्या हासिल करने के लिए इच्छा एक उपयोगकर्ता एक जोड़ें पर क्लिक करता है, तो बटन पासबुक करने के लिए, जबकि एक UIWebView भीतर ब्राउज़ कर गुजरता ठीक से संसाधित करने के लिए के लिए है। चूंकि मुझे लिंक नहीं पता है, और कई प्रदाता एक .pkpass एक्सटेंशन के साथ अपने लिंक को प्रत्ययित नहीं करते हैं, एमआईएमई प्रकार की जांच करने की ऐप्पल की सलाह के बाद जाने का सबसे अच्छा तरीका लगता है।

मैं निम्नलिखित

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)newRequest 
               navigationType:(UIWebViewNavigationType)navigationType 
{ 

    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[newRequest URL]]; 

    // Spoof iOS Safari headers for sites that sniff the User Agent 
    [req addValue:@"Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25" forHTTPHeaderField:@"User-Agent"]; 

    NSURLConnection *conn = [NSURLConnection connectionWithRequest:newRequest delegate:self]; 

    return YES; 
} 

मेरे NSURLConnection प्रतिनिधि जोड़ने की कोशिश की है:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSString *mime = [response MIMEType]; 

    if ([mime isEqualToString:@"application/vnd.apple.pkpass"] && ![_data length]) { 

     _data = nil; // clear any old data 
     _data = [[NSMutableData alloc] init]; 

     [_webPanel stopLoading]; 
    } 
} 

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data 
{ 
    [_data appendData:data]; 
    NSLog(@"Size: %d", [_data length]); 
} 

-(void)connectionDidFinishLoading:(NSURLConnection*)connection 
{ 

    if ([_data length]) { 

     PKAddPassesViewController *pkvc = [PassKitAPI presentPKPassFileFromData:_data]; 
     pkvc.delegate = self; 
     [self presentViewController:pkvc 
          animated:YES 
         completion:nil]; 
    } 
} 

NSURLConnection प्रतिनिधियों ठीक से काम जब एक कनेक्शन UIWebView बिना, सीधे शुरू हो जाती है। हालांकि, जब मैं UIWebView से NSURLConnection लॉन्च करने का प्रयास करता हूं तो प्रतिनिधि डाउनलोड विफल हो जाता है क्योंकि .pkpass का केवल 80% या तो डाउनलोड किया जा रहा है (मुझे _data चर और सामग्री-लंबाई शीर्षलेख में बाइट्स का यादृच्छिक मेल नहीं मिला है)।

तो, मेरे सवालों का:

  1. वहाँ एक MIME प्रकार की पकड़ पाने के लिए एक आसान तरीका है, UIWebView प्रतिनिधि तरीकों से सीधे?
  2. यदि नहीं, तो क्या मैं समांतर NSURLConnection खोलने के साथ इस सही तरीके से जा रहा हूं, या क्या कोई बेहतर तरीका है?
  3. यदि कोई NSURLConnection जाने का तरीका है, तो पूर्ण फ़ाइल डाउनलोड करने से कम होने के कारण क्या हो सकता है?
+0

का उपयोग आप इस के लिए एक समाधान मिला? यदि हाँ आप इसे साझा कर सकते हैं? –

+0

नहीं - मैंने डब्ल्यूडब्ल्यूडीसी में ऐप्पल इंजीनियरों के साथ इसकी चर्चा की और उन्होंने मुझे बताया कि कोई समाधान नहीं है।मेरे पास प्रलेखन और UIWebView प्रतिनिधियों के खिलाफ कुछ खुली बग रिपोर्ट हैं। – PassKit

+0

क्या आपने यह पता लगाया है? मुझे इसे करने की ज़रूरत है और मुझे सर्वर को मैन्युअल रूप से हिट करने की आवश्यकता नहीं होगी। – MrTristan

उत्तर

0
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 

    NSURL *url = request.URL; 
    NSURLRequest *req = [NSURLRequest requestWithURL:url]; 
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self]; 
    [conn start]; 
    return YES; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 

    NSString *mime = [response MIMEType]; 
    NSLog(@"%@",mime); 

} 
+0

यह काम करता है, लेकिन यह एक बड़ा ओवरहेड है क्योंकि प्रत्येक अनुरोध दो बार डाउनलोड किया जाता है। आपका कोड एमआईएमई प्रकार पर भी बंद हो जाता है - मेरी समस्या यह है कि एमआईएमई प्रकार एप्लिकेशन/vnd.apple.pkpass सीधे UIWebView द्वारा समर्थित नहीं है और इसलिए मुझे इन फ़ाइलों को NSURLConnection के माध्यम से सशर्त रूप से (और कुशलतापूर्वक) डाउनलोड करने की आवश्यकता है, अंधाधुंध रूप से सबकुछ डाउनलोड नहीं करना समान्तर में। – PassKit

+0

क्या आप दो बिंदुओं पर समझा सकते हैं 1) दो बार डाउनलोड करें, 2) एमआईएमई प्रकार को रोकता है। मेरे कोड में ये सभी प्रतिनिधि केवल एक बार कॉल करते हैं। shouldStartLoadWithRequest, didReceiveResponse, webViewDidStartLoad, webViewDidFinishLoad। – Zeeshan

+0

जब ये प्रतिनिधि विधियां ट्रिगर होती हैं, तो UIWebView फ़ाइल को भी डाउनलोड कर रहा है (लेकिन अंत में इसे हटा देगा क्योंकि यह नहीं जानता कि इसे मूल रूप से कैसे संसाधित किया जाए)। NSURLConnection का उपयोग करने के लिए उसी संसाधन के लिए सर्वर को दो स्वतंत्र अनुरोधों की आवश्यकता होती है (UIWebView + मूल रूप से NSURLConnection से मूल)। .pkpass फ़ाइलें उत्पन्न करने के लिए सीपीयू गहन हैं और 500kb तक वजन कर सकते हैं। आदर्श रूप में मुझे मूल UIWebView अनुरोध से डेटा तक पहुंचने में सक्षम होना चाहिए, लेकिन त्रुटि प्रतिनिधि इस डेटा को हटा देता है। – PassKit

0

आप NSURLProtocol उपवर्गीकरण और वहाँ पार्स करने प्रतिक्रिया जानकारी से निपटने की कोशिश कर सकते।

- (void)URLProtocol:(NSURLProtocol *)protocol didReceiveResponse:(NSURLResponse *)response cacheStoragePolicy:(NSURLCacheStoragePolicy)policy 

पर

देखो के बारे में subresources भी इन हुक का उपयोग कर के लिए मत भूलना।

+1

क्या आप थोड़ा और विस्तार प्रदान कर सकते हैं कि उससे कैसे संपर्क करें? ऐसा लगता है कि डबल लोड संसाधनों से बचने के लिए केवल एक ही वाइस UIWebview या NSURLConnection का उपयोग विशेष रूप से करना है, लेकिन बाद के सीन्स को बहुत सारे काम करने के लिए करना है। – PassKit

+0

अपने NSURLProtocol के अंदर आप प्रत्येक अनुरोध के साथ हर अनुरोध के साथ हिट करेंगे। आप प्रत्येक प्रतिक्रिया में भी टैप कर सकते हैं। आप जांच सकते हैं कि क्या आप mainDocumentURL और अनुरोध के URL (कभी-कभी) के आधार पर एक उप-संसाधन हैं। प्रतिक्रिया जानकारी में एक MIMEType संपत्ति है जिसे आप देख सकते हैं। – cynistersix

0

बस js

let contentType = webView.stringByEvaluatingJavaScript(from: "document.contentType;") 
संबंधित मुद्दे