#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. Отлично работает.