Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按日期限制iOS应用程序的使用_Ios_Objective C - Fatal编程技术网

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

按日期限制iOS应用程序的使用,ios,objective-c,Ios,Objective C,几周后,我将向一群测试人员发布我的iOS应用程序。我允许他们从周五晚上开始测试,直到下一个周日晚上。我想禁止在那个星期天之后使用。我不想使用NSDate,因为测试人员可以更改设备上的日期,并在会话结束后继续播放。有什么想法吗?日期选项可能已经足够好了,因为大多数人都不会费心在他们的设备上更改日期,它会打乱太多其他应用程序。唯一需要担心的情况是有人拥有专用于你的游戏的设备 另一种选择是:向服务器添加一个网络请求,其中包含一些代码,说明是否允许播放,然后您可以更改服务器上的标志。有几十种方法可以防止

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

日期选项可能已经足够好了,因为大多数人都不会费心在他们的设备上更改日期,它会打乱太多其他应用程序。唯一需要担心的情况是有人拥有专用于你的游戏的设备


另一种选择是:向服务器添加一个网络请求,其中包含一些代码,说明是否允许播放,然后您可以更改服务器上的标志。

有几十种方法可以防止这种情况,有些方法比其他方法更复杂。但我想到的前两个问题是:

选项1:您可以检查服务器上的日期,而不是系统时间


选项2:如果你想避免网络麻烦。。。如果用户在周日后打开应用程序,请在userDefaults中写入布尔值(例如,expired)。启动应用程序时,检查日期和过期标志。即使用户更改了日期,也会设置过期标志。

如果您不想设置服务器或担心网络连接,可以做两件事,使其比使用单个
NSDate
更强大:

  • 每当有人打开应用程序时(以及离开时),记录日期
  • 下次使用应用程序时,请确保当前时间高于上一次打开/关闭时间。并确保它少于你未来的日期

这将使时间窗口越来越小,越来越难规避。

如果您不希望网络和服务器连接,请使用钥匙链存储上次打开的日期。与用户默认设置相比,钥匙链更安全,人们更难更改。用户默认设置只是应用程序库中的一个plist文件。

这里是安全选项。你让它知道你的应用程序的测试版需要互联网接入。所以,当应用程序启动时,它会向beta服务器发送一个请求,询问是否可以播放。默认情况下,除非得到有效响应,否则应用程序不会播放

如果服务器创建有效响应,服务器将发送至少两条信息。第一件是一个标志,表明测试周期有效。第二个是当前日期/时间。服务器将自动运行


应用程序在收到响应时将使用服务器公钥验证其有效性。服务器公钥应作为资源存在于应用程序中。验证消息是否有效和真实后,它会将发送的日期/时间与设备的日期/时间进行比较。例如,如果时间差小于10秒,则应用程序知道它是一条当前消息。不是使用某种HTTP代理保存和重播的消息。

首先,查看此链接,了解一种根据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);
}

希望这有帮助

当然,你的应用需要网络连接才能启动。选项2仍然很容易规避。用户默认值对用户开放everyone@LeoNatan我同意,但它很容易实现。测试版测试员从不遵守你的时间计划。99%的用户将在周一应用程序停止运行时首次启动该应用程序。你不仅不会从这些人那里得到任何反馈,他们也不会再为你进行beta测试,他们也不会购买你的应用。@gnasher729我希望不是这样,因为该应用程序是一款全多人游戏,而这是非常安全的,很难实现。我不太担心这些测试人员设置代理只是为了规避测试版的限制,您使用什么作为服务器后端?IIS?阿帕奇?php?游戏运行node.js,但我有一个Apache+php服务器