按日期限制iOS应用程序的使用

时间:2014-02-21 18:09:55

标签: ios objective-c

几个星期后,我将把我的iOS应用程序发布给一组beta测试人员。我允许他们从星期五晚上到下一个星期天晚上进行测试。我希望在那个星期天之后禁止任何使用。我不想使用NSDate,因为测试人员可以更改设备上的日期并在会话结束后继续播放。有什么想法吗?

6 个答案:

答案 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);
}

希望这有帮助!