2012-11-30 3 views
5

Sparrow처럼 새 MIME 유형이나 알 수없는 MIME 유형을 지원하도록 앱을 수정하지 않고도 웹보기에서 통장을 다운로드하고 추가 할 수 있습니까?IOS 앱 내의 UIWebView에서 통장 쿠폰을 다운로드 할 수 있습니까?

나는 webview가있는 뉴스 ios 앱이 있습니다. webview에서는 뉴스 항목과 배너를 표시합니다. 배너를 클릭하면 .pkpass 파일의 URL을 열어 내 통장에 추가하려고합니다. 대신 FrameLoadInterrupted 오류가 표시되고 아무 것도 표시되지 않습니다. 사파리에서 URL을 열면 이번 주 초 (버전 23)부터 의도 한 URL이 열리기 때문에 크롬이 제대로 작동합니다.

애플의 이상한 전략인가? 이 MIME 형식이 webview에서 제대로 열리지 않게하려면?

+0

Ben. 기본 Safari가 처리 할 수 ​​있다고 확신합니다. 이 사이트를 열면 : [http://passkit.com/samples/](http://passkit.com/samples/)]에서 몇 가지 예제를 다운로드 할 수 있습니다. 'UIWebView'에서이 페이지를 열어 볼 수도 있습니다. – rckoenes

+0

Safari는 내가 언급 한대로 잘 처리합니다. UIWebView에서 아무 일도 일어나지 않습니다. –

+0

'UIWebView'가 통장 파일을 열 수없는 것으로 보입니다. – rckoenes

답변

3

최선의 방법은 UIWebView이 통장 패스를 처리 할 수 ​​없다는 것입니다. 그러나 UIWebViewDelegate 방법 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType에서 다운로드를 시도 할 수 있습니다.

내가 말하고자하는 것은 http://passkit.com/samples/이 사용 된 pkpass의 URL을 반환하지 않으므로 통장 파일 요청 방법에 전적으로 의존하기 때문에이 부분을 스스로 처리해야한다는 것입니다.

확장자가 .pkpass 인 경우 요청시 확장명을 확인할 수 있습니다.

통장 파일의 URL을 알고 있다면 여기에 자신의 다운로드 코드를 작성하고 passbook api을 통해 통장에 전달하십시오.

- (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]; 
    } 
} 

을하지만 이것은 정말 나쁜 코딩입니다 :


는 사파리에 실패한 ULR을로드 할 수, 이것에 대한 수정에 어떤 위대한이있을 것 같지 않습니다.

+0

예, 동의하지만 데모 앱은 [' http://passkit.com/samples/'](http://passkit.com/samples/)에서 리디렉션을 처리하지 못했기 때문에 대부분의 경우 https : // pass와 같은 URL을 얻을 수있었습니다./bEmKtX'이므로 나는 어떤 일반적인 코드도 처리 할 수 ​​없다.' pkpass'. 따라서 그 해결책은 효과가 없을 것입니다. – rckoenes

+0

didnt 그것을 통해 읽고, 내 대답을 철회 –

+0

나는 당신이 여기서 뭘하는지 잘 모르지만, 처음 두 단락은 정확합니다, 당신은 요청을 잡아 스스로 처리해야합니다. 이 작업을 수행하는 방법을 보여주는 샘플이 있습니다. – ohmi

3

좋아요, WWDC의 엔지니어들과 이야기했는데 이것은 UIWebView의 알려진 버그입니다. 그러나 사람들이 새로운 SFSafariViewController를 채택하도록 권장하기 때문에 애플은 그것을 고치지 않을 것입니다. 이미하지 않은 경우

  1. 이 프로젝트에 PassKit 프레임 워크를 추가 : 아이폰 OS 6-8을 지원할 필요가해야 우리는 그것을 해결하기 위해 해킹을 마련했다.

  2. 은 (예를 들어,있는 UIWebView를 시작 뷰 컨트롤러)에있는 UIWebView에 대한

    <UIWebViewDelegate> 
    
  3. 가있는 UIWebView를 캐시하는 클래스 변수를 추가하기 대리자를 설정

    #import <PassKit/PassKit.h> 
    
  4. NSURLRequest *_lastRequest; 
    
  5. 를 요청 위임자 설정

  6. (3210)가 실패 콜백을 추가하고 실패

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
        _lastRequest = request; 
        return YES; 
    } 
    
  7. 의 경우 모든 요청 및 캐시를 잡기 위해 콜백 추가가 패스 있는지 확인하기 위해 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

관련 문제