Question

J'ai récemment découvert que mon UIWebView étouffait sur ITMS liens. Plus précisément, de la UIWebView dans mon application, si je navigue sur un site tel que celui-ci et cliquez sur le « Disponible sur l'App Store » lien, UIWebView serait erreur avec « erreur de domaine = code WebKitErrorDomain = 101 l'URL ne peut pas être affichée. »

Après un peu de recherche sur Google, je compris que je devais demandes de prises pour les liens d'applications iOS et ont les gérer. J'ai commencé en regardant pour voir si le système commence par « iTMS » dans -webView:shouldStartLoadWithRequest:navigationType:, mais réalisé qu'il pourrait y avoir d'autres types de liens d'applications que le système peut gérer. Alors je suis venu avec cela, au lieu:

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {
    // Give iOS a chance to open it.
    NSURL *url = [NSURL URLWithString:[error.userInfo objectForKey:@"NSErrorFailingURLStringKey"]];
    if ([error.domain isEqual:@"WebKitErrorDomain"]
        && error.code == 101
        && [[UIApplication sharedApplication]canOpenURL:url])
    {
        [[UIApplication sharedApplication]openURL:url];
        return;
    }

    // Normal error handling…
}

J'ai deux questions à ce sujet:

  1. Est-ce sain d'esprit? Je vérifie spécifiquement pour le domaine d'erreur et le code d'erreur et aller chercher la chaîne URL de la userInfo. Est-ce ce genre de choses susceptibles de rester?
  2. Ceci fonctionne au-dessus lié lien App Store, mais quand je Revient à mon application, il semble avoir été une demande ayant échoué suite qui a échoué avec « charge Frame interrompue ». comment puis-je me débarrasser de cela? Il ne se produit pas lorsque je la poignée OS la demande de -webView:shouldStartLoadWithRequest:navigationType:, donc il est un peu ennuyeux.

Comment gérer de telles demandes?

Était-ce utile?

La solution

Voici ce que je suis venu avec. En webView:shouldStartLoadWithRequest:navigationType:, je demande au système d'exploitation pour gérer les non-requêtes HTTP et non https qu'il peut, comme suit:

- (BOOL)webView:(UIWebView *)wv shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    // Determine if we want the system to handle it.
    NSURL *url = request.URL;
    if (![url.scheme isEqual:@"http"] && ![url.scheme isEqual:@"https"]) {
        if ([[UIApplication sharedApplication]canOpenURL:url]) {
            [[UIApplication sharedApplication]openURL:url];
            return NO;
        }
    }
    return YES;
}

Cela fonctionne très bien, sauf pour la sanglante « Load Frame Interrupted » erreur. Je pensais que par le retour de faux webView:shouldStartLoadWithRequest:navigationType: que la vue Web ne serait pas charger la demande et, par conséquent, il n'y aurait pas d'erreurs à manipuler. Mais même si je reviens NO ci-dessus, je reste « Load Frame INTERROMPU » erreur. Pourquoi?

Quoi qu'il en soit, je suppose qu'il peut être ignoré dans -webView:didFailLoadWithError::

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {
    // Ignore NSURLErrorDomain error -999.
    if (error.code == NSURLErrorCancelled) return;

    // Ignore "Fame Load Interrupted" errors. Seen after app store links.
    if (error.code == 102 && [error.domain isEqual:@"WebKitErrorDomain"]) return;

    // Normal error handling…
}

Et maintenant les URL iTunes fonctionnent correctement, tout comme mailto:s et liens app.

Autres conseils

En commençant par le code de la théorie, examiner l'URL pour le régime « de iTMS » (s) (cette méthode peut être appelée plusieurs fois en raison de redirection). Une fois que vous voyez un système de « iTMS », arrêtez le webView de chargement et ouvrir l'URL avec Safari. Mon WebView se trouve être dans un hors NavigationController, donc je pop que, après l'ouverture de Safari (moins clignotant).

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request 
  navigationType:(UIWebViewNavigationType)navigationType 
{
    if ([[[request URL] scheme] isEqualToString:@"itms-apps"]) {
        [webView stopLoading];
        [[UIApplication sharedApplication] openURL:[request URL]];
        [self.navigationController popViewControllerAnimated:YES];
        return NO;
    } else {
        return YES;
    }
}

Est-il utile si vous enregistrez votre application pour le traitement iTMS: liens

par exemple. http://inchoo.net/iphone-development/launching-application- via-url-système /

Vous pouvez commencer avec le schéma http mais obtenir une redirection itms, ce qui pourrait échouer si votre application est pas enregistrée comme la manipulation de ce régime.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top