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 に答える