Как узнать, когда пользователь внес изменения в пакет настроек

Я позволяю пользователю вносить изменения в свои настройки в области настроек iphone. Во время следующей сетевой синхронизации я хотел бы отправить пользовательские изменения на сервер. Но только если изменения внесены.

Но как я узнаю, что пользователь внес изменения в область настроек?

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

Есть ли красивый и элегантный способ решения этой проблемы? Спасибо за помощь!

Прошла неделя, а ответов нет... Вопрос слишком сложный или вообще не имеет смысла?


person san    schedule 30.03.2011    source источник


Ответы (3)


Ах, глупый я! Здесь мы идем элегантным путем. Найдите AppPrefs в документации Apple в XCode, и он покажет пример приложения, которое делает именно то, что вы хотите сделать. Просто скомпилируйте и запустите! Он использует NSUserDefaultsDidChangeNotification.

Это код, используемый для регистрации наблюдателя:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(defaultsChanged:)
                                             name:NSUserDefaultsDidChangeNotification
                                           object:nil];

Старый ответ:

Не похоже, что вы можете получить дату модификации из файла NSUserDefaults. Пока я могу думать только так:

NSUserDefaults *previousDefaults = [someInstance previousUserDefaults];
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];

if([previousDefaults isEqualToDictionary:currentDefaults]) 
{
    [someOtherInstance sendModifiedUserDefaultsToServerWithDefaults:currentDefaults];
    [yetAnotherInstance saveModified]
}

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

person Nick Weaver    schedule 02.04.2011
comment
Хм. Что заставляет меня думать, что есть лучший способ, так это тот факт, что когда вы меняете настройки сети на своем iphone, он автоматически пытается найти и подключиться к нему. Это должно означать, что изменение настроек пользователя вызвало действие. Для меня это тоже было бы хорошим решением. Как они это делают? - person san; 03.04.2011
comment
Вот оно, элегантное и простое решение проблемы. - person Nick Weaver; 03.04.2011
comment
Ах, да! Это круто. Но это вызывает любое изменение настроек. Есть ли способ действовать только при изменении определенного свойства? - person san; 03.04.2011
comment
Я думаю, что мы находимся на дне возможностей здесь. Пожалуйста, посмотрите справочник класса NSUserDefaults, он не показал мне ничего более полезного. Но если вы найдете способ, сообщите нам об этом здесь. - person Nick Weaver; 03.04.2011
comment
@Не думаю. В любом случае, пользовательские значения по умолчанию относятся к песочнице и поэтому могут быть изменены только самим приложением. - person Nick Weaver; 23.05.2014

Дело не в том, что вопрос слишком сложный, просто нет простого способа сделать то, что вы просите. NSUserDefaults не записывает дату «последнего изменения» для настроек каждого приложения, по крайней мере, насколько я могу судить, поэтому, если пользователь меняет некоторые настройки с помощью приложения «Настройки», нет хорошего способа обнаружить это, кроме как посмотреть на все настройки.

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

person Caleb    schedule 02.04.2011
comment
Спасибо, Калеб. Я не хочу слишком усложнять свое решение. Я удивлен, что не было необходимости в чем-то подобном и что в библиотеке нет ничего, чтобы поддержать идею, например, реагировать на изменение пользовательских настроек. - person san; 03.04.2011
comment
Обычно приложению все равно, изменились ли его настройки в последнее время — оно считывает их из системы значений по умолчанию всякий раз, когда они ему нужны, поэтому, если что-то изменилось, приложение автоматически получает новое значение. Кроме того, NSUserDefaults исходит из MacOS X, и в этом контексте предполагается, что пользователь может удалить файл настроек приложения без каких-либо побочных эффектов; приложение должно просто вернуться к своим встроенным значениям по умолчанию. Даже на iOS я бы не стал хранить важную информацию в системе по умолчанию. - person Caleb; 03.04.2011

Быстрый

Наблюдайте за изменениями и вызывайте метод при изменении:

NotificationCenter.default.addObserver(
    self,
    selector: #selector(updateStateFromSettingsBundle),
    name: UserDefaults.didChangeNotification,
    object: nil
)
@objc func updateStateFromSettingsBundle() {}
person Mojtaba Hosseini    schedule 06.11.2020