Обнаружение изменения времени устройства ТОЛЬКО при его изменении вручную

Проблема: я знаю о методе applicationSignificantTimeChange обнаружить ручное изменение времени. Но документация по методу гласит:

Примеры значительных изменений времени включают приход полуночи, обновление времени перевозчиком и переход на летнее время. Делегат может реализовать этот метод для настройки любого объекта приложения, который отображает время или чувствителен к изменениям времени.

Таким образом, он обнаруживает не только ручное изменение времени, но и приход полуночи. В моем приложении это создаст проблему, так как пользователь увидит окно с предупреждением:

Вы изменили время. Пожалуйста, вернитесь к фактическому времени.

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

Вопрос: Как вывести предупреждение только при смене времени вручную, а не по прибытии в полночь?

3 ответа

Просто используйте NSSystemClockDidChangeNotification Ссылка на Apple документ

Я использовал вариант проверки времени удаленного сервера в течение одного или нескольких лет. Это работает довольно хорошо, на iOS.

  1. Получить удаленное время.

  2. В вашем классе проверки времени сохраните смещение между удаленным временем и временем устройства, сохраните его в простой переменной NSTimeInterval.

  3. Теперь вы можете получить "реальное время" в любое время из своего класса проверки времени, потому что это может занять текущее время устройства и просто добавить сохраненное смещение, и у вас будет реальное время, все время.

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

  5. Для каждого события переднего плана приложения вам придется выполнить 3. снова. Иди, возьми отдаленное время снова. Отклоняйте любые звонки, чтобы получать в режиме реального времени, пока вы не получите это смещение снова Любые вызовы, зависящие от существующего реального времени, должны будут изящно прерываться в тех событиях, где реальное время еще не было получено.

  6. Теперь полученное смещение следует / можно сравнить со смещением, которое вы получили в прошлый раз. Определите порог, например, 15 секунд. Если изменение смещения с прошлого раза превышает этот порог, пользователь, вероятно, изменил время вручную. Это полезное событие для меня. Конечно, даже если пользователь может изменить время устройства, мне всегда будет удобно в режиме реального времени (большую часть времени).

Afaik, я всегда работаю с метками времени UTC, чтобы избежать проблем с локалью.

Всегда лучше проверять такие вещи со временем сервера.

Выполните следующие шаги.

  1. Получить время сервера и преобразовать в текущую локаль.

  2. Проверьте мобильное время, используя текущую локаль.

  3. Если они не совпадают, это означает, что пользователь изменил время.

Дайте мне знать, если это ясно или нет.

Другие вопросы по тегам