2012-11-30 13 views
5

क्या नया एमआईएमई प्रकार या स्पैरो जैसे अज्ञात एमआईएम प्रकारों का समर्थन करने के लिए ऐप को संशोधित किए बिना वेबव्यू के भीतर से एक पासबुक डाउनलोड करना और जोड़ना संभव है?क्या आप आईओएस ऐप के अंदर UIWebView से पासबुक कूपन डाउनलोड कर सकते हैं?

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

क्या यह ऐप्पल से कुछ अजीब रणनीति है? इस एमआईएम प्रकार को वेबव्यू से ठीक से खोलने की अनुमति नहीं दे रहा है?

+0

हे बेन, मुझे यकीन है कि डिफ़ॉल्ट सफारी संभाल सकता है। यदि आप इस साइट को खोलते हैं: [http://passkit.com/samples/](http://passkit.com/samples/) आप कुछ उदाहरण डाउनलोड कर सकते हैं। यदि आप अभी भी काम करते हैं तो आप इस पृष्ठ को 'UIWebView' में खोलने का प्रयास करना चाहेंगे। – rckoenes

+0

सफारी ने इसका उल्लेख ठीक किया है जैसा मैंने उल्लेख किया था। UIWebView से कुछ भी नहीं होता है। –

+0

ऐसा लगता है कि 'UIWebView' पासबुक फ़ाइलों को नहीं खोल सकता है। – rckoenes

उत्तर

3

मेरी सबसे अच्छी शर्त यह है कि UIWebView पासबुक पास को संभालने में सक्षम नहीं है। हालांकि आप UIWebViewDelegate विधि -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType में डाउनलोड करने का प्रयास कर सकते हैं।

मैं क्या कहने की मतलब है कि आप इस भाग अपने आप को संभालने के लिए है, है http://passkit.com/samples/ मैं प्रयोग किया जाता एक यूआरएल जो pkpass समाप्त हो जाती है और इस प्रकार यह पूरी तरह से कैसे आप पासबुक फ़ाइलों का अनुरोध पर निर्भर है वापस नहीं करता है के बाद से।

यदि आप .pkpass एक्सटेंशन शामिल करते हैं तो आप अनुरोध में विस्तार की जांच कर सकते हैं।

यदि आप जानते हैं कि पासबुक फ़ाइल किस प्रकार की यूआरएल है, तो आप अपना खुद का डाउनलोड कोड यहां लिखें और इसे passbook api के माध्यम से पासबुक पर पास करें।


इस के लिए ठीक पर किसी भी महान होने लगते हैं नहीं है, आप सफारी में असफल ULR लोड कर सकते हैं:

- (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
    NSLog(@"Webview: %@", error); 

    if ([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102) { 
     NSString *failedURL = [error.userInfo objectForKey:NSURLErrorFailingURLStringErrorKey]; 

     if (failedURL == nil) { 
      return; 
     } 
     NSURL *url = [NSURL URLWithString:failedURL]; 

     [[UIApplication sharedApplication] openURL:url]; 
    } 
} 

लेकिन यह सिर्फ सच में बुरा कोडन है।

+0

हां मैं सहमत हूं, लेकिन डेमो ऐप जिसे मैं [ http://passkit.com/samples/'](http://passkit.com/samples/) ने रीडायरेक्ट को संभाल नहीं किया है, इसलिए जितना अधिक मैं इसे प्राप्त कर सकता हूं वह 'https: // pass जैसे यूआरएल था। है/bEmKtX' इस प्रकार मैं वास्तव में किसी भी जेनेरिक कोड संभाल नहीं कर सका '। pkpass'। इस प्रकार समाधान काम नहीं करेगा। – rckoenes

+0

ने इसे पढ़ा नहीं है, मेरे उत्तर को वापस ले लिया –

+0

मुझे समझ में नहीं आता कि आप यहां क्या कर रहे हैं, लेकिन पहले दो पैराग्राफ सही हैं, आपको अनुरोध को पकड़ना होगा और इसे स्वयं संभालना होगा। वहाँ नमूने हैं जो दिखाते हैं कि यह कैसे करें। – ohmi

3

ठीक है, डब्ल्यूडब्ल्यूडीसी में इंजीनियरों से बात की और यह UIWebView में एक जानकार बग है लेकिन ऐप्पल शायद इसे ठीक नहीं करेगा क्योंकि वे लोगों को नए SFSafariViewController को अपनाने के लिए प्रोत्साहित कर रहे हैं। हम इसे ठीक करने के लिए एक हैक के साथ आते हैं कि आप आईओएस 6-8 समर्थन करने की आवश्यकता चाहिए:

  1. परियोजना के लिए PassKit ढांचे जोड़े यदि वह पहले से नहीं है।

    #import <PassKit/PassKit.h> 
    
  2. (UIWebView की शुरूआत दृश्य नियंत्रक उदाहरण के लिए)

    <UIWebViewDelegate> 
    
  3. UIWebView कैश करने के लिए एक वर्ग चर जोड़ें UIWebView के लिए एक प्रतिनिधि सेट अप का अनुरोध करता है

    NSURLRequest *_lastRequest; 
    
  4. प्रतिनिधि

    सेट करें
  5. कॉलबैक विफलता

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
        _lastRequest = request; 
        return YES; 
    } 
    
  6. के मामले में सभी अनुरोधों और कैश हड़पने के लिए विफलता कॉलबैक जोड़ें और जोड़े को देखने के लिए URL दोबारा लाने अगर यह एक पास होना जरूरी है और यदि हां, तो पास पेश उपयोगकर्ता

    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
        // try to get headers in case of passbook pass 
        NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
        [NSURLConnection sendAsynchronousRequest:_lastRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
         // check for PKPass 
         if ([response.MIMEType isEqualToString:@"application/vnd.apple.pkpass"]) { 
          NSError *error; 
          PKPass *pass = [[PKPass alloc] initWithData:data error:&error]; 
          if (error) { 
           NSLog(@"Error: %@", error); 
          } else { 
           PKAddPassesViewController *apvc = [[PKAddPassesViewController alloc] initWithPass:pass]; 
           [self presentViewController:apvc animated:YES completion:nil]; 
          } 
         } 
        }]; 
    } 
    

को यह क्या समर्थन किया जाना चाहिए के लिए एक भयानक हैक है, लेकिन यह विस्तार की परवाह किए बिना काम करता है और समर्थन करना चाहिए फिर से निर्देशन। यदि आप बग ट्रेन पर ढेर करना चाहते हैं, तो आप रडार का संदर्भ दे सकते हैं: // 21314226

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