Pregunta

Tengo una aplicación que me obliga a tomar una acción después de un cierto período de tiempo. Por ejemplo, si un usuario no ha estado dentro de la aplicación de unas semanas, cuando el usuario inicia la aplicación con el tiempo, tengo que pedirles que poner en un código especial que les fue dado cuando instalaron esta aplicación. (Esta es una aplicación en la empresa y que estoy siendo obligado a hacer esto por razones de seguridad)

Estoy utilizando el método de [fecha NSDate] para recuperar la fecha en que el usuario inicie sesión y guardarla en una base de datos. Comparo esta fecha salvado próxima vez que abren la aplicación y ver cuánto tiempo ha pasado desde la última entrada de su. El problema es que [fecha NSDate] da el tiempo que se efectúa mediante la configuración de tiempo que se pueden cambiar manualmente por el usuario en la configuración de aplicación nativa. Como usted puede decir probablemente, esto causa muchos problemas a mi situación. Si el usuario se supone que debe ser puesto el código especial después de 3 semanas de inactividad, que puede causar que la aplicación muestre esta pantalla modificando el tiempo en la aplicación de los ajustes nativos o peor, alejarse de ajustando el tiempo a una fecha anterior que será dentro de 3 semanas de su actividad.

¿Hay una manera de conseguir la "hora del sistema" en lugar del "tiempo de usuario"? He mirado en mach_absolute_time (), pero ahora se pone de reinicio tras el reinicio del dispositivo. Desde los tiempos de inactividad Voy a hacer la comparación es bastante grande, es probable que el dispositivo habría sido reiniciado para entonces. También he pensado en utilizar una conexión de red para obtener la hora de servidores fuera de la aplicación, pero muchos usuarios no tendrán acceso a Wi-Fi en el que usan sus iPads. Esa será mi solución de último recurso si no puedo encontrar nada más. Debido a su ubicación durante el uso, que estoy tratando de usar todo en el propio dispositivo.

estoy pasando por alto algo sencillo aquí? esto parece demasiado simple a un problema de no tener una respuesta. Por favor, me guía hacia la dirección correcta. Gracias de antemano.

¿Fue útil?

Solución

Why not query a remote server for the time - lots of NTP servers about or just make a simple HTTP request to a php script on your own server. Of course if your app is likely never to be connected to the internet that could be a problem, but once you have a 3rd party time its quite easy to guess if the user has been playing with the clock.

Otros consejos

If this is an inhouse app (so you aren't constrained by Apples approval process), you could mark your app as doing some background stuff (voip or receiving location updates), so that the app will always be active and you'd be able to update some sort of an "unused" counter. Voip app will even be restarted by the OS after device reboot.

But of course it'll drain the battery somewhat.

Either: make having the actual time an essential feature of your app. This way the users will have a need to keep the time of the device current and can't go back three weeks

Or: mark the code as expired and save this information before the app informs the user. This will stop most user from setting the time back. Most will try once or twice, see that the app stays disabled and will give up.

You can also save the timestamp of the last successful execution and if that is more than a reasonable time frame in the future (remember summer/winter time) then consider it a "hack attempt". Put a CRC check (or whatever obscure idea you come up with) on that timestamp and save it too and you will stop a large number of script kiddies.

You can never stop the diehard hacker who search actively for every trick you might have put into the app. Just focus on the "average" user.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top