Macos 删除自身的Cocoa应用程序

Macos 删除自身的Cocoa应用程序,macos,cocoa,Macos,Cocoa,我正在使用Cocoa编写一个Mac OSX应用程序,该应用程序设计为在指定日期后停止工作,以避免用户简单地更改其系统时钟,然后重新运行该应用程序。如果在到期日期后加载,我希望该程序关闭并删除自身。这可能吗 我不是通过应用商店直接分发应用程序。此外,使用互联网检查日期实际上不是一个选项,因为该应用程序需要离线使用 谢谢, Matthew您可以在系统中执行一些健全性检查,以了解用户是否手动将时钟设置回过去 请注意,我仍然不认为(恶意)删除用户文件的计划总体上是一个好主意,特别是以下方法肯定会在沙箱下

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

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

谢谢,
Matthew

您可以在系统中执行一些健全性检查,以了解用户是否手动将时钟设置回过去

请注意,我仍然不认为(恶意)删除用户文件的计划总体上是一个好主意,特别是以下方法肯定会在沙箱下崩溃。

…但出于好奇:这里有一个片段将检查
/var/log
中的所有文件,并返回其中一些文件是否在将来被修改(=系统很可能“在过去”运行)


您可以在系统中执行一些健全性检查,以了解用户是否手动将时钟设置回过去

请注意,我仍然不认为(恶意)删除用户文件的计划总体上是一个好主意,特别是以下方法肯定会在沙箱下崩溃。

…但出于好奇:这里有一个片段将检查
/var/log
中的所有文件,并返回其中一些文件是否在将来被修改(=系统很可能“在过去”运行)


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

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

检查系统日期,再加上对文件系统中某些全局文件(日志、pref)的修改日期进行额外的健全性检查看看它们是否更新,表明系统时钟可能已经改变了?不过,作为一个普遍的想法-如果我是你的应用程序的用户,我会恨你在我的Mac上删除自己:-):)一般来说,这不是一件好事,我同意,你必须相信我,在这种情况下,这是合理的!关于检查系统时钟的更改,您知道哪些全局文件包含此类日志吗?谢谢,我只需继续检查
/var/log/
中由系统在常规basisCheck系统日期修改的两个文件上的日期戳,再加上针对文件系统中某些全局文件(日志、预处理文件)的修改日期进行的额外健全性检查看看它们是否更新,表明系统时钟可能已经改变了?不过,作为一个普遍的想法-如果我是你的应用程序的用户,我会恨你在我的Mac上删除自己:-):)一般来说,这不是一件好事,我同意,你必须相信我,在这种情况下,这是合理的!关于检查系统时钟的更改,您知道哪些全局文件包含此类日志吗?谢谢,我会继续检查
/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;
}