Как мне сохранить постоянные данные

#ios #objective-c #in-app-purchase #plist

#iOS #objective-c #покупка в приложении #список

Вопрос:

Я новичок в разработке iOS, и у меня следующая проблема.

ОБЪЯСНЕНИЕ: У меня есть приложение, которое состоит из нескольких мини-игр. Каждая мини-игра доступна при покупке в приложении. Однако доступность мини-игры сохраняется в переменной BOOL, подобной этой:

  _miniGamesArray = [[NSMutableArray alloc] init]; 
 NSMutableDictionary *mutDictMg0 = [NSMutableDictionary dictionaryWithCapacity:3];
 [mutDictMg0 setValue:[self.gameAvailabilityMutableArray objectAtIndex:0] forKey:@"GameAvailable"];
[_miniGamesArray addObject:mutDictMg0];
  

ПРОБЛЕМА:

Каждый раз, когда я запускаю приложение, доступность игры проверяется с помощью self.gameAvailabilityMutableArray , для которого установлено значение:

 - (NSMutableArray *)gameAvailabilityMutableArray
{
    if (!_gameAvailabilityMutableArray)
    {
        //[_gameAvailabilityMutableArray addObjectsFromArray:@[@1,@0,@0,@0    ,@0,@0,@0,@0]];
        _gameAvailabilityMutableArray = [[NSMutableArray alloc] initWithArray:@[@1,@1,@1,@1    ,@1,@1,@1,@1]];


    }
    return _gameAvailabilityMutableArray;
}
  

Когда клиент покупает мини-игру, я хочу, чтобы массив был установлен в (пример):

  @[@1,@1,@0,@0    ,@0,@0,@0,@0]]
  

ПРОБОВАННЫЕ РЕШЕНИЯ:
Я попытался реализовать массив, вызвав сервер iTunes и записав данные. Однако время получения запроса превышает время загрузки приложения. Вторая проблема возникает, если нет подключения к Интернету, тогда приложение выходит из строя.

Я также пробовал использовать файлы .plist. Я не знаю почему, но запись в файл plist не меняет его статус постоянно! Иногда это работает, иногда нет… Иногда приложение загружает значения правильно, иногда оно смешивает их с последними значениями.

ВОПРОС:

Есть ли способ сохранить постоянные данные приложения, которые проверяются при загрузке приложения рядом со списками?

Спасибо, что уделили мне время.

Комментарии:

1. Я бы сохранил это в core data. Значения NSUserDefault могут быть изменены пользователем вручную, чтобы он мог разблокировать мини-игры без покупки.

2. Будут ли данные, хранящиеся через core data, сохраняться после перезапуска приложения / устройства? Я пока не использовал core data, поэтому ничего об этом не знаю.

3. Да, core data является координатором постоянного хранилища. Смотрите: developer.apple.com/library/ios/documentation/DataManagement /…

4. как вы написали .plist файл? вы правильно их архивировали и разархивировали?

5. @CW0007007, CoreData по-прежнему можно обновлять вручную вне кода (например, с помощью любого редактора базы данных SQLite), я бы рекомендовал использовать связку ключей для хранения такой информации.

Ответ №1:

   save your data in NSUserDefaults.then use below conditions for app start first time or handle another conditions.

 BOOL iSFirstTime = [[NSUserDefaults standardUserDefaults] boolForKey:@"AppStartFirstTime"];
    if (!iSFirstTime) {
        NSLog(@"Application start first time");
        [[NSUserDefaults standardUserDefaults] setValue:@"ImgDownloaded" forKey:@"ProductIDDef"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"AppStartFirstTime"];
    }else{
        //   NSLog(@"we are here");
        if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"ProductIDDef"] isEqualToString:@"ImgDownloaded"]) {
            NSLog(@"All transaction and Image Downloading has been perform successfully");
        }else{
//If any network problem or any thing else then handle here.
        }

    }

}
  

Комментарии:

1. Я бы попробовал это, но поскольку @CW0007007 сказал «Значения NSUserDefault могут быть изменены пользователем вручную, чтобы они могли разблокировать мини-игры без покупки». Я не уверен, сможет ли пользователь легко разблокировать мини-игры. Это настолько небезопасно?

2. если вы хотите повысить безопасность, тогда используйте технологию шифрования данных. NSUserDefault — это словарь. которые находятся на вашем app.so , на мой взгляд, это нелегко доступно.

3. если вы создадите ipa, то как вы сможете получить доступ к словарному значению app?

4. В итоге это оказалось самым быстрым и оптимальным решением. Это работает как по волшебству. Я пробовал с core data, но столкнулся с множеством проблем.

Ответ №2:

Вы можете сохранить данные в NSUserDefaults, используя следующий код:

        [[NSUserDefaults standardUserDefaults] setObject:_gameAvailabilityMutableArray forKey:@"gameArray"];
       [[NSUserDefaults standardUserDefaults] synchronise];
  

и вы можете извлечь массив с помощью

_gameAvailabilityMutableArray = [[NSUserDefaults standardUserDefaults] objectForKey:@»gameArray»];

Комментарии:

1. Я бы попробовал это, но поскольку @CW0007007 сказал «Значения NSUserDefault могут быть изменены пользователем вручную, чтобы они могли разблокировать мини-игры без покупки». Я не уверен, сможет ли пользователь легко разблокировать мини-игры. Это настолько небезопасно?

2. Я думаю, конечный пользователь не сможет разблокировать, но пользователь с взломанным iDevice может это сделать.

3. Это очень помогло в настройке и сохранении. Ty. Отлично работает.