2011-05-06 10 views
25

Estoy escribiendo una aplicación para iPad usando PhoneGap y me gustaría cargar una URL externa sin desencadenar Safari o utilizando un navegador web interno como ChildBrowser.PhoneGap for iPhone: problema cargando URL externa

Estoy usando el proyecto de ejemplo PhoneGap iPad/iPhone y probé diferentes enfoques. En la función onBodyLoad() añadí:

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

pero esta línea se abre el enlace utilizando un nuevo Safari window.From ese momento no es posible volver a aparecer en PhoneGap

Posteriormente, probé con un AJAX solicitud de sustitución del contenido de la página utilizando 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(); 
} 

Ahora, llamando desde el interior onBodyLoad():

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

Abre el enlace en el Contenedor PhoneGap, lo cual está bien. El punto es que quiero cargar una página dinámica escrito en Python

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

En este punto Safari no se conoce, pero se muestra una página negro en el contenedor PhoneGap !! Quiero señalar que el enlace funciona perfectamente si lo escribo en Safari (no puedo informarlo por cuestiones de privacidad).

¿Podría ser un problema relacionado con algún tipo de permiso necesario?

he encontrado algo similar en relación con PhoneGap para BlackBerry y la solución propuesta fue la de modificar un archivo config.xml con

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

He intentado añadir esta etiqueta directamente en mi index.html pero no lo hace trabajo.

¿Hay algún enfoque similar para el iPhone?

Muchas gracias

Respuesta

23

creo que he encontrado la solución,

en el archivo de la aplicación PhoneGap Delegado .m {} YourProject AppDelegate.m, modificar el método:

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

con

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

¡Esto abrirá todos los enlaces externos dentro del contenedor PhoneGap!

ps. Alrededor de usted encontrará referencias a este link, pero creo que no funciona para la aplicación escrita utilizando la versión 0.9.5, ya que Safari se abre para enlaces externos de manera predeterminada.

+0

Excelente! Esta fue la respuesta correcta para mantener los comandos window.location.href = '' dentro de la aplicación. – davidethell

+3

¿Cómo navegas de regreso a la aplicación después? –

+0

Fantástico, gracias por esto. Tenga en cuenta que desde 1.6 necesita buscar en MainViewController.m este método. –

2

Esto funciona - gracias Claus. Quizás algunas aplicaciones necesitan ser más discriminatorias que solo "http" y "https".

Hice una cosa similar con el teléfono Android, ver debajo.Proporcione una interfaz (que yo llamo EXTERNALLINK aquí), llame a loadExternalLink desde javascript, luego cargue esa url en la WebView actual. No soy un experto, pero parece funcionar para mí y solo para los enlaces a los que desea que se aplique.

ACTIVIDAD:

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

JavaScript LLAMADA Ejemplo:

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

10

Para las personas que tienen este problema en Android:

No sé acerca de las versiones anteriores, pero en PhoneGap 1.1.0 puede crear un archivo llamado res/xml/phonegap.xml y enumerar los dominios que debería no se debe abrir en el navegador externo.

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() { 
[...] 

Ejemplo phonegap.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<phonegap> 
    <access origin="http://stackoverflow.com" subdomains="true" /> 
</phonegap> 
+0

+1 Funcionó para mí en 1.2, muchas gracias! – JohnP

+4

Nota para cualquier googlers, parece que debe hacerse sin el "http: //" - solo "stackoverflow.com" – xdumaine

1

En Android se puede hacer enlaces externos para abrir el interior de la vista web mediante el establecimiento de

super.setBooleanProperty("loadInWebView", true); 

antes de super.loadUrl en tu actividad DroidGap.

Eso haría que cada enlace externo se abra en la vista web. Si desea abrir solo ciertos dominios en la vista web, use addWhiteListEntry. Ejemplo:

addWhiteListEntry("mydomain.com", true); 
+2

Lamentablemente, la pantalla se pone negra durante las transiciones de página. Esto es bastante molesto ¿Conoces alguna forma de evitar esto? – nisc

+0

no funciona, incluso setBooleanProperty no se encuentra en CordovaActivity – theLazyFinder

2

En Android, para evitar el problema de la pantalla va negro durante las transiciones de página, a partir de PhoneGap 1.1.0, se puede poner:

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

antes super.loadUrl en el método onCreate() de su actividad DroidGap.

Aquí es una referencia al foro de discusión PhoneGap que tiene los detalles:

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