在几天的“测试”之后,防止应用程序被使用的最佳方法是什么?假设我必须使用 Ad Hoc 分发来分发我的应用程序,用户只有一周的测试时间,之后他应该无法使用该应用程序。
提前致谢。
我执行以下操作以在应用程序中设置 Beta 测试的时间限制:
#ifdef BETA
NSString *compileDate = [NSString stringWithFormat:@"%s %s", __DATE__, __TIME__];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MMM d yyyy HH:mm:ss"];
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[df setLocale:usLocale];
NSDate *aDate = [df dateFromString:compileDate];
NSDate *expires = [aDate dateByAddingTimeInterval:60 * 60 * 24 * 7]; // 7 days
NSDate *now = [NSDate date];
if ([now compare:expires] == NSOrderedDescending) {
NSAssert(0, @"Sorry, expired");
}
#endif
BETA
我只为临时构建设置的编译标志在哪里。
我将此代码放在applicationWillEnterForeground:
应用程序委托方法中。
每次 Xcode 构建应用程序时,它都会Info.plist
在应用程序的包中创建一个文件。我们可以从该文件中获取修改日期,以确定它自构建以来已经过了多长时间。
#if BETA
- (void)applicationDidBecomeActive:(UIApplication *)application
{
const NSTimeInterval kExpirationAge = 60 * 60 * 24 * 7; // 7 days
NSString* infoPlistPath = [[NSBundle mainBundle] pathForResource: @"Info" ofType: @"plist"];
NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:infoPlistPath error:NULL];
NSDate* buildDate = (NSDate*) [fileAttributes objectForKey:NSFileModificationDate];
const NSTimeInterval buildAge = -[buildDate timeIntervalSinceNow];
if (buildAge > kExpirationAge) {
UIAlertView* av = [[UIAlertView alloc] initWithTitle:@"App Expired"
message:@"This version is expired. Please update to the latest version of this app."
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[av show];
// after 10 seconds the app exits
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
exit(0);
});
}
}
#endif