web-dev-qa-db-fra.com

PhoneGap pour iPhone: problème de chargement de l'URL externe

J'écris une application pour iPad en utilisant PhoneGap et je voudrais charger une URL externe sans déclencher Safari ou utiliser un navigateur Web interne comme ChildBrowser.

J'utilise l'exemple de projet PhoneGap iPad/iPhone et j'ai essayé différentes approches. Dans la fonction onBodyLoad (), j'ai ajouté:

window.location.href('http://www.wordreference.com'); 

mais cette ligne ouvre le lien à l'aide d'une nouvelle fenêtre Safari. À partir de là, il n'est pas possible de revenir dans PhoneGap

Ensuite, j'ai essayé avec une demande AJAX substituant le contenu de la page en utilisant document.write

function loadHTML(url, timeout) {
if (timeout == undefined)
    timeout = 10000;
var req = new XMLHttpRequest();
var timer = setTimeout(function() {
    try {
        req.abort();
    } catch(e) {}
    navigator.notification.loadingStop();
},timeout);
req.onreadystatechange = function() {
    if (req.readyState == 4) {
        if (req.status < 300) {
            clearTimeout(timer);

            var html = req.responseText;
            //just a debug print   
    alert(html);
    document.write(html);

        }
        navigator.notification.loadingStop();
        delete req;
    }       
};          
req.open('GET', url, true);
req.send();
}

Maintenant, appeler de l'intérieur onBodyLoad ():

loadHTML('http://www.wordreference.com',10000); 

Ouvre le lien dans le conteneur PhoneGap, ce qui est bien. Le fait est que je veux charger un page dynamique écrit en Python

loadHTML('http://www.mysite.com/cgi-bin/index.py',10000)

À ce stade, Safari n'est pas appelé mais une page noire dans le conteneur PhoneGap s'affiche !! Je tiens à souligner que le lien fonctionne parfaitement si je le tape dans Safari (je ne peux pas le signaler pour des problèmes de confidentialité).

Serait-ce un problème lié à une sorte d'autorisation nécessaire ???

J'ai trouvé quelque chose de similaire par rapport à PhoneGap pour BlackBerry et la solution proposée était de modifier un fichier config.xml avec

<access subdomains="true" uri="http://www.mysite.com/" />

J'ai essayé d'ajouter cette balise directement dans mon index.html mais cela ne fonctionne pas.

Existe-t-il une approche similaire pour l'iPhone ??

Merci beaucoup

26
Claus

Je pense avoir trouvé la solution,

dans le fichier PhoneGap Application Delegate .m {YourProject} AppDelegate.m, modifiez la méthode:

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
}

avec

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
 NSURL *url = [request URL];
if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) {
    return YES;
}
else {
return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
}
}

Cela ouvrira tous les liens externes dans le conteneur PhoneGap !!!

ps. Autour, vous trouverez des références à cela lien mais je pense que cela ne fonctionne pas pour les applications écrites en utilisant la version 0.9.5, car Safari est ouvert pour les liens externes par défaut.

23
Claus

Pour les personnes ayant ce problème dans Android:

Je ne connais pas les versions antérieures, mais dans PhoneGap 1.1.0, vous pouvez créer un fichier appelé res/xml/phonegap.xml et répertorier les domaines qui ne doivent pas être ouverts dans le navigateur externe.

De DroidGap.Java:

 /**
 * Load PhoneGap configuration from res/xml/phonegap.xml.
 * Approved list of URLs that can be loaded into DroidGap
 *      <access Origin="http://server regexp" subdomains="true" />
 * Log level: ERROR, WARN, INFO, DEBUG, VERBOSE (default=ERROR)
 *      <log level="DEBUG" />
 */
private void loadConfiguration() {
[...]

Exemple phonegap.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phonegap>
    <access Origin="http://stackoverflow.com" subdomains="true" />
</phonegap>
10
nisc

Sous Android, pour contourner le problème de noircissement de l'écran lors des transitions de page, à partir de PhoneGap 1.1.0, vous pouvez mettre:

super.setIntegerProperty("backgroundColor", Color.WHITE);
super.setStringProperty("loadingPageDialog", "Loading page...");

avant super.loadUrl dans la méthode onCreate () de votre activité DroidGap.

Voici une référence au forum de discussion PhoneGap qui contient les détails:

http://comments.gmane.org/gmane.comp.handhelds.phonegap/11491

2
Dave Curry

Cela fonctionne - merci Claus. Peut-être que certaines applications doivent être plus discriminantes que simplement "http" et "https".

J'ai fait une chose similaire avec phonegap Android, voir ci-dessous. Fournissez une interface (que j'appelle EXTERNALLINK ici), appelez loadExternalLink depuis javascript, puis chargez cette URL dans la WebView actuelle. Je ne suis pas un expert, mais semble fonctionner pour moi et uniquement pour les liens auxquels vous souhaitez qu'il s'applique.

ACTIVITÉ:

public class AndroidActivity extends DroidGap {  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try
    {
      super.loadUrl("file:///Android_asset/www/index.html");  
      this.appView.addJavascriptInterface(new JavaScriptInterface(), "EXTERNALLINK"); 
    }
    catch(Exception lException)
    {
      throw new RuntimeException("hello hello", lException);
    }
  }

  class JavaScriptInterface
  {
      public void loadExternalLink(String lUrl)
      {          
        try
        {
          loadUrl(lUrl);
        }
        catch(Exception Lex)
        {
          int i = 0;
        }
      }
  }
}

EXEMPLE D'APPEL JAVASCRIPT:

window.EXTERNALLINK.loadExternalLink("http://www.google.com");

2
mayo

Dans Android vous pouvez créer des liens externes à ouvrir dans la vue Web en définissant

super.setBooleanProperty("loadInWebView", true);

avant super.loadUrl dans votre activité DroidGap.

Cela ferait ouvrir tous les liens externes dans la vue Web. Si vous ne souhaitez ouvrir que certains domaines dans la vue Web, utilisez plutôt addWhiteListEntry . Exemple:

addWhiteListEntry("mydomain.com", true);
1
Epeli