PhoneGap для iPhone: проблема с загрузкой внешнего URL
Я пишу приложение для 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 ответов
Я думаю, что нашел решение,
в файле.m делегата приложения PhoneGap {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 открывается для внешних ссылок по умолчанию.
Для людей, имеющих эту проблему в 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://stackru.com" subdomains="true" />
</phonegap>
Это работает - спасибо, Клаус. Возможно, некоторые приложения должны быть более разборчивыми, чем просто "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");
В 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
В Android вы можете сделать внешние ссылки, чтобы открыть внутри веб-просмотра, установив
super.setBooleanProperty("loadInWebView", true);
перед super.loadUrl в вашей активности DroidGap.
Это сделало бы каждую внешнюю ссылку открытой в веб-обзоре. Если вы хотите открыть только определенные домены в веб-представлении, используйте вместо этого addWhiteListEntry. Пример:
addWhiteListEntry("mydomain.com", true);