Обнаружение изменения времени устройства ТОЛЬКО при его изменении вручную
Проблема: я знаю о методе applicationSignificantTimeChange
обнаружить ручное изменение времени. Но документация по методу гласит:
Примеры значительных изменений времени включают приход полуночи, обновление времени перевозчиком и переход на летнее время. Делегат может реализовать этот метод для настройки любого объекта приложения, который отображает время или чувствителен к изменениям времени.
Таким образом, он обнаруживает не только ручное изменение времени, но и приход полуночи. В моем приложении это создаст проблему, так как пользователь увидит окно с предупреждением:
Вы изменили время. Пожалуйста, вернитесь к фактическому времени.
даже когда он возобновляет приложение после полуночи (или, может быть, он свернул приложение и ушел спать. На следующий день он просыпается, возобновляет работу приложения и неожиданно получает уведомление об изменении времени).
Вопрос: Как вывести предупреждение только при смене времени вручную, а не по прибытии в полночь?
3 ответа
Просто используйте NSSystemClockDidChangeNotification
Ссылка на Apple документ
Я использовал вариант проверки времени удаленного сервера в течение одного или нескольких лет. Это работает довольно хорошо, на iOS.
Получить удаленное время.
В вашем классе проверки времени сохраните смещение между удаленным временем и временем устройства, сохраните его в простой переменной NSTimeInterval.
Теперь вы можете получить "реальное время" в любое время из своего класса проверки времени, потому что это может занять текущее время устройства и просто добавить сохраненное смещение, и у вас будет реальное время, все время.
Всякий раз, когда фоны приложения, вам нужно будет удалить сохраненное смещение, потому что пользователь может возиться с настройками времени.
Для каждого события переднего плана приложения вам придется выполнить 3. снова. Иди, возьми отдаленное время снова. Отклоняйте любые звонки, чтобы получать в режиме реального времени, пока вы не получите это смещение снова Любые вызовы, зависящие от существующего реального времени, должны будут изящно прерываться в тех событиях, где реальное время еще не было получено.
Теперь полученное смещение следует / можно сравнить со смещением, которое вы получили в прошлый раз. Определите порог, например, 15 секунд. Если изменение смещения с прошлого раза превышает этот порог, пользователь, вероятно, изменил время вручную. Это полезное событие для меня. Конечно, даже если пользователь может изменить время устройства, мне всегда будет удобно в режиме реального времени (большую часть времени).
Afaik, я всегда работаю с метками времени UTC, чтобы избежать проблем с локалью.
Всегда лучше проверять такие вещи со временем сервера.
Выполните следующие шаги.
Получить время сервера и преобразовать в текущую локаль.
Проверьте мобильное время, используя текущую локаль.
Если они не совпадают, это означает, что пользователь изменил время.
Дайте мне знать, если это ясно или нет.