Как сохранить веб-приложение iPhone/iPad в полноэкранном режиме?
У меня есть приложение для iPad HTML5, которое работает в автономном режиме. Приложение по существу состоит из 4 файлов html и 3 файлов aspx. Мой манифест кэша настроен так, что только html файлы доступны в автономном режиме, а для файлов aspx требуется сетевое подключение. Все это отлично работает!
Теперь я дошел до того момента, когда я прикладываю последние штрихи к приложению и пытаюсь доработать значки на главном экране, работать в полноэкранном режиме и т.д. Я добавил то, что считаю необходимым мета-теги, чтобы приложение первоначально запускалось в полноэкранном режиме, как только оно было добавлено на главный экран. Причина, по которой я верю, что теги правильные, заключается в том, что приложение будет (правильно) запускаться и оставаться в полноэкранном режиме, если я перемещаюсь между страницами html вперед и назад. Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить приложение оставаться в полноэкранном режиме при нажатии одной из ссылок на сервер (aspx).
При нажатии ссылки на сервер (aspx) Mobile Safari выходит в полный режим браузера и открывает новое окно. Такое поведение неприемлемо, и я надеюсь, что мне не хватает чего-то простого здесь.
Вот метатеги, которые я использую на всех моих страницах (html + aspx):
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
Надеюсь, это обеспечит всю необходимую информацию, необходимую для понимания проблемы. Я видел другие ссылки здесь, в которых говорится, что ЛЮБАЯ страница, кроме закладки, помещенной на главной странице, заставляет некоторых людей выйти из полноэкранного режима. Это не проблема, которую я испытываю, поэтому я хотел начать новую дискуссию. Опять же, я чувствую, что если бы у меня было еще 5 html-страниц в приложении, это продолжало бы оставаться в полноэкранном режиме. Страницы aspx являются проблемой в моей ситуации.
Ответы
Ответ 1
Пусть компьютер выполняет утомительную работу, для чего они созданы.
Это часть кода javascript, которую я использую, чтобы не переписывать все мои ссылки. При этом в Safari откроются только те ссылки, у которых есть явный атрибут target = "_blank"
. Все остальные ссылки будут оставаться в веб-приложении.
var a=document.getElementsByTagName("a");
for(var i=0;i<a.length;i++) {
if(!a[i].onclick && a[i].getAttribute("target") != "_blank") {
a[i].onclick=function() {
window.location=this.getAttribute("href");
return false;
}
}
}
Ответ 2
Здесь есть плагин jQuery, который может помочь: https://github.com/mrmoses/jQuery.stayInWebApp
Его аналогичное решение для javascript, но имеет еще несколько функций. По умолчанию он будет прикрепляться ко всем ссылкам, но вы можете использовать его для присоединения к ссылкам с определенным классом или чем-то еще. Он также обнаруживает полноэкранный режим iOS, чтобы он не мешал другим браузерам и устройствам.
Ответ 3
По моему опыту, любая внешняя ссылка, похоже, заставляет приложение выпрыгивать из полноэкранного режима. Одним из решений является управление вашей навигацией с помощью javascript и объекта местоположения. Как показано ниже:
HTML:
<a href="javascript:navigator_Go('abc.aspx');">Go</a>
JavaScript:
function navigator_Go(url) {
window.location.assign(url); // This technique is almost exactly the same as a full <a> page refresh, but it prevents Mobile Safari from jumping out of full-screen mode
}
Я знаю, что мне больно перерабатывать ваши ссылки таким образом, но это единственный способ найти проблему, с которой вы столкнулись.
Ответ 4
Проблема с решением KPM заключается в том, что он взаимодействует со всеми ссылками на всех страницах вашего приложения, что иногда приводит к труднодоступным ошибкам, особенно если ваше приложение интенсивно ajax. Я нашел гораздо лучшее решение здесь на github.
Я использую код ниже для удобства:
(function(document,navigator,standalone) {
// prevents links from apps from oppening in mobile safari
// this javascript must be the first script in your <head>
if ((standalone in navigator) && navigator[standalone]) {
var curnode, location=document.location, stop=/^(a|html)$/i;
document.addEventListener('click', function(e) {
curnode=e.target;
while (!(stop).test(curnode.nodeName)) {
curnode=curnode.parentNode;
}
// Condidions to do this only on links to your own app
// if you want all links, use if('href' in curnode) instead.
if('href' in curnode && ( curnode.href.indexOf('http') || ~curnode.href.indexOf(location.host) ) ) {
e.preventDefault();
location.href = curnode.href;
}
},false);
}
})(document,window.navigator,'standalone');
Ответ 5
Решение, которое я установил, это Waypoints для обработки внутренних ссылок. Он имеет открытый() метод для внешних ссылок, который работает до iOS 6. После чего вам нужно другое исправление для iOS 7.
// Internal link handling
Waypoints
.intercept('a')
.ignore('a[rel=external], a[rel=blank], a[target=_blank], a[href$=".pdf"]');
// .resume();
// External link handling...
$('a').on('click', function(e) {
var href = $(this).attr('href');
if ($(this).is('a[rel=external], a[rel=blank], a[target=_blank], a[href$=".pdf"]') || (href.indexOf('http') >= 0 && href.indexOf(document.location.host) === -1)) {
e.preventDefault();
var link = this;
if (navigator.standalone) {
if (/iP(hone|od|ad) OS 7/.test(navigator.userAgent)) {
// iOS 7 external link polyfill
e.stopPropagation();
// Your custom dialog code for iOS 7 and external links
}
else {
Waypoints.open(href);
}
}
else {
window.open(href);
}
}
});
Там также Swipy.js вы должны проверить, он включает в себя путевые точки в качестве библиотеки, и я мог бы включить всю эту обработку ссылок и iOS 7 исправить, если это того стоит.
Ответ 6
Добавление этого файла в индекс сделает трюк.
<head>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-touch-fullscreen" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<script type"javascript="" text"="">
document.addEventListener(‘DOMContentLoaded’, function(){
var updateStatusBar = navigator.userAgent.match(/iphone|ipad|ipod/i) && navigator.appVersion.match(/OS (\d)/) && parseInt(navigator.appVersion.match(/OS (\d)/)[1], 10) >= 7 && window.navigator.standalone;
if (updateStatusBar) {
document.body.classList.add(‘platform-ios’);
document.body.classList.add(‘platform-cordova’);
}
});
</script>