2012-11-30 36 views
5

是否可以從webview中下載和添加存摺而無需修改應用程序以支持新的MIME類型或像Sparrow這樣的未知MIME類型?您可以從IOS應用程序內的UIWebView下載存摺優惠券嗎?

我有一個新聞ios應用程序與web視圖。在webview中,我顯示新聞項目和橫幅。當您點擊橫幅廣告時,我想打開一個.pkpass文件的網址並將其添加到我的存摺中。相反,我得到一個FrameLoadInterrupted錯誤,並沒有發生任何可見的情況。 如果我從safari打開網址,這個工作正常,鉻,因爲本週早些時候(版本23)也打開像預期的URL。

這是來自蘋果的一些奇怪的策略嗎?不允許這種MIME類型從webview中正確打開?

+0

他本,我相信默認的Safari可以處理。如果你打開這個站點:[http://passkit.com/samples/](http://passkit.com/samples/),你可以下載一些例子。您可能想嘗試在「UIWebView」中打開此頁面,以確定它們是否仍然有效。 – rckoenes

+0

Safari提供了很好的處理方式。從UIWebView沒有任何反應。 –

+0

看來'UIWebView'不能打開存摺文件。 – rckoenes

回答

3

我最好的辦法是UIWebView只是無法處理Passbook通行證。您可以嘗試下載UIWebViewDelegate方法-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

我的意思是說,你必須處理這部分你的自我,因爲我使用的http://passkit.com/samples/沒有返回一個結束pkpass的url,因此它完全取決於你如何請求存摺文件。

如果您在包含.pkpass擴展名,您可以檢查請求中的擴展名。

如果您知道存摺文件是什麼樣的URL在這裏寫下您自己的下載代碼,並通過它通過passbook api存摺。


似乎有不放在解決任何爲這個偉大的,你可以在Safari加載失敗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的URL。是/ bEmKtX'因此我不能真正使用任何通用代碼。 pkpass'。因此該解決方案將無法工作。 – rckoenes

+0

沒有閱讀,收回我的答案 –

+0

我不太明白你在這裏做什麼,但前兩個段落是正確的,你必須趕上請求,並自己處理它。有樣本顯示如何做到這一點。 – ohmi

3

好了,跟在WWDC工程師,這是一個UIWebView但蘋果知道是不是BUG可能是因爲他們正在鼓勵人們採用新SFSafariViewController不會修復它。我們沒有拿出一個黑客修復它如果你需要支持的iOS 6-8:

  1. 添加PassKit框架的項目,如果它是不是已經。

    #import <PassKit/PassKit.h> 
    
  2. 設置一個代表針對的UIWebView(例如啓動的UIWebView視圖控制器)

    <UIWebViewDelegate> 
    
  3. 添加類變量緩存的UIWebView請求

    NSURLRequest *_lastRequest; 
    
  4. 設置代表

    self.webView.delegate = self; 
    
  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]; 
          } 
         } 
        }]; 
    } 
    

這是什麼應該支持一個可怕的黑客,但它的作品的延伸,不論應該支持重新定向。如果你想堆在bug列車上,你可以參考雷達:// 21314226