{"id":1234,"date":"2014-03-11T11:00:58","date_gmt":"2014-03-11T10:00:58","guid":{"rendered":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?p=1234"},"modified":"2014-03-11T07:38:19","modified_gmt":"2014-03-11T06:38:19","slug":"numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/","title":{"rendered":"N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS"},"content":{"rendered":"<p>Como cada tres meses se acaba de publicar la revista de habla hispana dedicada a SharePoint: <a href=\"http:\/\/www.compartimoss.com\" target=\"_blank\">CompartiMOSS<\/a>. Un n\u00famero m\u00e1s he tenido la fortuna de escribir un art\u00edculo. El art\u00edculo es la explicaci\u00f3n de como implementamos las Aplicaciones de CompartiMOSS para Android e IOS.<br \/>\nEste nuevo numero esta plagado de grandes art\u00edculos como por ejemplo estos:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.compartimoss.com\/revistas\/numero-19\/buenas-practicas-en-infraestructura-en-sharepoint-2013-parte-1\" target=\"_blank\">Buenas pr\u00e1cticas en infraestructura en SharePoint 2013 &#8211; Parte 1<\/a>\u00a0by Miguel Tabera<\/li>\n<li><a href=\"http:\/\/www.compartimoss.com\/revistas\/numero-19\/renderizado-desde-el-lado-de-cliente-en-sharepoint-2013\" target=\"_blank\">Renderizado desde el lado de cliente en SharePoint 2013<\/a> por nuestro compa\u00f1ero Alberto D\u00edaz<\/li>\n<li><a href=\"http:\/\/www.compartimoss.com\/revistas\/numero-19\/analisis-de-soluciones-sharepoint-con-msocaf\" target=\"_blank\">An\u00e1lisis de soluciones SharePoint con MSOCAF <\/a>by Juan Carlos Gonz\u00e1lez<\/li>\n<\/ul>\n<p>Desde aqu\u00ed darle las gracias a los 4 directores : Alberto, Juan Carlos, Fabian y Gustavo por dejarme participar en la revista y sobre todo por el gran trabajo que hacen para que la revista salga cada tres meses.<br \/>\n<!--more--><\/p>\n<h2>Como se hicieron las Apps de CompartiMOSS para Android e iOS<\/h2>\n<p>\u200bA la hora de empezar a desarrollar una aplicaci\u00f3n para m\u00f3vil antes de empezar a escribir una l\u00ednea de c\u00f3digo, te tienes que hacer una serie de preguntas: \u00bfla vas a implementar para m\u00e1s de una plataforma? \u00bfNativa, hibrida o HTML5? Dependiendo de las respuestas que obtengas,  optar\u00e1s por una soluci\u00f3n u otra. <\/p>\n<p>En nuestro caso particular, a la primera pregunta, nuestra respuesta es S\u00cd. Entonces, como desarrolladores inquietos, lo que queremos es escribir una aplicaci\u00f3n que con el mismo c\u00f3digo fuente (o la mayor parte del mismo) nos pueda valer para ambas plataformas.  Para conseguir este objetivo, con una aplicaci\u00f3n HTML5 es suficiente. Ahora bien, a la hora de seleccionar un tipo de aplicaci\u00f3n, no solo tenemos que mirar el mayor reaprovechamiento de c\u00f3digo, sino que la aplicaci\u00f3n que vamos a desarrollar aproveche al m\u00e1ximo las caracter\u00edsticas del tel\u00e9fono. En el caso concreto de la aplicaci\u00f3n de CompartiMOSS no hace uso de hardware alguno del dispositivo (como la c\u00e1mara, la radio,\u2026). Como consecuencia cumple perfectamente con la opci\u00f3n de ser una aplicaci\u00f3n HTML5. En caso de que necesit\u00e1ramos hacer uso de alguna particularidad del tel\u00e9fono, como pueda ser utilizar la c\u00e1mara de fotos, ya valorar\u00edamos si implementamos una aplicaci\u00f3n hibrida o una aplicaci\u00f3n nativa. Una aplicaci\u00f3n hibrida puede ser de dos formas: una aplicaci\u00f3n HTML5 que utiliza un plugin implementado en nativo, o una aplicaci\u00f3n nativa que necesita utilizar alguna caracter\u00edstica HTML5 (hoy en d\u00eda las aplicaciones hibridas copan el 75% de las aplicaciones que hay en los STORE).  Y una aplicaci\u00f3n nativa es la que se implementa con el lenguaje para el sistema operativo por defecto de esta aplicaci\u00f3n: XAML y C# para Windows Phone, Java para Android y Objective-C para iOS.<\/p>\n<p>Qu\u00e9 beneficios aporta SharePoint a una aplicaci\u00f3n m\u00f3vil<\/p>\n<p>Una vez hemos decidido que vamos a implementar una aplicaci\u00f3n HTML5, el siguiente paso es ver c\u00f3mo obtener los datos de SharePoint. En el caso de SharePoint 2013, la respuesta es muy clara: haciendo peticiones a la API REST. En esta versi\u00f3n, casi cualquier elemento que hay en SharePoint tiene un punto para solicitar la informaci\u00f3n de esta forma: Site, Web, List, servicio de traducci\u00f3n, el servicio de b\u00fasqueda, etc. De esta forma, se facilita much\u00edsimo la vida a los desarrolladores y se ahorra mucho trabajo, ya que a la hora de implementar cualquier aplicaci\u00f3n m\u00f3vil hay que desarrollar un servicio para comunicar los datos con la aplicaci\u00f3n.<\/p>\n<p>En el caso de CompartiMOSS, como hemos visto en anteriores n\u00fameros, la visualizaci\u00f3n de informaci\u00f3n se apoya sobre las capacidades del servicio de b\u00fasqueda. Nosotros haremos lo mismo en las Apps m\u00f3viles: la informaci\u00f3n que vamos a mostrar se va a obtener utilizando peticiones API REST a este servicio.<\/p>\n<p>Otra de las grandes ventajas que tiene SharePoint para el desarrollo de m\u00f3vil, es que podemos utilizar las mismas im\u00e1genes que tenemos en la Web pero adapt\u00e1ndola tanto en tama\u00f1o del archivo como en medida. SharePoint  2013 incluye una caracter\u00edstica que se llama Representaci\u00f3n de Im\u00e1genes que nos ayuda a optimizar la entrega de im\u00e1genes, manteniendo en cach\u00e9 una versi\u00f3n optimizada de la misma en diferentes tama\u00f1os. \u00bfEsto qu\u00e9 quiere decir? Que dentro de esta caracter\u00edstica podemos definir un nuevo tipo de imagen como carrusel en la que disponemos de un alto y ancho, tal y como nos han indicado nuestros dise\u00f1adores. Y en el momento de realizar la llamada a la imagen, le indicamos que nos la muestre con el renderizado indicado. De esta forma, las tareas de pensar si tenemos que tener una biblioteca para las im\u00e1genes de m\u00f3vil, o bien, pensar alg\u00fan mecanismo para que las im\u00e1genes que est\u00e1n alojadas en una determinada biblioteca y son muy pesadas se puedan representar en una aplicaci\u00f3n m\u00f3vil lo tenemos resuelto.<\/p>\n<p>Para que esta caracter\u00edstica funcione hay que seguir los siguientes pasos:<\/p>\n<p>Activar la \u00abBlob Cache\u00bb en nuestro sitio Web. Para activarla tenemos que dirigirnos al web.config y en la entrada donde pone \u00abAdministraci\u00f3n de Im\u00e1genes\u00bb.<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen1.png\" width=\"1125\" height=\"255\" class=\"alignnone\" \/> <\/p>\n<p>Ahora bien, \u00bfc\u00f3mo debemos llamar a la imagen para que tenga estas caracter\u00edsticas? Pues concatenando a la URL de la imagen el par\u00e1metro \u00ab?RenditionID=Numero\u00bb donde Numero es el identificador que est\u00e1 en el apartado anterior. En caso de que necesitemos un tama\u00f1o que no est\u00e9 definido por defecto tambi\u00e9n tenemos la posibilidad de pasarle los par\u00e1metros a la imagen de la siguiente forma: \u00ab?width=150&amp;heigth=100\u2033 Los dos par\u00e1metros no son obligatorios, podemos indicar solamente el alto o el ancho y el mismo se encarga de proporcionarla en base a ese valor.<br \/>\nSiguientes pasos<\/p>\n<p>Una vez que se han explicado todos los aspectos que vamos a utilizar de SharePoint 2013 para crear la APP, queda el proceso de ponerse a desarrollar la aplicaci\u00f3n. Al haber decidido implementar una APP HTML5, el primer paso es buscar una herramienta con la que podamos trabajar de una forma simple. En la actualidad hay muchos Frameworks JavaScript que generan el c\u00f3digo HTML5 como hemos visto en anteriores n\u00fameros ExtJS, Kendo UI,  u otros conocidos como son AngularJS, Blackbone. Ahora bien, el decidir entre uno u otro depende m\u00e1s de lo evolucionados que est\u00e9n para dispositivos m\u00f3viles y en este caso ExtJS tiene una parte de su Framework dedicado a la movilidad llamado Sencha Touch (adem\u00e1s de que disponemos de un IDE Sencha Arquitect para facilitarnos a\u00fan m\u00e1s el trabajo).<\/p>\n<p><strong>Sencha Touch<\/strong><\/p>\n<p>De la misma forma que ocurre con ExtJS, Sencha Touch facilita mucho la creaci\u00f3n de APPs, de prototipos de aplicaci\u00f3n y dispone de una arquitectura MVC en la que se basan las aplicaciones que se construyen. Bas\u00e1ndonos en esta arquitectura, por un lado, nos vamos a crear los Modelos. Una vez tengamos los modelos creados, nos crearemos la comunicaci\u00f3n con SharePoint y crearemos la vista que se renderizar\u00e1 en los dispositivos m\u00f3viles.<\/p>\n<p>Los modelos en esta aplicaci\u00f3n est\u00e1 claro que son: Revistas, Art\u00edculos y Autores. Su definici\u00f3n dentro de la plataforma quedar\u00eda de la siguiente forma:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nExt.define('CompartiMOSS.model.revistaModel', {\r\n    extend: 'Ext.data.Model',\r\n  \r\n    config: {\r\n        fields: &#x5B;\r\n            {\r\n                mapping: 'Cells.results&#x5B;5].Value',\r\n                name: 'Title'\r\n            },\r\n            {\r\n                mapping: 'Cells.results&#x5B;2].Value',\r\n                name: 'Portada'\r\n            },\r\n            {\r\n                mapping: 'Cells.results&#x5B;6].Value',\r\n                name: 'Editorial'\r\n            },\r\n            {\r\n                mapping: 'Cells.results&#x5B;4].Value',\r\n                name: 'LinkUrl'\r\n            },\r\n            {\r\n                mapping: 'Cells.results&#x5B;7].Value',\r\n                name: 'Number'\r\n            }\r\n        ]\r\n    }\r\n});\r\n<\/pre>\n<p>Este c\u00f3digo no tiene ninguna complicaci\u00f3n. Por un lado est\u00e1 el nombre del campo c\u00f3mo lo vamos a llamar dentro de nuestro Modelo y, por otro lado, nos da la opci\u00f3n de mapearlo con la petici\u00f3n a la API REST de forma que podamos definir el nombre tal y como queremos, y no como nos lo devuelva la API REST.<\/p>\n<p>Una vez ya tenemos definido el modelo, el siguiente paso es crear un \u00abStore\u00bb. Un store es un objeto que se encarga almacenar los datos en el lado del cliente, a trav\u00e9s de peticiones a un proxy se encarga de enviar la informaci\u00f3n en ambos lados. En el caso particular de estas APPs solamente utilizamos la funcionalidad de leer los datos del servidor ya que la informaci\u00f3n solamente es un \u00fanico sentido.   Este proxy que se encarga de la comunicaci\u00f3n puede ser de diversos tipos AJAX, JSON, JSONP, XML, REST\u2026 en el supuesto que ninguno encaje con nuestros requerimientos siempre podremos desarrollar un proxy para establecer esta comunicaci\u00f3n. En nuestro caso con un simple proxy \u00abAjax\u00bb ser\u00eda suficiente. Para configurarlo s\u00f3lo tenemos que configurar la URL donde vamos a solicitar los datos (la llamada API REST) y por otro lado, indicar el modelo en el que queremos mostrar los datos. Un ejemplo de Store utilizado seria el siguiente:<\/p>\n<p>Ext.define(&#8216;CompartiMOSS.store.revistaStore&#8217;, {<br \/>\n    extend: &#8216;Ext.data.Store&#8217;,<\/p>\n<p>    requires: [<br \/>\n        &#8216;CompartiMOSS.model.revistaModel&#8217;<br \/>\n    ],<\/p>\n<p>    config: {<br \/>\n        model: CompartiMOSS.model.revistaModel&#8217;,<br \/>\n        storeId: &#8216;revistaStore&#8217;,<br \/>\n        proxy: {<br \/>\n            type: &#8216;ajax&#8217;,<br \/>\n            url: &#8216;http:\/\/www.compartimoss.com\/_api\/search\/query?&#8230;..,<br \/>\n            reader: {<br \/>\n                type: &#8216;json&#8217;,<br \/>\n                rootProperty: &#8216;d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results&#8217;<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n});<\/p>\n<p>Dentro de la configuraci\u00f3n del Store, indicamos el tipo de Proxy que vamos a utilizar, en este caso una simple llamada \u00abAjax\u00bb, la URL a la que vamos a realizar la petici\u00f3n y dentro de la lectura indicamos el nodo a partir del cual est\u00e1n los datos. En este caso la petici\u00f3n est\u00e1 en el quinto nivel. \u00bfQu\u00e9 ocurre si indicamos mal est\u00e1 propiedad? En caso de que no lo indiquemos correctamente no se mostrar\u00e1n los resultados tal y como esperamos. Si por ejemplo, ponemos un nivel menos solamente nos mostraran los registros que tenemos a ese nivel y naturalmente, tampoco casar\u00e1n los resultados que estamos esperando con nuestro modelo.<\/p>\n<p><strong>Dise\u00f1o de la APP<\/strong><\/p>\n<p>Con el modelo y los datos vinculados, queda la parte m\u00e1s dif\u00edcil para los desarrolladores que es la representaci\u00f3n de los datos. Para ello hemos utilizado diversos componentes que est\u00e1n incluidos dentro del Framework, unido con Sencha Architect (que nos proporciona la visi\u00f3n de como se muestra el resultado en el tama\u00f1o del m\u00f3vil).  Una visi\u00f3n de este IDE es la siguiente imagen:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen2.png\" width=\"684\" height=\"538\" class=\"alignnone\" \/><br \/>\nSencha Touch contiene bastantes componentes para facilitarnos el desarrollo, desde una Toolbar, Button, Panel, TextBox, TextData, Validator, etc. De todos estos componentes, el que m\u00e1s hemos utilizados ha sido Ext.DataView.List que es un componente que se encarga de mostrar los elementos almacenados en un Store. Pero su mayor virtud es que a este componente le podemos a\u00f1adir un template para indicar como queremos visualizar cada elemento de forma que quede tal y como el dise\u00f1ador quiere.  En nuestro caso tenemos dos tipos de templates: uno para mostrar las revistas y otro visualizar los art\u00edculos que componen la revista. Ambos quedan de la siguiente forma:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;div class=&quot;divCompartiMOSSMagazineNumber&quot; &gt;  \r\n               &lt;div class=&quot;divPicture&quot; &gt;   \r\n                            &lt;a href=&quot;#&quot; &gt;\r\n                                           &lt;img class=&quot;portada&quot; src='{Portada:this.Transform33}' height=200px width=135px\/&gt;\r\n         &lt;\/a&gt;\r\n               &lt;\/div&gt; \r\n               &lt;div class=&quot;divOverlay&quot; style=&quot;top: 150px;&quot;&gt;  \r\n                            &lt;a class=&quot;linkOverlay&quot; href=&quot;#&quot;&gt;      \r\n                                          &lt;h2 class=&quot;ms-noWrap&quot; &gt;{Title:this.TituloEditorial2}&lt;\/h2&gt;   \r\n                            &lt;\/a&gt;    \r\n               &lt;\/div&gt;    \r\n&lt;\/div&gt;\r\n<\/pre>\n<p>Dentro del Template podemos a\u00f1adir diversas funciones a la hora de que se muestre el elemento. Porque es muy \u00fatil esta funci\u00f3n. En nuestro caso cuando solicitamos las im\u00e1genes a SharePoint, la URL donde est\u00e1n almacenados nos devuelven una URL relativa es decir independientemente de donde est\u00e1 el servidor. La API REST supone que siempre la estamos utilizando dentro del contexto de SharePoint por lo cual tenemos que buscar alternativas para conseguir visualizar estas im\u00e1genes. En nuestro caso con a\u00f1adir la siguiente funci\u00f3n es suficiente:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nFunction Transform33(value)\r\n{\r\nvar cadena = value.split(' ');\r\nvar resultado;\r\nvar maxLength=cadena.length;\r\nfor (var i=0;i&lt;maxLength;i++)\r\n{\r\n    if (cadena&#x5B;i].indexOf('src=')&gt;-1)  \r\n    {\r\n        resultado=cadena&#x5B;i];\r\n        resultado= resultado.replace('src=&quot;','src=&quot;http:\/\/www.compartimoss.com');\r\n        resultado= resultado.replace('src=','');\r\n        resultado= resultado.replace('&quot;','');       \r\n        resultado=resultado.replace('&quot;','');\r\n    }\r\n}\r\nresultado.replace('&lt;br&gt;','');\r\nreturn resultado;\r\n}\r\n<\/pre>\n<p><strong>Depuraci\u00f3n de  la Aplicaci\u00f3n<\/strong><\/p>\n<p>Antes de generar la aplicaci\u00f3n, tendremos que probar que su funcionamiento es correcto.  Dado que lo que tenemos es una aplicaci\u00f3n HTML5 el resultado lo podremos depurar y testear con cualquier navegador moderno. Sin embargo, tenemos un problema y que no es otro que el hecho de que estemos realizando llamadas a URLs de SharePoint, lo que provoca que el navegador las bloquee debido a que son llamadas fuera del dominio (\u00abproblema de CORS\u00bb).<\/p>\n<p>Para solucionarlo tenemos dos opciones:<\/p>\n<p>Desplegar la soluci\u00f3n en un IIS \/ Apache o servidor web y permitir las llamadas de este servidor.<br \/>\nConfigurar nuestro navegador para permitir todas las llamadas. Por ejemplo en Chrome tendr\u00edamos que abrir el navegador a\u00f1adiendo el par\u00e1metro \u2013disable-web-security.<br \/>\nUso de PhoneGap<\/p>\n<p>Con la aplicaci\u00f3n HTML5 generada queda la forma de generar la aplicaci\u00f3n en la plataforma en la que la queremos desplegar. Para generar la aplicaci\u00f3n hemos utilizado PhoneGap. \u00bfQu\u00e9 es PhoneGap? Es un Framework que permite a los desarrolladores web enfocarse en el desarrollo para dispositivos m\u00f3viles teniendo como base un c\u00f3digo gen\u00e9rico con herramientas tales como JavaScript, HTML, CSS, y creando una interfaz de funciones for\u00e1neas para embeber una vista Web en el dispositivo m\u00f3vil.<\/p>\n<p><strong>Generaci\u00f3n de la APP de Android<\/strong><\/p>\n<p>PhoneGap genera unos proyectos que  dependen de la plataforma de destino. En nuestro caso vamos a comenzar creando la aplicaci\u00f3n para Android de la siguiente forma:<\/p>\n<p>Ir a la direcci\u00f3n donde hemos descargado PhoneGap.<br \/>\nIr al directorio lib\/Android\/bin<br \/>\nIntroducir create \u00abPathDonde vamos a dejar el proyecto\u00bb PackageName NameApp<br \/>\nEl siguiente paso es abrir este proyecto. Para ello hemos utilizado la versi\u00f3n de Eclipse ADT que est\u00e1 preparada para el desarrollo de Android, se puede descargar desde el enlace http:\/\/developer.android.com\/sdk\/installing\/bundle.html.<\/p>\n<p>El proyecto tiene la siguiente estructura (muy semejante a una aplicaci\u00f3n dentro de un servidor web):<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen3.png\" width=\"229\" height=\"307\" class=\"alignnone\" \/><\/p>\n<p>En  el proyecto dentro de la carpeta de Assets, hay una carpeta www en la que a\u00f1adiremos el proyecto desarrollado en Sencha previamente.<\/p>\n<p>Desplegamos la aplicaci\u00f3n para realizar algunos ajustes dentro del proyecto de Android.  Por una parte, tenemos que configurar los iconos que queremos mostrar en la aplicaci\u00f3n y la pantalla de bienvenida. Adem\u00e1s de estos aspectos m\u00e1s est\u00e9ticos hay que configurar diversos par\u00e1metros dependiendo de la versi\u00f3n de Android en la que deseamos publicar la APP. Debido al fragmentamiento que tiene Android y que es uno de los grandes problemas de esta plataforma (o virtudes) seg\u00fan quien lo mire, optamos por establecer el Framework m\u00ednimo en 4.0 para evitar arrastrar algunos problemas de rendimiento en este tipo de aplicaciones.  Estos problemas son principalmente de consumo de memoria RAM, lo que hace que estas aplicaciones fueran inestables y el rendimiento era muy malo.  El fichero de configuraci\u00f3n al final queda de la siguiente forma:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen4.png\" width=\"961\" height=\"516\" class=\"alignnone\" \/><\/p>\n<p>Creaci\u00f3n de la APP para iOS<\/p>\n<p>Para la creaci\u00f3n de la APP para iOS es obligatorio realizarla desde un ordenador MAC. Una vez dentro del MAC creamos el proyecto PhoneGap de una forma muy similar a la versi\u00f3n en Android, pero seleccionando un proyecto de tipo iOS.<\/p>\n<p>Realizaremos la misma secuencia que en la versi\u00f3n de Android, que es a\u00f1adir nuestro proyecto de Sencha dentro de la carpeta de Assets.<\/p>\n<p>Para finalizar, indicaremos en que versiones de sistemas operativos y en qu\u00e9 dispositivos (iPhone o iPad) se va a distribuir la aplicaci\u00f3n.<\/p>\n<p><strong>Depuraci\u00f3n de la Aplicaci\u00f3n en el dispositivo<\/strong><\/p>\n<p>Probando en los diversos emuladores, quiz\u00e1s observamos un comportamiento diferente al que ten\u00eda en nuestro entorno web. \u00bfPor qu\u00e9 puede ser? La principal diferencia puede ser en temas de estilos, porque al final estamos visualizando las aplicaciones en navegadores distintos a Chromium para Android y Safari para iOS por lo cual tendremos que lidiar con problemas ya de sobra conocidos para los desarrolladores web. Ahora bien tambi\u00e9n existen diversos problemas como puede ser el comportamiento de la aplicaci\u00f3n, para ello hay herramientas para poder depurar de forma remota estas APP. Para m\u00e1s informaci\u00f3n sobre esta utilidad recomiendo los siguientes enlaces:<\/p>\n<p>http:\/\/www.2ality.com\/2011\/12\/shim-vs-polyfill.html<br \/>\nhttps:\/\/github.com\/SuperSkunk\/cordova-shim<br \/>\nhttps:\/\/developers.google.com\/chrome-developer-tools\/docs\/mobile-emulation?hl=es<\/p>\n<p><strong>Publicaci\u00f3n de las APPs<\/strong><\/p>\n<p>El siguiente paso es subirlas a cada Store correspondiente. Ambos Store son bastante distintos, por un lado la tienda de Android no tiene ning\u00fan tipo de control. Lo que hace que las posibles aplicaciones que hay en este mercado son de una calidad muy baja. Por el contrario, la tienda de Apple tiene todo tipo de control, y el proceso de tener una aplicaci\u00f3n en el Store cuesta relativamente mucho m\u00e1s tiempo, en nuestro caso particular tardo m\u00e1s de 20 d\u00edas en ser revisada la aplicaci\u00f3n.<\/p>\n<p><strong>Conclusi\u00f3n<\/strong><\/p>\n<p>SharePoint y el desarrollo para dispositivos m\u00f3viles es algo que tradicionalmente no ha ido muy de la mano, quiz\u00e1s por la tardanza de la propia Microsoft en entrar dentro del mundo de los Smartphone. Pero una vez se han dado cuenta de sus carencias han evolucionado mucho el producto para que todo el mundo pueda acceder al contenido de SharePoint independientemente de la marca del dispositivo que lo renderiza. Pero como la gran herramienta que es, no se conforma solamente con que podamos visualizar sino que proporciona diversas utilidades para facilitar el desarrollo de aplicaciones m\u00f3viles y brinde a los partner de Microsoft muchas oportunidades para hacer de SharePoint la piedra angular de la empresa, algo que distingue a SharePoint de su competencia.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>Como cada tres meses se acaba de publicar la revista de habla hispana dedicada a SharePoint: CompartiMOSS. Un n\u00famero m\u00e1s he tenido la fortuna de escribir un art\u00edculo. El art\u00edculo es la explicaci\u00f3n de como implementamos las Aplicaciones de CompartiMOSS &hellip; <a href=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[95],"tags":[97,60,96,19,154],"class_list":["post-1234","post","type-post","status-publish","format-standard","hentry","category-sharepoint-everywhere","tag-android","tag-compartimoss","tag-ios","tag-javascript","tag-sharepoint-everywhere"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS - Desarrollando sobre SharePoint<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS - Desarrollando sobre SharePoint\" \/>\n<meta name=\"twitter:description\" content=\"Como cada tres meses se acaba de publicar la revista de habla hispana dedicada a SharePoint: CompartiMOSS. Un n\u00famero m\u00e1s he tenido la fortuna de escribir un art\u00edculo. El art\u00edculo es la explicaci\u00f3n de como implementamos las Aplicaciones de CompartiMOSS &hellip; Continue reading &rarr;\" \/>\n<meta name=\"twitter:image\" content=\"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen1.png\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adri\u00e1n D\u00edaz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/\"},\"author\":{\"name\":\"Adri\u00e1n D\u00edaz\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"headline\":\"N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS\",\"datePublished\":\"2014-03-11T10:00:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/\"},\"wordCount\":3076,\"commentCount\":1,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.compartimoss.com\\\/PublishingImages\\\/Numero19\\\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\\\/imagen1.png\",\"keywords\":[\"android\",\"compartimoss\",\"ios\",\"JavaScript\",\"sharepoint everywhere\"],\"articleSection\":[\"sharepoint everywhere\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/\",\"name\":\"N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS - Desarrollando sobre SharePoint\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.compartimoss.com\\\/PublishingImages\\\/Numero19\\\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\\\/imagen1.png\",\"datePublished\":\"2014-03-11T10:00:58+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\\\/#primaryimage\",\"url\":\"http:\\\/\\\/www.compartimoss.com\\\/PublishingImages\\\/Numero19\\\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\\\/imagen1.png\",\"contentUrl\":\"http:\\\/\\\/www.compartimoss.com\\\/PublishingImages\\\/Numero19\\\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\\\/imagen1.png\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/\",\"name\":\"Desarrollando sobre SharePoint\",\"description\":\"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\",\"name\":\"Adri\u00e1n D\u00edaz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"caption\":\"Adri\u00e1n D\u00edaz\"},\"description\":\"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/author\\\/desarrollandosobresharepoint\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS - Desarrollando sobre SharePoint","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/","twitter_card":"summary_large_image","twitter_title":"N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS - Desarrollando sobre SharePoint","twitter_description":"Como cada tres meses se acaba de publicar la revista de habla hispana dedicada a SharePoint: CompartiMOSS. Un n\u00famero m\u00e1s he tenido la fortuna de escribir un art\u00edculo. El art\u00edculo es la explicaci\u00f3n de como implementamos las Aplicaciones de CompartiMOSS &hellip; Continue reading &rarr;","twitter_image":"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen1.png","twitter_misc":{"Escrito por":"Adri\u00e1n D\u00edaz","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/"},"author":{"name":"Adri\u00e1n D\u00edaz","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"headline":"N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS","datePublished":"2014-03-11T10:00:58+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/"},"wordCount":3076,"commentCount":1,"image":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/#primaryimage"},"thumbnailUrl":"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen1.png","keywords":["android","compartimoss","ios","JavaScript","sharepoint everywhere"],"articleSection":["sharepoint everywhere"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/","name":"N\u00famero 19 CompartiMOSS: Como se hicieron las Apps de CompartiMOSS para Android e iOS - Desarrollando sobre SharePoint","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/#primaryimage"},"thumbnailUrl":"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen1.png","datePublished":"2014-03-11T10:00:58+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/numero-19-compartimoss-como-se-hicieron-las-apps-de-compartimoss-para-android-e-ios\/#primaryimage","url":"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen1.png","contentUrl":"http:\/\/www.compartimoss.com\/PublishingImages\/Numero19\/Como-se-hicieron-las-Apps-de-CompartiMOSS-para-Android-e-iOS\/imagen1.png"},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/","name":"Desarrollando sobre SharePoint","description":"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb","name":"Adri\u00e1n D\u00edaz","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","caption":"Adri\u00e1n D\u00edaz"},"description":"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/author\/desarrollandosobresharepoint\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/1234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/comments?post=1234"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/1234\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/media?parent=1234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/categories?post=1234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/tags?post=1234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}