5

UIWebView は、Passbook .pkpass ファイルの処理を自動的にサポートしません。

このテクニカル ノートでは、Apple は UIWebViewDelegate メソッドを介してチェックを実装し、MIME タイプをスニッフィングしてそれに応じて処理することを推奨しています。

UIWebView を使用してパスを追加するには、適切な UIWebViewDelegate メソッドを実装して、ビューが application/vnd.apple.pkpass の MIME タイプのデータをいつロードするかを識別します。

ただし、 MIME タイプを提供できるUIWebView Delegate Protocol Reference内には何も見つかりません。

問題なくデリゲートを使用してファイルを直接ダウンロードして処理することNSURLConnectionはできますが、ユーザーが UIWebView 内を閲覧しているときに [パスブックに追加] ボタンをクリックすると、パスが適切に処理されるようにする必要があります。私はリンクを知らず、多くのプロバイダはリンクに .pkpass 拡張子を付けていないため、MIME タイプを調べるという Apple のアドバイスに従うのが最善の方法のようです。

私は以下を追加しようとしました

- (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ます。NSURLConnectionただし、デリゲートからを起動しようとするUIWebViewと、.pkpass の 80% 程度しかダウンロードされていないため、パスのダウンロードに失敗します (_data 変数と Content-Length ヘッダーのバイトがランダムに一致しません)。

だから、私の質問:

  1. デリゲート メソッドMIMEから直接型を取得する簡単な方法はありますか?UIWebView
  2. そうでない場合は、並列 NSURLConnection を開くことでこれを正しい方法で行っていますか、それともより良い方法がありますか?
  3. NSURLConnection を使用する方法がある場合、完全なファイルをダウンロードする前に停止する原因は何ですか?
4

3 に答える 3

0

NSURLProtocol をサブクラス化し、そこで解析する応答情報を処理することができます。

見る

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

これらのフックを使用するサブリソースについても忘れないでください。

于 2013-10-07T17:59:56.473 に答える