#ios #objective-c #cocoa-touch
#iOS #objective-c #cocoa-touch
Вопрос:
Я разрабатываю приложение, которое обновляется каждые 5 минут. Каков наилучший способ проверить время с момента последнего пополнения, чтобы пользователь не мог обмануть систему, изменив время на своем устройстве?
Для примера посмотрите на Candy Crush . Изменение системного времени там дает вам дополнительные жизни, и это то, что мне нужно предотвратить.
Ответ №1:
Как насчет запуска [NSTimer scheduledTimerWithTimeInterval:300.0
target:self
selector:@selector(giveLife:)
userInfo:nil
repeats:YES];
Это должно выполняться giveLife
каждые 5 минут, и там вы можете дать дополнительную жизнь. Насколько я могу судить, изменение времени синхронизации после его запуска не повлияет на NSTimer.
Ответ №2:
Я бы посоветовал вам сделать что-то подобное, как в Clumsy ninja.
КОРОТКОЕ
- Каждый раз, когда приложение становится активным [applicationDidBecomeActive:] — Вы пытаетесь получить время в Интернете.
- Если временная метка времени устройства меньше, чем сохраненная временная метка — не разрешайте продолжать. (Попросите подключиться к Интернету).
- Реализовать функцию сохранения метки времени последнего цикла регенерации. Таким образом, даже если пользователю удастся быстрее пополнить счет в реальном времени, как только он вернется к исходному времени и продолжит игру, это покажет, что следующее пополнение счета в реальном времени произойдет в будущем, когда пользователь в последний раз использовал приложение, а не через 5 минут. (Чтобы наказать читеров) (Но, может быть, установить максимальный предел, если время последнего восстановления превышает 5 минут с текущего времени, затем установите его равным 1 часу? все еще наказание, но не настолько большое, чтобы потерять игрока.
ДОЛГО
(Исходя из того, что я мог различить)
Каждый раз, когда приложение становится активным, вы пытаетесь получить время в Интернете. На этом этапе вам больше не нужно проверять время при открытии приложения, пока в следующий раз приложение снова не станет активным.
В clumsy ninja они позволяют использовать приложение, даже если Интернет недоступен. Итак, если я активирую режим полета (например), настраиваю время на несколько часов вперед и открываю приложение — оно видит, что Интернет недоступен, и, следовательно, не может сравнивать время. И — вещи (боксерская груша, мячи и т. Д.) Мне пришлось ждать ремонта — теперь они отремонтированы. Ура.
Но если я повторю то же самое много-много раз и, наконец, захочу вернуться к исходной дате и времени — и открыть приложение, оно будет знать, что что-то не так. Вероятно, в нем хранятся некоторые последние открытые временные метки, и если это время больше фактического времени устройства, то пользователь, вероятно, делает что-то плохое. И — появляется предупреждение — приложение должно подключиться к серверу, чтобы продолжить.
Еще одним недостатком перемещения времени вперед (для пользователя, но отлично подходит для разработчика) является то, что есть некоторые вещи, которые будут автоматически восстанавливаться через некоторое время, но их нужно «выбрать», чтобы снова начать восстановление. В clumsy ninja курица время от времени генерирует яйцо. Если яйцо не выбрано, оно по-прежнему содержит временную метку, когда оно должно быть / было сгенерировано. Итак, представьте, пользователь успешно пересылает время много раз (пока оно не опережает исходное время уже на 1 день) — и теперь он хочет вернуть время к исходному времени, чтобы часы действительно показывали правильное время. После того, как пользователь это сделает — при открытии приложения время синхронизируется, но генерирующее яйцо теперь покажет, что оно будет готово через 1 день — последняя сохраненная временная метка. Но это также можно использовать для всех элементов, для которых требуется время. Почему неуклюжий ниндзя не использовал эту штуку для всех предметов? Может быть, они боятся, что если пользователь увидит, что ничего не доступно в течение длительного времени — пользователь перестанет играть. Таким образом, лучше иметь пользователя-мошенника, чем вообще не иметь пользователя.
Ответ №3:
NSURL *url = [NSURL URLWithString:@"http://www.timeapi.org/utc/now"];
NSString *str = [[NSString alloc] initWithContentsOfURL:url usedEncoding:Nil error:Nil];
str = [str stringByReplacingOccurrencesOfString:@"T" withString:@" "];
str = [str stringByReplacingOccurrencesOfString:@" 01:00" withString:@""];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSDate *date = [dateFormat dateFromString:str];