我正在创建一个在特定时间限制后过期的应用程序。意味着用户无法访问它的方法,用户应该购买或注册它下载的应用程序。用户可以打开应用程序,但在一段时间限制后,用户无法使用应用程序功能。 这可能吗?
答案 0 :(得分:1)
我通过使用构建脚本完成此操作,每次编译时都会创建一个带有时间戳的文件。该文件是构建目标的一部分,并随应用程序一起部署。当应用程序运行时,代码会检查文件上的时间戳,如果超过应用程序的时间超过应用程序会抛出一个警报页面而不会执行任何操作。
现在是免责声明。我将此系统与企业应用程序的开发版本一起使用。这可以防止旧的开发版本混乱,并防止人们获得旧的开发版本并认为它们是最近的。我永远不会想到在生产部署的应用程序上使用这个系统。
编辑:每个请求我添加了我使用的代码和脚本。它不是很好,但它的确有效。如果有人想改进它,我会很高兴看到更好的版本。我将脚本设置为在“编译源”任务
之前运行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];
}
}
答案 1 :(得分:-1)
首先:
如果您使用其私有API中未列出的任何功能,Apple将不会拒绝您的应用程序。因此,如果您想在特定时间后阻止您的应用程序,您可以在逻辑上实现它。
为此,将您的应用程序下载到设备中后,存储当前时间&amp;您的应用程序首选项(用户默认值)中的日期。虽然在此选项中如果用户将删除该应用程序&amp;重新安装首选项将重置的应用程序。
因此,在iOS设备未重置(如钥匙串)之前,有许多地方未被移除。 Apple提供了将数据存储在钥匙串中的方法。
接下来你需要做的就是每当用户打开你的应用程序时,你需要用应用程序中的存储时间来检查当前时间。
如果它验证了您的限制,您可以让用户使用该应用程序或投掷警报&amp;做你想做的任何行动。
我希望它对你有帮助。