适用于iPhone的PhoneGap:加载外部URL时出现问题

时间:2011-05-06 12:15:01

标签: load cordova window.location external-links

我正在使用PhoneGap为iPad编写应用程序,我想在不触发Safari或使用像ChildBrowser这样的内部网络浏览器的情况下加载外部URL。

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

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

但是此行使用新的Safari窗口打开链接。从那时起,无法返回PhoneGap

之后,我尝试使用document.write

替换页面内容的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编写的动态页面

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

此时未调用Safari,但会显示PhoneGap容器中的黑页! 我想指出,如果我在Safari中输入链接,该链接就完全正常工作(我无法报告隐私问题)。

可能是与某种必要的许可相关的问题???

我找到了与PhoneGap for BlackBerry相似的东西,建议的解决方案是使用

修改config.xml文件
<access subdomains="true" uri="http://www.mysite.com/" />

我尝试直接在index.html中添加此标记,但它不起作用。

iPhone是否有类似的方法?

非常感谢

5 个答案:

答案 0 :(得分:23)

我想我找到了解决方案,

在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。你可以在周围找到对这个link的引用,但我认为它不适用于使用0.9.5版本编写的应用程序,因为默认情况下Safari会被外部链接打开。

答案 1 :(得分:10)

对于在Android中遇到此问题的人:

我不了解早期版本,但在PhoneGap 1.1.0中,您可以创建一个名为 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>

答案 2 :(得分:2)

这是有效的 - 感谢克劳斯。也许某些应用程序需要比“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 CALL示例:

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

答案 3 :(得分:2)

在Android中,要解决在页面转换期间屏幕变黑的问题,从PhoneGap 1.1.0开始,您可以放置​​:

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

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

以下是对具有详细信息的PhoneGap论坛的参考:

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

答案 4 :(得分:1)

在Android中,您可以通过设置

在Web视图中打开外部链接
super.setBooleanProperty("loadInWebView", true);

在DroidGap活动中的super.loadUrl之前。

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

addWhiteListEntry("mydomain.com", true);