iCloud позволяет пользователям «красть» расходные материалы в приложении - PullRequest
7 голосов
/ 16 октября 2011

В моем приложении пользователи покупают расходные материалы, скажем, чемоданы, которые хранятся в Базовых данных.Когда пользователь впервые устанавливает приложение, я даю ему бесплатную возможность начать работу.Приложение не может функционировать без установки хотя бы одного чемодана.

Но если пользователь устанавливает приложение на свой iPhone, а затем на iPad и синхронизирует их, у них теперь есть 2 чемодана.И если они удаляют приложение на любом устройстве, а затем переустанавливают и синхронизируют его, они только что получили дополнительное и могут делать это бесконечно.

Я вижу два решения, но ни одно из них не кажется правильным:

  1. Добавить значение в NSUbiquityKeyValueStore, когда пользователь впервые синхронизируется с iCloud.Проверьте это значение при первом запуске.Если это ноль, создайте халяву, если нет, синхронизируйте данные.Но это создает проблему.Что делать, если пользователь отключает iCloud или не имеет подключения к Интернету при первом запуске.Приложение создаст халяву, затем, когда iCloud будет доступен, синхронизирует дубликат, и они смогут делать это столько раз, сколько захотят.

  2. Каким-то образом соответствуют элементы по умолчанию в каждом приложении.У меня была идея сопоставления идентификаторов объектов или временных меток, но они бы различались, и я не уверен, как с этим справиться.

Кто-нибудь знает, что я мог с этим поделать?

РЕДАКТИРОВАТЬ:

Использование предварительно упакованной базы данных плюс migratePersistentStore: toURL: options: withType: error: кажется, путь.Выложу ответ с кодом, если он у меня работает.

Ответы [ 3 ]

3 голосов
/ 16 октября 2011

Если вы не проверяете квитанции и не отслеживаете, что у пользователей расходных материалов есть на ваших собственных серверах, вы делаете это неправильно.Вы в основном доверяете пользователю, чтобы он был порядочным и честным, что, как правило, всегда плохая идея.

Когда вы используете расходные материалы в приложении, вы должны вести журнал на том же сервере, что и ваши пользователи.,Таким образом, каждый раз, когда ваше приложение запускается, оно может проверить на сервере наличие ожидаемого количества расходных материалов.

1 голос
/ 16 октября 2011

Использование iCloud подразумевает подключение к сети.Как только устройство подключается к сети, вы можете проверить квитанции и журнал потребления расходных материалов на ваших собственных серверах.

0 голосов
/ 23 ноября 2011

Лучшее решение для этого, на мой взгляд, заключается в хранении UDID в массиве в iCloud UbiquitousKeyValueStore.

//Store UDID in iCloud
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 5.0) {
    if ([[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) {
        NSUbiquitousKeyValueStore *store = [NSUbiquitousKeyValueStore defaultStore];

        //Get array
        NSMutableArray *devices = [NSMutableArray arrayWithArray:[store arrayForKey:@"UDID"]];
        [devices addObject:[[UIDevice currentDevice] uniqueIdentifier]];

        //Create new array, set to kvstore
        NSArray *newDevices = [NSArray arrayWithArray:devices];
        [store setArray:newDevices forKey:@"UDID"];
        [store synchronize];
    }
}

...

   //Check if app already installed on device
   NSArray *devices = [[NSUbiquitousKeyValueStore defaultStore] arrayForKey:@"UDID"];

    for (NSString *UDID in devices) {
        if ([UDID isEqualToString:[[UIDevice currentDevice] uniqueIdentifier]]) {
              //stop the giveaway
        }
    }
...