UIWebViewは通帳の.pkpassファイルの処理を自動的にサポートしません。UIWebView代理人がMIMEタイプを取得
このtechnical noteでは、UIWebViewDelegateメソッドによるチェックを実装して、MIMEタイプを盗聴し、それに応じて処理することを推奨しています。
を識別するために適切な UIWebViewDelegateメソッドを実装する、のUIWebViewを使用して、パスを追加する場合、アプリケーションの MIMEタイプしかし/ vnd.apple.pkpass
有するビューデータをロードし、I MIMEタイプを提供できるものは、UIWebView Delegate Protocol Reference内に見つかりません。
NSURLConnection
デリゲートを使用して問題なく直接ファイルをダウンロードして処理することはできますが、ユーザーがUIWebView内をブラウズしているときに[手帳に追加]ボタンをクリックすると、パスが正しく処理されます。私はそのリンクを知らないので、多くのプロバイダは.pkpass拡張子とのリンクに接尾辞をつけていないので、AppleのMIMEタイプの調査のアドバイスに従って、最善の方法と思われます。
私は、次の
- (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
デリゲートから起動しようとすると、.pkpassの80%程度しかダウンロードされていないので、ダウンロードが失敗します(_data変数とContent-Lengthヘッダーのランダムな不一致が発生します)。
だから、私の質問:
- は直接
UIWebView
デリゲートメソッドから、MIME
種類のホールドを取得するための簡単な方法はありますか? - もしそうでなければ、並列NSURLConnectionを開くことでこれを正しく行うつもりですか、それとも良い方法がありますか?
- NSURLConnectionを使用すると、完全なファイルをダウンロードできなくなる可能性があります。
でしょうか?はいの場合はそれを共有することができますか? –
いいえ - 私はWWDCのAppleエンジニアと話し合いましたが、解決策はない、と私は言いました。ドキュメントとUIWebViewのデリゲートに対していくつかのオープンなバグレポートがあります。 – PassKit
あなたはこれを考え出しましたか?私はこれに着手しようとしており、手動でサーバを再度叩く必要がないのが大好きです。 – MrTristan