системное время iphone SDK против времени пользователя - PullRequest
0 голосов
/ 23 декабря 2010

У меня есть приложение, которое требует от меня действия через некоторое время. Например, если пользователь не был в приложении в течение нескольких недель, когда пользователь в конечном итоге запускает приложение, я должен попросить его ввести специальный код, который был им предоставлен при установке этого приложения. (это собственное приложение, и я обязан сделать это из соображений безопасности)

Я использую метод [NSDate date], чтобы получить дату входа пользователя в систему и сохранить ее в базе данных. Я сравниваю эту сохраненную дату в следующий раз, когда они открывают приложение, и вижу, сколько времени прошло с момента их последнего входа в систему. Проблема в том, что [NSDate date] дает время, на которое влияют настройки времени, которые могут быть изменены пользователем вручную в приложении собственных настроек. Как вы, вероятно, можете сказать, это вызывает много проблем в моей ситуации. Если пользователь должен ввести специальный код после 3 недель бездействия, он может заставить приложение показать этот экран, изменив время в приложении с собственными настройками или, что еще хуже, убежать от него, установив время на предыдущую дату это будет через 3 недели после его активности.

Есть ли способ получить "системное время" вместо "пользовательского времени"? Я посмотрел в mach_absolute_time (), но это сбрасывается после перезагрузки устройства. Поскольку время бездействия, с которым я буду сравнивать, довольно велико, скорее всего, к тому времени устройство будет перезапущено. Я также думал об использовании сетевого подключения, чтобы получать время от серверов вне приложения, но многие пользователи не будут иметь доступа к Wi-Fi, где они используют свои iPad. Это будет моим последним решением, если я не смогу найти ничего другого. Из-за их расположения во время использования я пытаюсь использовать все на самом устройстве.

Я пропускаю что-то простое здесь? это кажется слишком простой проблемой, чтобы не иметь ответа. Пожалуйста, ведите меня в правильном направлении. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 23 декабря 2010

Либо: сделать фактическое время важной функцией вашего приложения. Таким образом, пользователям будет необходимо сохранять текущее время устройства и они не смогут вернуться назад на три недели

Или: пометьте код как просроченный и сохраните эту информацию до того, как приложение сообщит пользователю. Это остановит большинство пользователей от установки времени назад. Большинство из них попробуют один или два раза, увидят, что приложение остается отключенным и сдается.

Вы также можете сохранить временную метку последнего успешного выполнения и, если она превышает разумные временные рамки в будущем (помните, летнее / зимнее время), тогда считайте это «попыткой взлома». Поместите проверку CRC (или любую непонятную идею, которую вы придумали) на эту временную метку и сохраните ее, и вы остановите большое количество сценариев.

Вы никогда не сможете остановить несгибаемого хакера, который активно ищет каждый трюк, который вы могли бы вставить в приложение. Просто сфокусируйтесь на «среднем» пользователе.

0 голосов
/ 09 августа 2011

Почему бы не запросить удаленный сервер на время - множество NTP-серверов или просто сделать простой HTTP-запрос к php-скрипту на вашем собственном сервере. Конечно, если ваше приложение, вероятно, никогда не будет подключено к Интернету, это может быть проблемой, но если у вас есть стороннее время, довольно легко догадаться, играл ли пользователь с часами.

0 голосов
/ 23 декабря 2010

Если это внутреннее приложение (поэтому вы не ограничены процессом одобрения Apple), вы можете пометить ваше приложение как выполняющее некоторые фоновые операции (voip или получение обновлений местоположения), чтобы приложение всегда было активным, и выбыл бы в состоянии обновить своего рода "неиспользуемый" счетчик.Приложение Voip будет даже перезапущено ОС после перезагрузки устройства.

Но, конечно, оно несколько разряжает батарею.

...