Как я могу определить, перезагрузился ли iphone с момента последнего запуска приложения - PullRequest
5 голосов
/ 18 сентября 2009

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

Есть ли где-нибудь, где я мог бы извлечь информацию из журнала системной консоли, как перезагрузка, сбой? Органайзер в xcode может получить к нему доступ, может быть, я тоже могу.

Если нет, можете ли вы подумать о других способах получения этой информации?

Ответы [ 5 ]

10 голосов
/ 18 сентября 2009

Кажется, что это будет работать:

  • получить время с момента последней перезагрузки, и для этого примера давайте сохраним его в переменной с именем 'tslr' (я думаю, длительность в миллисекундах, кстати, как вы это получили?)
  • получить текущее время, сохранить его в переменной 'ct', например
  • вычисляем время последней перезагрузки (назовем это 'lr'), мы имеем: lr = ct - tslr
  • магазин 'lr'

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

Я думаю, что было бы довольно сложно обмануть это ... пользователь должен был бы очень точно изменить время своего телефона, и он должен был бы запустить ваше приложение в очень точный момент, когда именно новый 'lr' будет идентичным предыдущему ... довольно сложно сделать, я думаю, вероятность того, что они смогут это сделать, очень близка к 0. И вам не нужно подключение к Интернету, чтобы сделать это ...

Новый 'lr' будет идентичен предыдущему только в следующих случаях:

  • телефон не был перезагружен, а время не изменилось
  • время было подделано, и пользователю удалось запустить ваше приложение с точностью до миллисекунды, чтобы обмануть ваш алгоритм (шансы того, что это произойдет больше, чем ультратонкий)
1 голос
/ 21 апреля 2016
    // Returns true if device has rebooted since last time
    private func deviceRebootedSinceLastTime() -> Bool {
        let userDefaults = NSUserDefaults.standardUserDefaults()
        let systemUptime = NSProcessInfo.processInfo().systemUptime;
        let timeNow = NSDate().timeIntervalSince1970
        let dateOfLastReboot = NSDate(timeIntervalSince1970: timeNow-systemUptime)

        var didDeviceRebootSinceLastTime = false

        if let storedDateOfLastReboot:NSDate = userDefaults.objectForKey("deviceLastRebootDate") as? NSDate {

            if Int(dateOfLastReboot.timeIntervalSinceDate(storedDateOfLastReboot)) < 1 { //
                print("Reboot time didn't change - date: \(dateOfLastReboot)");
            }
            else {
                print("Reboot time has changed - from: \(storedDateOfLastReboot) to \(dateOfLastReboot)");
                didDeviceRebootSinceLastTime = true

            }
        }
        else {
            print("Reboot time is saved for the first time")
            didDeviceRebootSinceLastTime = true // first time we save value
        }

        userDefaults.setObject(dateOfLastReboot, forKey: "deviceLastRebootDate")
        userDefaults.synchronize() // don't forget this!!!

        return didDeviceRebootSinceLastTime;
    }
1 голос
/ 19 сентября 2009

Ответ Зорана - правильный путь; это самое близкое, что вы получите без подключения к сети. (ни сотовая подсистема, ни системный журнал не доступны из соображений безопасности)

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

0 голосов
/ 18 июля 2018

Вот тот, который я сделал. Для экстраполяции даты последнего перезапуска устройства требуется текущее время по Гринвичу и время с момента последней перезагрузки. Затем он отслеживает эту дату в памяти, используя NSUserDefaults. Наслаждайтесь!

Примечание. Поскольку вы хотите проверить это с момента последнего запуска приложения , необходимо обязательно вызывать метод при каждом запуске приложения. Самым простым способом было бы вызвать метод ниже в +(void)initialize {, а затем также всякий раз, когда вам нужно проверить его вручную

#define nowInSeconds CFAbsoluteTimeGetCurrent()//since Jan 1 2001 00:00:00 GMT
#define secondsSinceDeviceRestart ((int)round([[NSProcessInfo processInfo] systemUptime]))
#define storage [NSUserDefaults standardUserDefaults]
#define DISTANCE(__valueOne, __valueTwo) ((((__valueOne)-(__valueTwo))>=0)?((__valueOne)-(__valueTwo)):((__valueTwo)-(__valueOne)))

+(BOOL)didDeviceReset {
    static BOOL didDeviceReset;
    static dispatch_once_t onceToken;
    int currentRestartDate = nowInSeconds-secondsSinceDeviceRestart;
    int previousRestartDate = (int)[((NSNumber *)[storage objectForKey:@"previousRestartDate"]) integerValue];
    int dateVarianceThreshold = 10;
    dispatch_once(&onceToken, ^{
        if (!previousRestartDate || DISTANCE(currentRestartDate, previousRestartDate) > dateVarianceThreshold) {
            didDeviceReset = YES;
        } else {
            didDeviceReset = NO;
        }
    });
    [storage setObject:@(currentRestartDate) forKey:@"previousRestartDate"];
    [storage synchronize];
    return didDeviceReset;
}
0 голосов
/ 18 сентября 2009

Получите и сохраните время с iPhone или из NIST и текущее время выполнения с помощью функции времени работы BSD. О времени NIST см. Как узнать реальное время в iPhone, а не время, установленное пользователем в настройках?

Если вы хотите проверить перезагрузку, получите новые значения, вычислите истекшее время для каждого и сравните истекшее время. По разнице вы сможете определить перезагрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...