Permitir que un cliente responda a las reseñas de usuarios en las apps

Hoy hablaremos de un problema que me he encontrado en el trabajo, y es el de saber cómo un cliente puede responder a las reseñas que los usuarios le realizan de las apps que hemos realizado para ellos.

Permisos a la cuenta en android

En android la verdad es que ha sido muy sencillo. Adjunto dos pantallazos en donde se verá muy fácilmente los pasos a seguir para poder hacerlo desde el panel de administración de play.google.com/apps/publish.

Android, dar acceso a responder comentarios

Android, dar acceso a responder comentarios 2

Ios

Olvídate de que sea como en Android, aquí no se pueden responder reseñas por muy injustas que sean o por muy inexactas que parezcan. Aquí pongo una serie de links de páginas de desarrolladores preguntando exactamente lo mismo que yo:

Y eso es todo por hoy

Tamaños del body en las páginas visualizadas con ipad

Hoy el reto ha sido averiguar el tamaño correcto del body de una web en ipad. Resulta que siempre me daba 1024px, y se encontraba en horizontal, con lo cual no era nada creíble.

Por ello buscando por internet averigüé que, dependiendo de cuáles sean los parámetros de viewport que indiquemos, el $(document).height() nos mostrará una cosa u otra.

Estos son los parámetros:

Cuando la página no tiene etiqueta viewport

  • Portrait: 980×1208
  • Landscape: 980×661

Cuando la página tiene etiqueta viewport:

initial-scale + user-scalable + maximum-scale

<meta name="viewport" content="initial-scale=1,user-scalable=no,maximum-scale=1,width=device-width">
<meta name="viewport" content="initial-scale=1,user-scalable=no,maximum-scale=1">
  • Portrait: 768×946
  • Landscape: 1024×690

width

<meta name="viewport" content="width=device-width">
  • Portrait: 768×946
  • Landscape: 768×518

height

<meta name="viewport" content="height=device-height">
  • Portrait: 980×1024
  • Landscape: 980×1024

height + width

<meta name="viewport" content="height=device-height,width=device-width">
  • Portrait: 768×1024
  • Landscape: 768×1024

initial-scale + user-scalable + maximum-scale + width + height

<meta name="viewport" content="initial-scale=1,user-scalable=no,maximum-scale=1,width=device-width,height=device-height">
  • Portrait: 768×1024
  • Landscape: 1024×1024

initial-scale + user-scalable + maximum-scale + height

<meta name="viewport" content="initial-scale=1,user-scalable=no,maximum-scale=1,height=device-height">
  • Portrait: 831×1024
  • Landscape: 1520×1024

Problema con el localStorage y modo incógnito en Safari

En el día de hoy hemos tenido un problema en una aplicación web ya que no nos permitía acceder a ella. Cuando intentábamos entrar introduciendo login y password se quedaba pensando indefinidamente sin darnos ningún tipo de error. La incidencia era debida a que estábamos en safari con el modo incógnito activado y en nuestra web estábamos haciendo un localStorage, cosa que no se puede hacer.

El error más concreto que obtuvimos es:

“QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was made to add something to storage that exceeded the quota.”

¿Cómo solucionarlo?

La forma rápida: Quita el modo incógnito.

La forma más laboriosa: Inserta un try catch para controlar la excepción. Un ejemplo es:

function isLocalStorageNameSupported(){
 var testKey = 'test', storage = window.sessionStorage;
 try{
  storage.setItem(testKey, '1');
  storage.removeItem(testKey);
  return localStorageName in win && win[localStorageName];
 }catch (error){
  return false;
 }
}

¿Cómo permitir la descarga de aplicaciones iOS sin que pasen por itunes y legalmente?

Hoy explicaremos cómo lograr que una aplicación que estemos desarrollando pueda descargársela cualquier usuario desde su iPhone o iPad simplemente clicando sobre un enlace.

Requisitos que necesitamos:
1 – La licencia de Apple Developer Enterprise Program. Con la Apple developer Program no vale.
2 – Un https desde el que incluir los archivos a descargar.
Pasos a seguir:
Entrar dentro del Member Center y crear un certíficado “In-House and Ad Hoc”.
Crear un App ID de nuestra aplicación.
Crear un provisioning profile de distribución del tipo “In House”.
Con el xCode indicamos en el proyecto la app id, el certificado y el provisioning profile creados y hacemos un archive.
Exportamos la aplicación ad hoc obteniendo así un .ipa
Creamos dos archivos, un index.html y un nombreaplicacion.plist

El index.html contendrá la siguiente información:

<a href="itms-services://?action=download-manifest&url=https://www.yises.com/app/nombreaplicacion.plist">
Clica en este link para instalar
</a>

El nombreaplicacion.plist tendrá lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
 <dict>
  <key>items</key>
  <array>
   <dict>
    <key>assets</key>
    <array>
     <dict>
      <key>kind</key>
      <string>software-package</string>
      <key>url</key>
      <string>https://www.yises.com/app/nombreaplicacion.ipa</string>
     </dict>
    </array>
    <key>metadata</key>
    <dict>
      <key>bundle-identifier</key>
      <string>com.yises.app</string>
      <key>bundle-version</key>
      <string>1.0</string>
      <key>kind</key>
      <string>software</string>
      <key>title</key>
      <string>La mejor aplicación del mundo</string>
    </dict>
   </dict>
  </array>
 </dict>
</plist>

Estos tres archivos los pondremos en la ruta que estemos indicando y en el navegador de nuestro iPad/iPhone accedemos al index.html. Al clicar en el enlace nos preguntará si queremos instalar la aplicación en cuestión, y una vez hecho nos preguntará si confiamos en el que ha creado la aplicación, es decir, nosotros.

Tipos de licencias de desarrollo en iOS

Hoy me ha tocado pelearme otra vez con ios y enterarme a las bravas de cosas que deberían de ser más sencillas.

ios Developer

El objetivo era hacer una aplicación ad hoc para un cliente de una aplicación que ya teníamos en la apple store. Pensábamos que era algo sencillo, pero pronto nos dimos cuenta que no permitía que los usuarios se descargaran el .ipa correctamente (solo en aquellos dispositivos que habíamos dato de alta como desarrollo). Después de buscar algo de información por internet nos dimos cuenta que nuestra licencia de 100 euros/año no valía para estas cosas, y que teníamos que adquirir la licencia de 300 euros/año…

Y como yo me encontré muy perdido en ese momento he hecho un listado de los tipos de licencias que tiene iOS actualmente:

  • Apple Developer: Opción gratuita. Nos vale para acceder a documentación, herramientas de desarrollo y con ello podremos hacer pruebas de debug de la aplicación a través del simulador de XCode.
  • iOS University Program: Opción gratuita pero únicamente a universidades que estén incluidas dentro de este programa.
  • iOS Developer Program: Esta era la opción que teníamos contratada. Por 99 dólares al año nos permitía entre otras cosas instalar aplicaciones en nuestros dispositivos (registrándolos previamente en la web de Apple) y publicar en la AppStore nuestras aplicaciones y comercializarlas (para nosotros un 70% de beneficios y para ellos el 30% restante)
  • iOS Developer Enterprise Program: Esta era la opción que necesitábamos para publicar de forma privada a la empresa aplicaciones ad hoc. Vamos, aplicaciones que no pasen por la apple store. Cuesta la friolera de 300 dolares/año. Y no es que te la den directamente, sino que primero la solicitas, le das tus datos, y después de un tiempo te aprueban la licencia y pagas (dicen que 7 días).

Y así nos encontramos, esperando… (solo queremos pagar y que nos dejen hacer el app)

¿Cuanto tiempo tarda apple en revisar una app?

Estas semanas me ha tocado una tarea que ha resultado imposible… actualizar unas apps tanto de android como de ios. Como todos sabréis una de las principales diferencias entre estas dos plataformas es la revisión por la que pasan:

En android no hay ninguna revisión. Puedes meter lo que te de la gana (dentro de unos límites, por supuesto). Una vez que subes la aplicación al google play tarda únicamente unas horas en que ya esté disponible en dicho store para todos los usuarios.

En ios tiene que pasar por las manos de un revisor. Esto por una parte es positivo puesto que no se sube cualquier cosa pero por otra para todo desarrollador resulta un dolor de muelas increíble puesto que ese proceso de revisión puede durar entre 2 días y 1 mes, con lo cual a los clientes tampoco puedes asegurarle que estará en una fecha concreta… (Apple con su filosofía de ayudar al usuario pero poner dificultades al desarrollador). Sea como sea en mi búsqueda de respuestas me he encontrado con la siguiente página que dice el tiempo medio que tarda una app en ser revisada a lo largo de estos días: appreviewtimes. Actualmente el tiempo medio es de 8.5 días, ya os diré si es cierto porque lo subí el viernes 30 de enero a las 11 de la mañana y aun no se nada 😉

(EDICIÓN: Al final el 8 de febrero lo validaron, 9 días!)

¿Cómo crear un fichero .ipa?

Lo primero es contestar a la pregunta:

¿Qué es un .ipa?

Básicamente es un fichero en el cual se encuentra una aplicación desarrollada para iOS. Sería el .apk de iOS. Y lo que permite es desarrollar una aplicación y después distribuirla entre distintos dispositivos (sin necesidad de subirlo al itunes connect).

¿Cómo se crea un .ipa?

Siguiendo estos pasos:

  1. En Proyecto->Info hay que duplicar la configuración “Release” y llamarla de otra forma, por ejemplo “Ad hoc
  2. En el dispositivo de prueba hay que elegir Dispositivo IOS y a la izquierda duplicar los esquemas y configurar donde pone release por ad hoc.
  3. Seleccionar Product -> Build
  4. Seleccionar Product -> Archive
  5. Abrir el organizer (En el Xcode: Window->Organizer )
  6. Elegir la app que acabamos de archivar y hacer clic sobre Distribute.
  7. En distribute elegir Ad Hoc. Ya tendríamos el .ipa

¿Puedo subir un fichero .ipa al itunes?

Sí se puede si está firmado adecuadamente. Simplemente hay que:

  1. Acceder a itunesconnect.apple.com y descargarse de ahí el Application Loader (En el footer se encuentra un enlace justo debajo de “Deliver Your Apps”).
  2. En el itunes connect indicar que la aplicación está lista para ser subida.
  3. Abrir el Application Loader y seleccionar “Entregar Aplicación”.
  4. Seleccionar la aplicación a subir
  5. Siguiente, siguiente,siguiente,…… y al final enviar (ahí te indicará si tienes algún error o warning evidente en el ipa que te impida subirlo)

Y nada más, espero que sirva de algo 😉

 

Como enlazar un proyecto con su svn en xCode (iOS)

Hoy ha tocado pelearme nuevamente con Mac… intentaba hacer checkout de mi proyecto y al final siempre SIEMPRE me generaba carpetas dentro de el o bien me eliminaba todo el proyecto…….

Después de revisar internet entero lo que vi es que todo el mundo recomendaba hacerlo no desde Xcode sino desde terminal.

Al final los pasos a seguir fueron los siguientes:

1-Comprobar si tenemos instalado el svn como para utilizarlo mediante línea de comandos: Ir a Xcode > Preferences > Downloads > Command Line Tools > Install

Apariencia de la descarga del Command Line de Xcode
Apariencia de la descarga del Command Line de Xcode

2-¿Tenemos un proyecto XCode? En caso contrario lo creamos en la carpeta que tengamos.

3-Cerramos Xcode.

4-Abrimos el terminal y cambiamos el directorio a la carpeta del proyecto, por ejemplo

  • cd $HOME/IOS/Proyectos

5-Importamos el proyecto en el svn:

  • svn import -m “New Import” MiProyecto/ https://miservidor/svn/trunk/MiProyecto

6-Realizamos el checkout del proyecto de nuevo para crear la copia de trabajo

  • svn co https://miservidor/svn/trunk/MiProyecto MiProyecto

7-Volvemos a abrir el proyecto en xcode, ya tendremos el proyecto como parte del repositorio.

Espero que os haya valido y ahorrado tiempo

Problema con phonegap 2.9 al no encontrar libCordova.a

Un problema que me he encontrado una vez pasado mi proyecto de phonegap 2.9.0 a iOS es que cuando intentaba archivar el proyecto me aparecía este mensaje.
file not found: /Users/admin/…/libCordova.a
clang: error: linker command failed with exit code 1 (use -v to see invocation).

La forma de solucionarlo es la siguiente:

  1. Ir a “project settings” y a la pestaña “Build Settings”, y buscar por “Other Linker Flags”.
  2. Clicar tanto en Debug como en Release y sustituir {TARGET_BUILD_DIR}/libCordova.a por ${BUILT_PRODUCTS_DIR}/libCordova.a
  3. Limpiar y posteriormente volver a archivar.

Cómo hacer notificaciones iOS y su script PHP

Aquí os traigo un script en PHP para el envío de notificaciones a un dispositivo iOS.  Tendréis que previamente:

  1. Permitir que la aplicación pueda tener notificaciones. Para el caso de phonegap utilicé este plugin
  2. Generar el archivo ck.pem (Ese archivo ck.pem se generará con una $passphrase determinada). Este paso es el infierno de todos, aquí podéis obtener más información de como realizarlo.
  3. Instalar la aplicación en vuestro dispositivo, os aparecerá un cuadro que preguntará si queréis recibir notificaciones de la aplicación o no.
  4. De alguna forma enviar el ID de vuestro iphone o de vuestro ipad ($deviceToken) a vuestro servidor.
  5. Sustituir las variables $deviceToken y $passphrase así como incluir en vuestro servidor vuestro propio ck.pem

 

 

// Put your device token here (without spaces):
$deviceToken = 'XXXXXXXXXXXXXX';

// Put your private key's passphrase here:
$passphrase = 'XXXXXXXXXXXXXXX';

// Put your alert message here:
$message = 'My first push notification!';

////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
	'ssl://gateway.sandbox.push.apple.com:2195', $err,
	$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
	exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
	'alert' => $message,
	'sound' => 'default'
	);

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
	echo 'Message not delivered' . PHP_EOL;
else
	echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

Nota: Como veréis se comunica con el sandbox de apple, con el entorno de pruebas. Al pasar a producción será necesario poner el entorno correspondiente.