NSUserDefault не может сохранять и загружать расширение в iOS8

Мне нужно сохранить данные в NSUserDefault на моей пользовательской клавиатуре iOS. Я успешно создал группы приложений и права на портале разработчиков и XCode.

Вот как я сохраняю свое значение с помощью UISwitch

- (IBAction)switchAction:(id)sender
{
    [self.defaults setBool:self.myKey.on forKey:@"myValue"];

    [self.defaults synchronize];
}

и вот как я загружаю значение в KeyboardView.

self.defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.customkeyboard"];

if([self.defaults boolForKey:@"myValue"])
{
    self.backgroundColor = [UIColor redColor];
}

else
{
    self.backgroundColor = [UIColor blackColor];
}

Это не работает и не загружает значение.

Как сохранить и загрузить данные?


person Fire Fist    schedule 16.06.2014    source источник


Ответы (3)


Инициализируйте свой объект NSUserDefaults таким образом во всех приложениях в группе приложений, и они будут совместно использовать базу данных:

[[NSUserDefaults alloc] initWithSuiteName:@"group identifier"];

Имейте в виду, что все из базы данных [NSUserDefaults standardUserDefaults] для каждого приложения не будет перенесено в эту базу данных.

документация указывает, что [NSUserDefaults standardUserDefaults] должна возвращать общую базу данных, как это делает приведенный выше код, однако это не так. Я зарегистрировал это как ошибку (rdar://17164758).

И не забудьте синхронизировать базу данных:

[yourDefaults synchronize];
person Andrew    schedule 16.06.2014
comment
Да, я делаю, как вы сказали, и он не загружается правильно. Вот мои коды. self.defaults = [[NSUserDefaults alloc] initWithSuiteName:@‹group.some.customkeyboard›]; if([self.defaults boolForKey:@myValue]) { self.backgroundColor = [UIColor redColor]; } еще { self.backgroundColor = [UIColor blackColor]; } - person Fire Fist; 16.06.2014
comment
@Sabo База данных начинается пустой, поэтому вам придется вызвать свой метод switchAction:, прежде чем будут установлены какие-либо значения. Также убедитесь, что ваши группы приложений правильно настроены в вашем файле прав, в вашем идентификаторе приложения портала разработчика, в вашем профиле подготовки и в Xcode. - person Andrew; 16.06.2014
comment
my SwitchAction — это событие соединения с UISwitch. Когда UISwitch включен, я сохраняю значение в NSUserDefault. Однако я не могу загрузить эти данные в KeyboardView. :( - person Fire Fist; 16.06.2014
comment
@Sabo Также убедитесь, что ваши группы приложений правильно настроены в вашем файле прав, в вашем идентификаторе приложения портала разработчика, в вашем профиле подготовки и в Xcode. Убедитесь, что вы используете initWithSuiteName:@"<group identifier>" как в расширении, так и в самом приложении. - person Andrew; 16.06.2014
comment
Да, я правильно настроил свой файл прав, потому что я вижу три настройки, которые отображаются в возможностях и моем файле прав. - person Fire Fist; 16.06.2014
comment
@Sabo Вы не можете доверять Xcode. Убедитесь, что вы используете initWithSuiteName:@‹идентификатор группы› как в расширении, так и в самом приложении. - person Andrew; 16.06.2014
comment
да. я везде использовал ваш код, например @‹com.mycompany.customkeyboard›. - person Fire Fist; 16.06.2014
comment
@Sabo Проверьте журналы консоли вашего устройства. Потенциально опубликуйте отрывок из этого, если это звучит важно. Любые проблемы с правами регистрируются в консоли, когда ваше приложение установлено на устройстве. Вы также должны попытаться проверить это в симуляторе. У другого пользователя похожая проблема. Вы также можете рассмотреть возможность повторной публикации кода в своем вопросе теперь, когда вы его изменили. - person Andrew; 16.06.2014
comment
@Sabo Удалите < и > из строки идентификатора вашей группы. Я имел в виду это просто как заполнитель. Эти персонажи, наверное, все портят :) - person Andrew; 16.06.2014
comment
@Manthan опубликовать новый вопрос. - person Andrew; 16.09.2014
comment
@SantaClaus:stackoverflow.com/questions/25867535/ - person Manthan; 16.09.2014
comment
Чтобы добавить к вашему ответу. Вы также должны установить RequestsOpenAccess = YES в Info.plist расширения приложения. Он должен идти в NSExtension->NSExtensionAttributes (вы должны создать его со словарем типов) -> RequestsOpenAccess (Boolean) == YES. Только после этого расширения моего приложения могли получить доступ к NSUserDefaults группы приложений. - person gladimdim; 02.11.2014

Итак, я осмотрелся, потому что у меня была точная проблема. Что я сделал, что сработало, так это добавил основное приложение и расширение в группу, перейдите в основной проект-> Цель-> Возможности и создайте группу (если у вас ее нет или все равно создайте ее) следующим образом:

введите здесь описание изображения

Затем перейдите к расширению под целью (E), снова в «Возможности» и добавьте расширение в группу (точно такую ​​же группу приложений, как и для основной цели), например:

введите здесь описание изображения

Затем, как только вы сделали и то, и другое, в своем основном приложении, всякий раз, когда вы хотите что-то добавить, создайте новый экземпляр NSUserDefaults, но для Suitename, равного имени группы, которое вы сделали ранее. Так:

NSArray *testing = @[@"first",@"Second",@"Third"];
NSUserDefaults *userd = [[NSUserDefaults alloc]initWithSuiteName:@"The gouprname I made earlier"];//This is exactly the same as the groupname
[userd setObject:testing forKey:@"ExtensionArray"];//set the object you want to share
[userd synchronize]; //It's a good idea to sync, just to be on the safe side.

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

NSUserDefaults *sharedD=[[NSUserDefaults alloc]initWithSuiteName:@"Exactly the same groupname that I gave both in the Capabilities and when initialising the userdefault"];
self.testing = [[NSArray alloc]initWithArray:[sharedD arrayForKey:@"ExtensionArray"]];

И вуаля! массив есть! Я где-то читал, что вы даже можете добавить функцию уведомления об изменении объекта, используя класс Wormhole, но я не могу найти ссылку на него. Я уверен, что если вы погуглите класс Wormhole, вы наткнетесь на него.

Я надеюсь, что смог помочь, и если вы нашли дополнительную информацию, пожалуйста, поделитесь ею со мной.

person Septronic    schedule 17.10.2015

Вы можете загрузить правильные данные из содержащего приложения, поэтому, возможно, поможет установка нового значения в приложении расширения.

[self.defaults setObject:newValue forKey:@"thisKeyIsJustUsedForSyn"]

А затем загрузите правильные данные.

person xionggai    schedule 21.06.2014