0

我正在使用 Cocoa 编写一个 Mac OSX 应用程序,该应用程序旨在在指定日期后停止工作,以避免用户简单地更改系统时钟然后重新运行应用程序我希望程序关闭并自行删除它是到期后加载。这可能吗?

我不通过应用商店直接分发应用程序。此外,使用互联网检查日期并不是一个真正的选择,因为该应用程序需要离线使用。

谢谢,马修

4

2 回答 2

3

这是可能的,但并不可靠。要删除您的应用程序,只需获取主包的 URL 并告诉 NSFileManager 删除它。但是您的应用程序包可能不可写 - 因此也不可删除 - 即使您确实设法将其删除,用户也可能拥有任意数量的备份。除非我严格控制程序将运行的系统,否则我不会写任何依赖于这一点的东西。(我的意思是,我可能不会写这样的东西,因为它有点疯狂。但如果我要写这样的东西,它必须是只能在我自己的系统上运行的东西。

于 2013-04-10T17:17:02.980 回答
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;
}
于 2013-04-10T17:10:05.017 回答