26

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

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

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

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

之后,我尝试使用 AJAX 请求替换页面内容,使用 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();
}

现在,从 onBodyLoad() 内部调用:

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

在 PhoneGap Container 中打开链接,这很好。关键是我想加载一个用 Python 编写的动态页面

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

此时没有调用 Safari,但在 PhoneGap 容器中显示了一个黑页!!我想指出,如果我在 Safari 中键入该链接,它就可以正常工作(我不能报告它的隐私问题)。

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

我发现了与 BlackBerry 的 PhoneGap 类似的东西,建议的解决方案是修改 config.xml 文件

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

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

iPhone有类似的方法吗?

非常感谢

4

5 回答 5

23

我想我找到了解决方案

在 PhoneGap Application Delegate .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 容器中的所有外部链接!!!

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

于 2011-05-09T09:06:46.407 回答
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>
于 2011-10-14T13:46:52.320 回答
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 调用示例:

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

于 2011-09-23T13:06:14.727 回答
2

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

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

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

以下是包含详细信息的 PhoneGap 讨论论坛的参考:

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

于 2011-10-19T01:50:33.563 回答
1

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

super.setBooleanProperty("loadInWebView", true);

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

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

addWhiteListEntry("mydomain.com", true);
于 2011-10-15T16:44:30.247 回答