Я сделал это с помощью сценария сборки, который создает файл с отметкой времени каждый раз, когда я компилирую. Файл является частью цели сборки и развертывается вместе с приложением. Когда приложение запускается, код проверяет временную метку в файле и, если прошло много времени, приложение выдает страницу с предупреждением и больше ничего не делает.
Теперь отказ от ответственности . Я использую эту систему с версиями разработки корпоративных приложений. Это предотвращает загромождение старых версий разработки и не позволяет людям получать старые версии разработки и думать, что они последние. Я бы никогда не подумал об использовании этой системы в развернутых приложениях.
Редактировать : По запросу я добавляю код и скрипт, который использую. Это не здорово, но это работает. Если кто-то хотел бы улучшить его, я был бы рад видеть лучшие версии. У меня установлен скрипт для запуска прямо перед задачей «Скомпилировать источники»
builddate=`date`
# if BuildDateString doesn't exist, add it
/usr/libexec/PlistBuddy -c "Add :BuildDateString string $builddate" "$TARGET_BUILD_DIR/$INFOPLIST_PATH"
# and if BuildDateString already existed, update it
/usr/libexec/PlistBuddy -c "Set :BuildDateString $builddate" "$TARGET_BUILD_DIR/$INFOPLIST_PATH"
Код Objective-C, который я использую, существует в статической библиотеке кода, которую я обычно использую в значительном количестве проектов. Он также включает в себя простой UIViewController
с именем TSExpiredViewController
для отображения просроченного сообщения, если это необходимо.
+ (void)expireAppAfterOneWeek {
[self expireAppAfter:604800];
}
+ (void)expireAppAfter:(NSTimeInterval)secondsAfterBuilds {
id<UIApplicationDelegate> appDelegate = [UIApplication sharedApplication].delegate;
NSString *buildDateString = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"BuildDateString"];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"EEE MMM dd kk:mm:ss zz yyyy";
NSDate *buildDate = [df dateFromString:buildDateString];
if (-[buildDate timeIntervalSinceNow] > secondsAfterBuilds) {
appDelegate.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
TSExpiredViewController *viewController = [[TSExpiredViewController alloc] init];
appDelegate.window.rootViewController = viewController;
[appDelegate.window makeKeyAndVisible];
}
}