2012-11-30 1 views
5

Ist es möglich, ein Sparbuch aus einer Webansicht herunterzuladen und hinzuzufügen, ohne die App zu modifizieren, um den neuen MIME-Typ oder unbekannte MIME-Typen wie Sparrow zu unterstützen?Können Sie einen Sparbuch-Gutschein von einem UIWebView in einer IOS-App herunterladen?

Ich habe eine News-iOS-App mit einem Webview. In der Webansicht zeige ich die Nachrichten und ein Banner an. Wenn Sie auf das Banner klicken, möchte ich eine URL zu einer .pkpass-Datei öffnen und sie zu meinem Sparbuch hinzufügen. Stattdessen erhalte ich einen FrameLoadInterrupted-Fehler, und nichts wird sichtbar. Wenn ich die URL von Safari öffne das funktioniert gut, Chrom, seit Anfang dieser Woche (Version 23) öffnet auch die URL wie vorgesehen.

Ist das vielleicht eine seltsame Strategie von Apple? diesen MIME-Typ nicht ordnungsgemäß von einer Webansicht zu öffnen?

+0

He Ben, ich bin sicher, dass die Standard-Safari kann mit dem umgehen. Wenn Sie diese Website öffnen: [http://passkit.com/samples/](http://passkit.com/samples/) können Sie einige Beispiele herunterladen. Sie können versuchen, diese Seite in einem 'UIWebView' zu öffnen, wenn sie noch funktioniert. – rckoenes

+0

Safari behandelt es gut, wie ich bereits erwähnt habe. Von einem UIWebView passiert nichts. –

+0

Es scheint, dass das 'UIWebView' die Sparbuchdateien nicht öffnen kann. – rckoenes

Antwort

3

Meine beste Wette ist, dass die UIWebView ist einfach nicht in der Lage, die Passbook Pässe zu behandeln. Sie könnten jedoch versuchen, den Download in der UIWebViewDelegate Methode -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType zu fangen.

Was ich meine zu sagen ist, dass Sie diesen Teil selbst zu behandeln haben, da die http://passkit.com/samples/ ich keine URL zurückgibt, die pkpass endet, so ist es völlig davon abhängig, wie Sie die Sparbuch-Dateien anfordern.

Wenn Sie in die .pkpass Erweiterung einfügen, können Sie nach der Erweiterung in der Anfrage suchen.

Wenn Sie wissen, welche Art von URL die Sparbuch-Datei ist, schreiben Sie hier Ihren eigenen Download-Code und übergeben Sie ihn an das Sparbuch über die passbook api.


Es scheint nicht, für diese keine großen auf fix zu sein, das defekte ULR in Safari geladen werden konnte:

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

Aber das ist nur wirklich schlecht Codierung.

+0

Ja, ich stimme zu, aber die Demo-App, die ich mit [' http://passkit.com/samples/'](http://passkit.com/samples/) hat die Weiterleitung nicht behandelt, also konnte ich höchstens eine URL wie https: // pass erhalten. ist/bEmKtX' also konnte ich wirklich keinen generischen code das handle '. pkpass'. Also wird diese Lösung nicht funktionieren. – rckoenes

+0

lies es nicht durch, zog meine Antwort zurück –

+0

Ich verstehe nicht ganz, was Sie hier tun, aber die ersten beiden Absätze sind korrekt, Sie müssen die Anfrage erfassen und selbst behandeln. Es gibt Beispiele, die zeigen, wie das geht. – ohmi

3

Okay, sprach mit den Ingenieuren auf der WWDC und dies ist ein bekannter Fehler in UIWebView, aber Apple wird es wahrscheinlich nicht beheben, weil sie Leute dazu ermutigen, den neuen SFSafariViewController zu übernehmen. Wir haben mit einem Hack kommen, es zu beheben sollten Sie iOS unterstützen müssen 6-8:

  1. Fügen Sie den PassKit Rahmen für das Projekt, wenn es nicht schon ist.

    #import <PassKit/PassKit.h> 
    
  2. einen Delegaten für die UIWebView einrichten (zum Beispiel die View-Controller die UIWebView Start)

    <UIWebViewDelegate> 
    
  3. eine Klassenvariable In den UIWebView fordert

    NSURLRequest *_lastRequest; 
    
  4. zwischenzuspeichern Stellen Sie den Delegierten

    self.webView.delegate = self; 
    
  5. die Rückrufliste alle Anfragen und Cache im Fall des Scheiterns

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
        _lastRequest = request; 
        return YES; 
    } 
    
  6. In den Ausfall Rückruf und Wiederabruf die URL, um zu sehen, ob es ein Durchlauf ist, und wenn das so ist, präsentiert den Pass zu packen den Benutzer

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

es ist eine schreckliche Hack für das, was unterstützt werden soll, aber es funktioniert unabhängig von der Erweiterung und soll wieder lenkt unterstützen. Wenn Sie auf dem Bug Zug stapeln möchten, können Sie Radar: // 21314226

Verwandte Themen