2013-04-10 4 views
0

Я пишу приложение Mac OSX с использованием Cocoa, которое предназначено для прекращения работы после указанной даты, чтобы пользователь не просто менял свои системные часы, а затем снова запускал приложение. Мне нужна программа закрыть и удалить себя, если он загружен после истечения срока действия. Это возможно?Приложение Cocoa, которое удаляет себя

Я распространяю приложение напрямую не через магазин приложений. Кроме того, проверка даты с использованием Интернета не является вариантом, потому что приложение должно использоваться в автономном режиме.

Спасибо, Matthew

+0

Проверить системную дату, а также дополнительную проверку работоспособности в отношении дат модификации некоторых файлов в файловой системе (журналы, префы), чтобы узнать, были ли они более свежими, указывающие системные часы, возможно, были изменены? – Jay

+2

Как бы то ни было, я бы * ненавидел вас, если бы я был пользователем вашего приложения, удаляющим себя на ** MY ** Mac :-) – Jay

+0

:) В общем, не очень хорошо, что я согласен, вы Мне придется доверять мне, что в этом случае это оправдано! Что касается проверки на изменения системных часов, знаете ли вы, какие глобальные файлы содержат такие журналы? Спасибо – user2265675

ответ

1

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

Обратите внимание, что я до сих пор не думаю, что план (злорадно) удаление пользовательских файлов является прекрасной идеей в целом, и следующий подход, в частности, будет, конечно, ломаться под Песочница ..

..но из из любопытства: Вот фрагмент кода, который будет проверять все файлы в /var/log и возвращать ли некоторые из них были изменены в будущем (= система вполне вероятно, работает «в прошлом»)

- (bool)isFakeSystemTime 
{ 
    int futureFileCount = 0; 

    // let's check against 1 day from now in the future to be safe 
    NSTimeInterval secondsPerDay = 24 * 60 * 60; 
    NSDate *tomorrow = [[[NSDate alloc] initWithTimeIntervalSinceNow:secondsPerDay] autorelease]; 

    NSString *directoryPath = @"/var/log"; 
    NSArray *filesInDirectory = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:nil]; 

    for (NSString* fileName in filesInDirectory) 
    { 
     NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[directoryPath stringByAppendingPathComponent:fileName] error:nil]; 
     NSDate *date = [attributes valueForKey:@"NSFileModificationDate"]; 
     if (!date) 
     continue; 

     if ([date compare:tomorrow] == NSOrderedDescending) 
     { 
     NSLog(@"File '%@' modified >=1 day in the future", fileName); 
     futureFileCount++; 
     } 
    } 

    // again, some heuristic to be (more) on the safe side 
    return futureFileCount > 5; 
} 
3

Это возможно , но не relia так. Чтобы удалить приложение, просто введите URL своего основного пакета и сообщите NSFileManager об его удалении. Но ваш пакет приложений не может быть доступен для записи - и, следовательно, его нельзя удалить - и у пользователя может быть любое количество резервных копий, даже если вам удастся его удалить. Я бы не писал ничего, что было бы возможно, если бы я не контролировал системы, над которыми будет работать программа. (Я имею в виду, я, вероятно, не буду писать что-то, что делает это в любом случае, потому что это немного сумасшедший. Но если я буду писать что-то вроде этого, это должно быть то, что работает только на моих собственных системах.)

Смежные вопросы