Das UIWebView unterstützt die Verarbeitung von Passbook .pkpass-Dateien nicht automatisch.UIWebView-Delegat erhält MIME-Typ
In diesem technical note empfiehlt Apple eine Überprüfung über die UIWebViewDelegate-Methoden zu implementieren, um den MIME-Typ zu erkennen und entsprechend zu verarbeiten.
Pässe So fügen Sie eine UIWebView verwenden, implementieren die entsprechenden UIWebViewDelegate Methoden, wenn die Datenansicht Lasten mit einer Art von Anwendung/vnd.apple.pkpass
jedoch MIME zu identifizieren, I kann nichts innerhalb der UIWebView Delegate Protocol Reference finden, die den MIME-Typ bereitstellen kann.
Ich kann erfolgreich Dateien direkt mit einem Delegierten NSURLConnection
ohne Problem erfolgreich herunterladen und verarbeiten, aber was ich erreichen möchte, ist für Pässe ordnungsgemäß verarbeitet werden, wenn ein Benutzer auf eine Schaltfläche Zum Passbook hinzufügen beim Browsen in einem UIWebView klicken. Da ich den Link nicht kenne und viele Anbieter ihre Links nicht mit einer .pkpass-Erweiterung suffizieren, scheint Apples Ratschlag, den MIME-Typ zu untersuchen, der beste Weg zu sein.
Ich habe versucht, den folgenden
- (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;
}
Meinen NSURLConnection
Delegaten fügte hinzu:
- (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];
}
}
Die NSURLConnection
Delegierten funktionieren, wenn eine Verbindung direkt aufgerufen wird, ohne die UIWebView
. Jedoch, wenn ich versuche, eine NSURLConnection
von der UIWebView
Delegat starten der Download fehlschlägt, weil die nur 80% oder so der .pkpass heruntergeladen wird (ich bekomme eine zufällige Nichtübereinstimmung von Bytes in der Variable _data und der Content-Length-Header).
Also, meine Fragen:
- Gibt es einen einfacheren Weg, halten einen
MIME
Art zu bekommen, direkt von denUIWebView
Delegatmethoden? - Wenn nicht, dann mache ich das richtig mit dem Öffnen einer parallelen NSURLConnection, oder gibt es einen besseren Weg?
- Wenn eine NSURLConnection der richtige Weg ist, was könnte dann dazu führen, dass die Datei nicht vollständig heruntergeladen wird?
Haben Sie eine Lösung für diese finden? Wenn ja, kannst du es bitte teilen? –
Nein - ich habe es mit Apple-Ingenieuren auf der WWDC besprochen und sie haben mir gesagt, dass es keine Lösung gibt.Ich habe ein paar offene Fehlerberichte gegen die Dokumentation und die UIWebView-Delegierten. – PassKit
Haben Sie das herausgefunden? Ich bin dabei, dies zu tun und würde es lieben, den Server nicht noch einmal manuell zu treffen. – MrTristan