几个星期后,我将把我的iOS应用程序发布给一组beta测试人员。我允许他们从星期五晚上到下一个星期天晚上进行测试。我希望在那个星期天之后禁止任何使用。我不想使用NSDate
,因为测试人员可以更改设备上的日期并在会话结束后继续播放。有什么想法吗?
答案 0 :(得分:3)
日期选项可能已经足够好了,因为大多数人都不会在设备上更改日期,这会让太多其他应用程序陷入困境。唯一担心会有人专门为您的游戏设备的情况。
另一个选择是:向服务器添加一个网络请求,其中包含一些代码,说明是否允许播放,然后您只需更改服务器上的标记即可。
答案 1 :(得分:3)
如果您不想设置服务器或担心网络连接,可以做两件事情,使其比使用单个NSDate
更强大:
NSDate
这会缩短时间窗口,这将会越来越难以规避。
答案 2 :(得分:1)
有许多方法可以防止这种情况,有些方法比其他方法更复杂。但是我想到的前两个是:
选项1:您可以检查服务器上的日期而不是系统时间。
选项2:如果您想避免网络麻烦......如果用户在星期日之后打开应用程序,请在userDefaults中写一个布尔值(例如已过期)。启动应用程序时,请检查日期和过期标志。即使用户更改日期,也会设置过期标志。
答案 3 :(得分:0)
如果您不希望网络和服务器连接,请使用钥匙串存储上次打开的日期。与用户默认设置相比,钥匙串更安全,更难让人们更改,用户默认设置只是应用程序库中的plist文件。
答案 4 :(得分:0)
这是安全选项。您了解应用的BETA版本需要访问互联网。因此,当应用程序启动时,它会向测试服务器发送一个请求,询问是否可以播放。默认情况下,除非获得有效回复,否则您的应用将无法播放。
服务器创建有效响应,服务器将至少发送两条信息。第一部分是表示测试期有效的标志。第二个是当前的日期/时间。服务器将sign the response using it's private key。
应用程序在收到响应时将使用服务器公钥验证其是否有效。服务器公钥应作为资源在应用程序中。验证消息有效且可信后,它会将发送的日期/时间与设备的日期/时间进行比较。例如,如果时间差小于10秒,则应用程序知道其当前消息。不是使用某种HTTP代理保存和重播的消息。
答案 5 :(得分:0)
首先,请查看此链接,了解检查NTP服务器时间的好方法:
https://github.com/jbenet/ios-ntp
然后,您可以通过调用[NSDate networkDate];
来获取日期现在,您应该能够在appDelegate中执行限制。我已经做了类似的限制在iPad上运行iPhone应用程序:
if ([[NSDate networkDate] compare:startDate] == NSOrderedAscending) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Beta Not Started" message:@"Beta starts [[STARTDATE]]." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
return NO;
} else if ([[NSDate networkDate] compare:endDate] == NSOrderedDescending) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Beta Ended" message:@"Beta ended [[ENDDATE]]." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
return NO;
}
然后,在你的UIAlertViewDelegate:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
exit(0);
}
希望这有帮助!