PhoneGap for iPhone:加载外部URL时出现问题

我正在使用PhoneGap为iPad编写应用程序,我希望加载外部URL而不触发Safari或使用内部networking浏览器(如ChildBrowser)。

我正在使用PhoneGap iPad / iPhone示例项目,并尝试了不同的方法。 在onBodyLoad()函数中我添加了:

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

但这一行使用新的Safari窗口打开链接。从这一点是不可能回到PhoneGap

之后,我尝试使用document.writereplace页面内容的AJAX请求

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

现在,从onBodyLoad()里面调用:

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

打开PhoneGap容器中的链接,这很好。 关键是我想加载一个用Python编写的dynamic页面

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

此时Safari不会被调用,但PhoneGap容器中的黑色页面将被显示! 我想指出的是,如果我在Safari中input链接,我的链接是完美的工作(我不能报告它的隐私问题)。

可能是与某种需要的许可有关的问题?

我发现与BlackBerry PhoneGap相似的东西,build议的解决scheme是使用修改config.xml文件

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

我试图直接在我的index.html中添加这个标签,但它不起作用。

iPhone有没有类似的方法?

非常感谢

我想我已经find了解决scheme,

在PhoneGap应用程序委托.m文件{YourProject} AppDelegate.m中修改方法:

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

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

这将打开PhoneGap容器内的所有外部链接!

PS。 在附近你会发现这个链接的引用,但我认为它不适用于使用0.9.5版本编写的应用程序,因为Safari默认打开外部链接。

对于Android中有这个问题的人:

我不知道早期版本,但在PhoneGap 1.1.0中,您可以创build一个名为res / xml / phonegap.xml的文件,并列出不应在外部浏览器中打开的域。

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

示例phonegap.xml

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

这工作 – 谢谢克劳斯。 也许有些应用程序需要比“http”和“https”更加区分。

我用phonegap android做了类似的事情,看下面。 提供一个接口(我在这里称为EXTERNALLINK),从javascript调用loadExternalLink,然后将该url加载到当前的WebView中。 我不是专家,但似乎为我工作,只是为了你想要应用到的链接。

活动:

 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呼叫示例:

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

在Android中,为了解决页面转换期间屏幕变黑的问题,从PhoneGap 1.1.0开始,可以将:

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

之前super.loadUrl在您的DroidGap活动的onCreate()方法。

以下是对PhoneGap论坛的参考,其中包含详细信息:

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

在Android中,您可以通过设置在Web视图中打开外部链接

 super.setBooleanProperty("loadInWebView", true); 

在你的DroidGap Activity中super.loadUrl之前。

这将使每个外部链接在web视图中打开。 如果您只想在webview中打开某些域,请改用addWhiteListEntry 。 例:

 addWhiteListEntry("mydomain.com", true);