Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

Если это приложение Inhouse (так что вы не ограничены процессом утверждения яблок), вы можете пометить свое приложение как некоторые фоновые вещи (VoIP или обновления местоположения), чтобы приложение всегда было активным, и вы будете способен обновить какой -то «неиспользованный» счетчик. Приложение VoIP даже будет перезапущено ОС после перезагрузки устройства.

Но, конечно, это немного истощает батарею.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top