PhoneGap для iPhone: проблема с загрузкой внешнего URL - PullRequest
26 голосов
/ 06 мая 2011

Я пишу приложение для iPad с использованием PhoneGap и хочу загрузить внешний URL-адрес без запуска Safari или использования внутреннего веб-браузера, такого как ChildBrowser.

Я использую пример проекта 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, что нормально. Дело в том, что я хочу загрузить динамическую страницу , написанную на Python

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

В этот момент Safari не вызывается, но отображается черная страница в контейнере PhoneGap !! Хочу отметить, что ссылка отлично работает, если я набираю ее в Safari (я не могу сообщить о ней по вопросам конфиденциальности).

Может быть, это проблема, связанная с каким-то необходимым разрешением ???

Я обнаружил нечто подобное относительно PhoneGap для BlackBerry, и предлагаемое решение заключалось в изменении файла config.xml с помощью

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

Я пытался добавить этот тег прямо в мой index.html, но он не работает.

Есть ли подобный подход для iPhone ??

Большое спасибо

Ответы [ 5 ]

23 голосов
/ 09 мая 2011

Я думаю, что нашел решение,

в файле делегата приложения 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 !!!

пс. Вокруг вы найдете ссылки на эту ссылку , но я думаю, что она не работает для приложений, написанных с использованием версии 0.9.5, поскольку Safari открывается для внешних ссылок по умолчанию.

10 голосов
/ 14 октября 2011

Для людей, имеющих эту проблему в 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 голосов
/ 19 октября 2011

В Android, чтобы обойти проблему с черным экраном во время переходов страниц, начиная с PhoneGap 1.1.0, вы можете поместить:

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

перед super.loadUrl в методе onCreate ()вашей активности в DroidGap.

Вот ссылка на дискуссионный форум PhoneGap, в которой есть подробности:

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

2 голосов
/ 23 сентября 2011

Это работает - спасибо, Клаус.Возможно, некоторые приложения должны быть более разборчивыми, чем просто «http» и «https».

Я проделал аналогичную работу с PhoneGap Android, см. Ниже.Укажите интерфейс (который я называю здесь EXTERNALLINK), вызовите loadExternalLink из javascript, затем загрузите этот 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");

1 голос
/ 15 октября 2011

В Android вы можете сделать внешние ссылки открытыми внутри веб-просмотра, установив

super.setBooleanProperty("loadInWebView", true);

перед super.loadUrl в вашей активности DroidGap.

Это будет делать каждую внешнюю ссылку открытойвеб-просмотр.Если вы хотите открыть только определенные домены в веб-представлении, используйте addWhiteListEntry .Пример:

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