Как я могу сбросить данные NSUserDefaults в симуляторе iPhone? - PullRequest
51 голосов
/ 22 мая 2009

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

Я пытался позвонить:

[NSUserDefaults resetStandardUserDefaults];

но это ничего не делает. Значения по умолчанию все еще сохранены и могут быть восстановлены.

Ответы [ 10 ]

99 голосов
/ 12 марта 2012

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

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

Для получения дополнительной информации о классе NSUserDefaults см. Документы Apple .

С другой стороны, если все, что вас интересует, это данные в симуляторе iOS, вы можете сделать это через Симулятор iOS> Сбросить содержимое и настройки .

enter image description here

51 голосов
/ 22 мая 2009

Самый простой способ - удалить приложение из симулятора - точно так же, как вы бы удалили его с реального телефона, нажав (нажав) и удерживая, пока значки не начнут вибрировать. Это удаляет все данные приложения, и при следующей установке из XCode это похоже на первый раз.

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

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

Другой способ - найти каталог, в котором установлена ​​копия симулятора, и удалить файл, содержащий настройки. Используйте это, чтобы найти приложение:

ls -ld ~/Library/Application\ Support/iPhone\ Simulator/User/Applications/*/*.app

Полный путь к вашему приложению будет содержать каталог с именем UUID. В этом каталоге найдите в библиотеке / Preferences файл настроек. Удалите это, и пользовательские настройки исчезнут.

6 голосов
/ 09 мая 2012

Вы можете узнать, что вы "написали" в userdefaults для приложения, все в файле удалить этот файл .plist работает:

user name/Library/Preferences/com.theAppYouAreHandling.plist
5 голосов
/ 16 октября 2015

В Swift 2.0 следующая 1 строка сбросит все NSUserDefaults для приложения:

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)

5 голосов
/ 23 мая 2009

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

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

Til Xcode 6 и iOS 8 Simulator расположение файла plist изменилось.

Я нашел * .plist в следующем каталоге:

[1] /Users/SOME-USERNAME/Library/Developer/CoreSimulator/Devices/SOME-DEVICE-ID/data/Library/Preferences/SP.UserDefaultsTest.plist

Удаление найденного файла из пути [1] вручную, и NSUserDefaults исчезли.

2 голосов
/ 28 мая 2017

В верхнем меню симулятора:

Simulator -> Reset Content and Settings...
2 голосов
/ 03 октября 2015

Вот быстрая версия:

let domainName = NSBundle.mainBundle().bundleIdentifier!       
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName)
0 голосов
/ 08 июля 2017

Если вы делаете это в юнит-тесте, вы можете сохранить состояние вашего приложения в текущем симуляторе, вместо того, чтобы по неосторожности стирать его каждый раз, когда вы также запускаете свои юнит-тесты. Один из способов сделать это - просто сохранить старые значения для домена приложения в setUp(), а затем восстановить их в tearDown():

class MyClass_Tests: XCTestCase {
    static let domainName = Bundle.main.bundleIdentifier!
    static var oldUserDefaults: [String : Any]?

    override class func setUp() {
        super.setUp()
        // Hang onto this so we don't inadvertently wipe the app's state while running tests.
        oldUserDefaults = UserDefaults.standard.persistentDomain(forName: domainName)
    }

    override class func tearDown() {
        // Restore the old values.
        UserDefaults.standard.setPersistentDomain(oldUserDefaults!, forName: domainName)
        super.tearDown()
    }

    override func setUp() {
        super.setUp()
        // Wipe the state for each test.
        UserDefaults.standard.removePersistentDomain(forName: MyClass_Tests.domainName)
    }

    override func tearDown() {
        super.tearDown()
    }
}
0 голосов
/ 01 октября 2014

Вы можете использовать метод removePersistentDomainForName , доступный в классе NSUserDefaults.

Синтаксис:

- (void)removePersistentDomainForName:(NSString *)domainName

Пример:

NSString *strAppBundleId = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:strAppBundleId];
...