load - picture - PhoneGap para iPhone: problema al cargar URL externa
plugins para cordova (5)
Estoy escribiendo una aplicación para iPad usando PhoneGap y me gustaría cargar una URL externa sin activar Safari o usar un navegador web interno como ChildBrowser.
Estoy usando el proyecto de ejemplo PhoneGap iPad / iPhone y probé diferentes enfoques. En la función onBodyLoad () agregué:
window.location.href(''http://www.wordreference.com'');
pero esta línea abre el enlace usando una nueva ventana de Safari. A partir de ese punto no es posible regresar en PhoneGap
Después, probé con una solicitud AJAX sustituyendo el contenido de la página usando 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 adentro en BodyLoad ():
loadHTML(''http://www.wordreference.com'',10000);
Abre el enlace en el Contenedor PhoneGap, que está bien. El punto es que quiero cargar una página dinámica escrita en Python
loadHTML(''http://www.mysite.com/cgi-bin/index.py'',10000)
En este punto, no se llama a Safari, pero se muestra una página negra 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?
Encontré algo similar relativo a PhoneGap para BlackBerry y la solución propuesta fue modificar un archivo config.xml con
<access subdomains="true" uri="http://www.mysite.com/" />
Traté de agregar esta etiqueta directamente en mi index.html pero no funciona.
¿Hay algún enfoque similar para iPhone?
Muchas gracias
Creo que encontré la solución,
en el archivo .m del administrador de aplicaciones PhoneGap {YourProject} AppDelegate.m , modifique 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!
PD. 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.
En Android puede hacer enlaces externos para abrir dentro de la vista web configurando
super.setBooleanProperty("loadInWebView", true);
antes de super.loadUrl en su 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 en addWhiteListEntry lugar. Ejemplo:
addWhiteListEntry("mydomain.com", true);
En Android, para evitar el problema de que la pantalla se vuelva negra durante las transiciones de página, a partir de PhoneGap 1.1.0, puede poner:
super.setIntegerProperty("backgroundColor", Color.WHITE);
super.setStringProperty("loadingPageDialog", "Loading page...");
antes de super.loadUrl en el método onCreate () de su actividad DroidGap.
Aquí hay una referencia al foro de discusión de PhoneGap que tiene los detalles:
http://comments.gmane.org/gmane.comp.handhelds.phonegap/11491
Esto funciona, gracias Claus. Quizás algunas aplicaciones necesitan ser más discriminatorias que solo "http" y "https".
Hice una cosa similar con phonegap android, mira a continuación. 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;
}
}
}
}
EJEMPLO DE LLAMADA JAVASCRIPT:
window.EXTERNALLINK.loadExternalLink("http://www.google.com");
Para las personas que tienen este problema en Android:
No conozco las versiones anteriores, pero en PhoneGap 1.1.0 puedes crear un archivo llamado res / xml / phonegap.xml y enumerar los dominios que no deberían abrirse 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://.com" subdomains="true" />
</phonegap>