{"id":220,"date":"2011-03-23T19:24:53","date_gmt":"2011-03-23T17:24:53","guid":{"rendered":"http:\/\/webposible.com\/xposible\/?p=220"},"modified":"2011-03-28T09:32:41","modified_gmt":"2011-03-28T07:32:41","slug":"vinculos-en-aplicaciones-moviles-para-ios","status":"publish","type":"post","link":"http:\/\/webposible.com\/xposible\/2011\/vinculos-en-aplicaciones-moviles-para-ios\/","title":{"rendered":"V\u00ednculos en aplicaciones m\u00f3viles para iOS"},"content":{"rendered":"<p>Ahora mismo estoy cacharreando un poco con aplicaciones m\u00f3viles para iOS.<\/p>\n<p>Se puede hacer una aplicaci\u00f3n web para iOS con <acronym title=\"HyperText Markup Language\" xml:lang=\"en\">HTML<\/acronym>, <acronym title=\"Cascading Style Sheet\" xml:lang=\"en\">CSS<\/acronym> y Javascript, y se indica mediante algunos elementos meta. Aqu\u00ed va un peque\u00f1o resumen:<\/p>\n<ul>\n<li><code>&lt;meta name=\"apple-mobile-web-app-capable\" content=\"yes\" \/&gt;<\/code> Da la opci\u00f3n al dispositivo iOS a\u00f1adir a la pantalla de inicio, junto con el resto de las aplicaciones, un acceso directo a una aplicaci\u00f3n web. Ojo que no es lo mismo que un acceso directo que abre Safari con la interfaz habitual del navegador.<\/li>\n<li><code>&lt;meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\" \/&gt;<\/code> Permite quitar de la interfaz los elementos propios del navegador (la barra de la direcci\u00f3n y el buscador arriba, y la barra de navegaci\u00f3n, favoritos e historial abajo). S\u00f3lo deja visible la barra de estado (cobertura, hora y bater\u00eda). Tiene tres posibles valores <code>default<\/code> (de azul iOS), <code>black<\/code> y <code>black-translucent<\/code>.<\/li>\n<li><code>&lt;link rel=\"apple-touch-icon\" href=\"touch-icon-iphone.png\" \/&gt;<\/code> permite elegir el icono (57&#215;57 en formato PNG) para la pantalla de inicio. Sirve tanto para aplicaciones web como para simples accesos directos a una p\u00e1gina web.<\/li>\n<li><code>&lt;link rel=\"apple-touch-startup-image\" href=\"\/startup.png\" \/&gt;<\/code> incluye una imagen previa a la aplicaci\u00f3n web.<\/li>\n<\/ul>\n<p>No hablo del famoso <code>viewport<\/code>, aunque personalmente echo de menos la posibilidad de usar una etiqueta para que mantenga la proporci\u00f3n en las vistas vertical y apaisada.<\/p>\n<p>Bueno, siguiendo estas claras instrucciones &#8211; risas de fondo &#8211; tenemos los primeros elementos para hacer una aplicaci\u00f3n web. Qu\u00e9 modernos.<\/p>\n<p>Y ahora viene una curiosidad, que puede tener su sentido, pero resulta chocante: cuando tocamos un v\u00ednculo, abre una nueva instancia del navegador, pero esta vez aparece los elementos de la interfaz \u00abnormal\u00bb (barra de estado, adem\u00e1s de la barra de la direcci\u00f3n y la de navegaci\u00f3n-favoritos). \u00bfQu\u00e9 ocurre? \u00bfQu\u00e9 hemos hecho mal?<\/p>\n<p>La respuesta es&#8230; nada. Simplemente los v\u00ednculos no funcionan como tales en una aplicaci\u00f3n web dentro de iOS. Act\u00faan como una especie de <code>window.open<\/code>. \u00bfSoluci\u00f3n? Un poco de javascript. Aqu\u00ed va un ejemplo de jquery:<\/p>\n<pre><code>\r\n$(document).ready(function() {\r\n\tvar deviceAgent = navigator.userAgent.toLowerCase();\r\n\tvar ios = deviceAgent.match(\/(iphone|ipod|ipad)\/);\r\n\tif (ios) {\r\n\t\t$(\"a\").click(function(event) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tvar direccion=$(this).attr(\"href\");\r\n\t\t\tlocation.href=direccion;\r\n\t\t});\r\n\t};\r\n});\r\n<\/code><\/pre>\n<p>Por si el c\u00f3digo no resulta demasiado trivial, mediante el agente de usuario discriminamos a los dispositivos con sistema operativo iOS, eliminamos el comportamiento por defecto de los v\u00ednculo, y le a\u00f1adimos la <code>url<\/code> del <code>href<\/code> a un <code>location.href<\/code> de javascript que s\u00ed funciona. En este caso podr\u00edamos tener una aplicaci\u00f3n web compuesta por varias p\u00e1ginas <acronym title=\"HyperText Markup Language\" xml:lang=\"en\">HTML<\/acronym>.<\/p>\n<p>Teniendo en cuenta lo anterior, cabr\u00eda preguntarse:<\/p>\n<ul>\n<li>\u00bfQuieres un acceso directo a la p\u00e1gina de inicio definiendo la imagen t\u00fa mismo (y que no salga un pantallazo)? Usa <code>apple-touch-icon<\/code>.<\/li>\n<li>\u00bfQuieres que no se vea la barra de la direcci\u00f3n inicialmente? Prueba con <code>window.scrollTo(0,1);<\/code> e inicialmente no se ver\u00e1 (aunque estar\u00e1 presente).<\/li>\n<li>\u00bfQuieres reutilizar una web como una aplicaci\u00f3n web en iOS (m\u00e1s <em>cool<\/em>) con su imagen de bienvenida &#8211; tan \u00fatil ella -, y sin elementos de la interfaz en el navegador? Pues mucho cuidado con los v\u00ednculos, y recuerda el c\u00f3digo anterior para los v\u00ednculos internos de la aplicaci\u00f3n web. No quedar\u00eda bien que al tocar un v\u00ednculo, se abra una nueva ventana. Nada bien.<\/li>\n<\/ul>\n<p>Cambiando un poco de tema, ya hay bastantes voces (con m\u00e1s o menos autoridad) que dicen que las aplicaciones desarrolladas espec\u00edficamente para un sistema operativo (<span xml:lang=\"en\">Android, iOS, Blackberry, Symbian, Windows Phone<\/span>,&#8230;) est\u00e1n viviendo su momento de gloria ahora, y en unos a\u00f1os, ser\u00e1 sustitu\u00eddo por aplicaciones webs (teoricamente menos tiempo de desarrollo, y actualizaciones m\u00e1s r\u00e1pidas). Todo depende de los avances en las aplicaciones web m\u00f3viles y su implementaci\u00f3n (ver <a href=\"http:\/\/www.w3.org\/2011\/02\/mobile-web-app-state.html\">Standards for Web Applications on Mobile: February 2011 current state and roadmap<\/a>).Ya veremos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ahora mismo estoy cacharreando un poco con aplicaciones m\u00f3viles para iOS. Se puede hacer una aplicaci\u00f3n web para iOS con HTML, CSS y Javascript, y se indica mediante algunos elementos meta. Aqu\u00ed va un peque\u00f1o resumen: &lt;meta name=\u00bbapple-mobile-web-app-capable\u00bb content=\u00bbyes\u00bb \/&gt; Da la opci\u00f3n al dispositivo iOS a\u00f1adir a la pantalla de inicio, junto con el [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16],"tags":[],"_links":{"self":[{"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/posts\/220"}],"collection":[{"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/comments?post=220"}],"version-history":[{"count":3,"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/posts\/220\/revisions"}],"predecessor-version":[{"id":222,"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/posts\/220\/revisions\/222"}],"wp:attachment":[{"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/media?parent=220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/categories?post=220"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/webposible.com\/xposible\/wp-json\/wp\/v2\/tags?post=220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}